ক্যাসান্দ্রা ব্যবহারকারীদের জন্য ক্লাউড বিগটেবল

1. ভূমিকা

যারা Apache Cassandra থেকে Google Cloud Bigtable-এ প্রশ্ন স্থানান্তর করছেন তাদের জন্য এই কোডল্যাবটি একটি গাইড।

এই কোডল্যাবে আপনি পাবেন

  • ক্লাউড বিগটেবল এমুলেটর ব্যবহার করুন
  • একটি টাইমসিরিজ ব্যবহার কেস অন্বেষণ করুন
  • একটি টেবিল এবং কলাম পরিবার তৈরি করুন
  • CQL সন্নিবেশ, আপডেট, নির্বাচন এবং মুছে ফেলার ক্লাউড বিগটেবল জাভা সমতুল্য শিখুন

আপনি Google ক্লাউড প্ল্যাটফর্ম ব্যবহার করার সাথে আপনার অভিজ্ঞতাকে কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধুমাত্র মাধ্যমে এটি পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

2. সেট আপ করুন

আপনি মূল ধারণাগুলি দ্রুত বোঝার জন্য কয়েকটি সারি সহ একটি নমুনা ডেটাসেট দেখবেন।

ক্যাসান্ড্রা

সমতুল্য ক্যাসান্দ্রা প্রশ্নগুলি প্রতিটি ধাপে উপস্থিত থাকবে, তাই আপনি চাইলে স্থানীয় ক্লাস্টারে অনুসরণ করতে দ্বিধা বোধ করুন, অথবা আপনি দ্রুত একটি ক্লিক-টু-ডিপ্লয় ক্যাসান্দ্রা ক্লাস্টার এবং SSH সেট আপ করতে পারেন।

আপনি যদি অনুসরণ করেন তবে একটি কীস্পেস তৈরি করুন এবং এটি ব্যবহার করুন। প্রতিলিপি কৌশল এখানে গুরুত্বপূর্ণ হবে না.

cqlsh> create keyspace mykeyspace with replication = {'class':'SimpleStrategy','replication_factor' : 2};
cqlsh> use mykeyspace;

ক্লাউড বিগটেবল

আপনার টেবিলের জন্য আপনার একটি ক্লাউড বিগটেবল উদাহরণের প্রয়োজন হবে। আপনি এমুলেটর ব্যবহার করে বিনামূল্যে একটি স্থানীয় উদাহরণ সেট আপ করতে পারেন। আপনাকে ক্লাউড বিগটেবলে একটি কীস্পেস তৈরি করতে হবে না, আপনার প্রতিলিপিটি আপনার ইনস্ট্যান্স কনফিগারেশন দ্বারা পরিচালিত হয়।

এমুলেটর শুরু করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

gcloud beta emulators bigtable start

তারপর অন্য শেল উইন্ডো বা ট্যাবে এই কমান্ডের সাহায্যে এমুলেটর পরিবেশ পরিবর্তনশীল সেট করুন:

$(gcloud beta emulators bigtable env-init) #Sets BIGTAB`LE_EMULATOR_HOST

তারপরে একটি জাভা প্রকল্প তৈরি করুন যা আপনি কোড উদাহরণগুলি চালানোর জন্য ব্যবহার করবেন এবং ক্লাউড বিগটেবল ক্লায়েন্টকে Maven, Gradle বা SBT-এর সাথে আমদানি করুন ৷ তারপরে একটি নতুন জাভা ফাইলে ডেটা ক্লায়েন্টের সাথে একটি সংযোগ তৈরি করুন।

BigtableDataSettings settings =
    BigtableDataSettings.newBuilder().setProjectId(projectId).setInstanceId(instanceId).build();

try {
  dataClient = BigtableDataClient.create(settings);
} catch (Exception e) {
  System.out.println("Error during data client connection: \n" + e.toString());
}

3. টেবিল তৈরি

ক্যাসান্দ্রা এবং ক্লাউড বিগটেবল উভয় টেবিলেই, প্রতিটি সারির সাথে একটি কী যুক্ত থাকে। ক্যাসান্ড্রা কীগুলির একটি পার্টিশন কী এবং ক্লাস্টারিং কলাম রয়েছে যা আলাদা বা ওভারল্যাপ হতে পারে। ক্লাউড বিগটেবল কীগুলির সম্পূর্ণটি বিভক্ত (পার্টিশন) এবং অর্ডার করার জন্য ব্যবহৃত হয়। প্রাথমিক/সারি কী নির্মাণের ক্ষেত্রে এই দুটি সিস্টেম অবিশ্বাস্যভাবে একই রকম। উভয় সিস্টেমই মূলত আভিধানিকভাবে সাজানো তালিকা যেখানে কীগুলি নোডের মধ্যে সারি বিতরণের প্রধান ফর্ম হিসাবে কাজ করে। বেশিরভাগ ক্ষেত্রে আপনি ক্লাউড বিগটেবলের জন্য একই কী পুনরায় ব্যবহার করতে পারেন।

এই কোডল্যাবে, আপনি ক্লাউড বিগটেবল ব্যবহার করবেন মোবাইল ফোন এবং মোবাইল ট্যাবলেট সম্পর্কে টাইম সিরিজ ডেটা সঞ্চয় করতে ( বিগটেবল ট্যাবলেটের সাথে বিভ্রান্ত হবেন না।) নীচে টেবিল তৈরি করার নির্দেশাবলী রয়েছে।

ক্যাসান্ড্রা

cqlsh:mykeyspace> create table mobileTimeSeries (
           deviceid text,
           devicetype text,
           date date,
           connected_cell map<timestamp,Boolean>, 
           os_build text, 
           os_name text,
           PRIMARY KEY((devicetype, deviceid), date));

ক্লাউড বিগটেবল

আপনি Java ক্লায়েন্ট ব্যবহার করে একটি টেবিল এবং কলাম পরিবার তৈরি করতে পারেন, তবে cbt টুলের সাথে নিম্নলিখিত কমান্ডটি ব্যবহার করা সবচেয়ে সহজ:

cbt createtable mobile-time-series families=stats_summary

ক্লাউড বিগটেবল একটি NoSQL ডাটাবেস, তাই আপনাকে টেবিল তৈরির সময় একটি স্কিমা সংজ্ঞায়িত করতে হবে না, তবে আপনি যে প্রশ্নগুলি চালাতে যাচ্ছেন সেগুলি সম্পর্কে চিন্তা করতে এবং তাদের জন্য সারি কীটি অপ্টিমাইজ করতে চাইবেন৷

কী মাইগ্রেশনের জন্য সবচেয়ে সাধারণ কৌশল হল সমস্ত পার্টিশন কী এবং ক্লাস্টারিং কলাম নেওয়া এবং ক্লাউড বিগটেবল সারি কী প্রতিনিধিত্ব করে একটি স্ট্রিং তৈরি করতে তাদের সাথে যোগ দেওয়া। আমরা সাধারণত স্ট্রিং-ভিত্তিক কী ব্যবহার করার পরামর্শ দিই কারণ তারা কী ভিজ্যুয়ালাইজারের মাধ্যমে কী বিতরণ ডিবাগ করতে সাহায্য করে। পঠনযোগ্যতার সাথে সাহায্য করার জন্য আপনি কলামের মানগুলির মধ্যে একটি হ্যাশ '#' এর মতো একটি বিভাজক ব্যবহার করতে পারেন।

এই উদাহরণে আমরা "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYMMDD]" এর একটি রোকি ব্যবহার করব

4. সন্নিবেশ

ক্যাসান্দ্রা এবং ক্লাউড বিগটেবলের মধ্যে সন্নিবেশগুলি মোটামুটি একই রকম। এখানে আপনি "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYMMDD]" এর একটি রোকি ব্যবহার করে একটি সারি এবং তারপর একাধিক সারি ঢোকাবেন৷

ক্যাসান্ড্রা

একক

cqlsh:mykeyspace> insert into mobileTimeSeries (deviceid, devicetype, date, connected_cell, os_build) values ('4c410523', 'phone',toDate(now()), {toTimeStamp(now()): true}, 'PQ2A.190405.003');

ব্যাচ

cqlsh:mykeyspace> BEGIN BATCH
insert into mobileTimeSeries (deviceid, devicetype, date, os_name, os_build) values ('a0b81f74', 'tablet', '2019-01-01', 'chromeos', '12155.0.0-rc1');
insert into mobileTimeSeries (deviceid, devicetype, date, os_name, os_build) values ('a0b81f74', 'tablet', '2019-01-02','chromeos', '12145.0.0-rc6');
APPLY BATCH;

ক্লাউড বিগটেবল

একক

আপনি যে সারি কী এবং ডেটা ব্যবহার করতে চান তা দিয়ে একটি মিউটেশন তৈরি করুন, তারপর ডেটা ক্লায়েন্টের সাথে মিউটেশন প্রয়োগ করুন। আপনি একটি ফোনের জন্য তার সেল সংযোগ এবং অপারেটিং সিস্টেম সম্পর্কে তথ্য সহ ডেটার একটি সারি যুক্ত করবেন৷

try {
  System.currentTimeMillis();
  long timestamp = (long) 1556712000 * 1000; // Timestamp of June 1, 2019 12:00

  String rowKey = "phone#4c410523#20190501";
  ByteString one = ByteString.copyFrom(new byte[] {0, 0, 0, 0, 0, 0, 0, 1});

  RowMutation rowMutation =
      RowMutation.create(tableId, rowKey)
          .setCell(
              COLUMN_FAMILY_NAME,
              ByteString.copyFrom("connected_cell".getBytes()),
              timestamp,
              one)
          .setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "PQ2A.190405.003");

  dataClient.mutateRow(rowMutation);
} catch (Exception e) {
  System.out.println("Error during Write: \n" + e.toString());
}

ব্যাচ

একটি বাল্কমিউটেশন অবজেক্টে একাধিক মিউটেশন সংজ্ঞায়িত করুন, তারপর একটি API কলের সাথে সমস্ত মিউটেশন প্রয়োগ করতে ডেটা ক্লায়েন্ট ব্যবহার করুন। আপনি একটি মোবাইল ট্যাবলেটের অপারেটিং সিস্টেমের নাম এবং সংস্করণ সম্পর্কে কয়েক দিনের ডেটা যোগ করবেন৷

try {
  long timestamp = (long) 1556712000 * 1000; // Timestamp of June 1, 2019 12:00

  BulkMutation bulkMutation =
      BulkMutation.create(tableId)
          .add(
              "tablet#a0b81f74#20190501",
              Mutation.create()
                  .setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "chromeos")
                  .setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "12155.0.0-rc1"))
          .add(
              "tablet#a0b81f74#20190502",
              Mutation.create()
                  .setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "chromeos")
                  .setCell(COLUMN_FAMILY_NAME, "os_build", timestamp, "12155.0.0-rc6"));

  dataClient.bulkMutateRows(bulkMutation);
} catch (Exception e) {
  System.out.println("Error during WriteBatch: \n" + e.toString());
}

5. আপডেট

এখানে আপনি এমন একটি ঘর আপডেট করবেন যা এখনও লেখা হয়নি এবং তারপরে আগের সংস্করণগুলি রেখে একটি ঘরে একটি নতুন মান লিখবেন৷

ক্যাসান্ড্রা

কোষ যোগ করা হচ্ছে

cqlsh:mykeyspace> UPDATE mobileTimeSeries SET os_name = 'android' WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-06';

সেল আপডেট করা হচ্ছে

cqlsh:mykeyspace> UPDATE mobileTimeSeries SET connected_cell = connected_cell +  {toTimeStamp(now()): false} WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-06';

ক্লাউড বিগটেবল

ক্লাউড বিগটেবলে, আপনি আপডেটগুলিকে লেখার মতোই ব্যবহার করতে পারেন।

কোষ যোগ করা হচ্ছে

এটি ঘর লেখার মতোই, শুধু একটি কলাম প্রদান করুন যা আপনি আগে লেখেননি৷ এখানে আপনি ফোনের সারিতে অপারেটিং সিস্টেমের নাম যোগ করবেন।

try {
  long timestamp = (long) 1556713800 * 1000; // Timestamp of June 1, 2019 12:30

  String rowKey = "phone#4c410523#20190501";

  RowMutation rowMutation =
      RowMutation.create(tableId, rowKey)
          .setCell(COLUMN_FAMILY_NAME, "os_name", timestamp, "android");

  dataClient.mutateRow(rowMutation);
} catch (Exception e) {
  System.out.println("Error during update: \n" + e.toString());
}

সেল আপডেট করা হচ্ছে

এখানে আপনি ফোনের সেল সংযোগের স্থিতি সম্পর্কে একটি নতুন ডেটা যোগ করবেন৷ আপনি আপনার টাইম সিরিজ ডেটার অংশ সহজেই সংরক্ষণ করতে সেল সংস্করণ ব্যবহার করতে পারেন। শুধু আপনার লেখার জন্য একটি টাইমস্ট্যাম্প প্রদান করুন এবং আপনি সেলের জন্য একটি নতুন সংস্করণ যোগ করবেন৷ আপনার ডেটা পরিষ্কার করতে, আপনি একটি নির্দিষ্ট সংখ্যা বা নির্দিষ্ট সময়ের পরে সংস্করণগুলি মুছে ফেলার জন্য আবর্জনা সংগ্রহ ব্যবহার করতে পারেন।

try {
  long timestamp = (long) 1556713800 * 1000; // Timestamp of June 1, 2019 12:30

  String rowKey = "phone#4c410523#20190501";

  ByteString zero = ByteString.copyFrom(new byte[] {0, 0, 0, 0, 0, 0, 0, 0});

  RowMutation rowMutation =
      RowMutation.create(tableId, rowKey)
          .setCell(
              COLUMN_FAMILY_NAME,
              ByteString.copyFrom("connected_cell".getBytes()),
              timestamp,
              zero);

  dataClient.mutateRow(rowMutation);
} catch (Exception e) {
  System.out.println("Error during update2: \n" + e.toString());
}

6. নির্বাচন করে

এখন, আপনি টেবিলে লেখা ডেটা পুনরুদ্ধার করবেন। CQL নির্বাচন বিবৃতি স্থানান্তর করার সময় আপনাকে নির্বাচিত বিবৃতিগুলির বিভিন্ন দিক বিবেচনা করতে হবে যেমন কলাম, যেখানে ধারাগুলি ফিল্টার করা, এবং সীমাবদ্ধ এবং সমষ্টি ফাংশন যেমন গ্রুপ দ্বারা। এখানে, আপনি মৌলিক ধারণা পেতে দুটি সাধারণ নির্বাচনী বিবৃতি দেখবেন, কিন্তু নির্বাচনের বিষয়ে আরও তথ্যের জন্য ডকুমেন্টেশন দেখতে পারেন। ক্লাউড বিগটেবলে দুটি ধরণের পুনরুদ্ধার অপারেশন রয়েছে: পান এবং স্ক্যান করুন। একটি সারি পুনরুদ্ধার পান যখন স্ক্যান সারিগুলির পরিসর পুনরুদ্ধার করে।

ক্যাসান্ড্রা

একক

cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='phone' AND deviceid = '4c410523' AND date = '2019-09-04';

একাধিক

cqlsh:mykeyspace> SELECT * FROM mobileTimeSeries WHERE devicetype='tablet' AND deviceid = 'a0b81f74' AND date >= '2019-09-04';

ক্লাউড বিগটেবল

একক

নির্দিষ্ট তারিখে একটি নির্দিষ্ট ফোনের জন্য ডেটা পেতে একটি সারি লুকআপ ব্যবহার করুন যা সমস্ত এক সারির মধ্যে রয়েছে। এটি মানগুলির প্রতিটি টাইমস্ট্যাম্পযুক্ত সংস্করণ ফিরিয়ে দেবে, তাই আপনাকে বিভিন্ন টাইমস্ট্যাম্পে connected_cell এর জন্য দুটি লাইন দেখতে হবে।

try {
  String rowKey = "phone#4c410523#20190501";

  Row row = dataClient.readRow(tableId, rowKey);
  for (RowCell cell : row.getCells()) {

    System.out.printf(
        "Family: %s    Qualifier: %s    Value: %s    Timestamp: %s%n",
        cell.getFamily(),
        cell.getQualifier().toStringUtf8(),
        cell.getValue().toStringUtf8(),
        cell.getTimestamp());
  }
} catch (Exception e) {
  System.out.println("Error during lookup: \n" + e.toString());
}

একাধিক

একাধিক সারি জুড়ে বিস্তৃত একটি নির্দিষ্ট মোবাইল ট্যাবলেটের জন্য এক মাসের ডেটা দেখতে একটি রেঞ্জ স্ক্যান ব্যবহার করুন৷ আপনি কেবলমাত্র ডেটার নির্দিষ্ট সংস্করণ পেতে বা মানগুলিতে ফিল্টার করতে এর সাথে একটি ফিল্টার ব্যবহার করতে পারেন।

try {
  Query query = Query.create(tableId).range("tablet#a0b81f74#201905", "tablet#a0b81f74#201906");
  ServerStream<Row> rowStream = dataClient.readRows(query);
  for (Row row : rowStream) {
    System.out.println("Row Key: " + row.getKey().toStringUtf8());
    for (RowCell cell : row.getCells()) {

      System.out.printf(
          "Family: %s    Qualifier: %s    Value: %s    Timestamp: %s%n",
          cell.getFamily(),
          cell.getQualifier().toStringUtf8(),
          cell.getValue().toStringUtf8(),
          cell.getTimestamp());
    }
  }
} catch (Exception e) {
  System.out.println("Error during scan: \n" + e.toString());
}

7. মুছে দেয়

এখানে আপনি আপনার টেবিলে রাখা ডেটা মুছে ফেলবেন। প্রথমে আপনি একটি পৃথক সারি মুছে ফেলবেন, তারপর আপনি একাধিক সারি মুছে ফেলবেন।

Cassandra's CQL সমস্ত প্রাথমিক কলাম নির্দিষ্ট করা হলে একক সারি মুছে ফেলার পাশাপাশি পরিসীমা অপসারণের অনুমতি দেয়। আপনি বিগটেবলের সাথে একটি পরিসর স্ক্যান করে তারপর সারি স্তর মুছে ফেলার মাধ্যমে এটি করতে পারেন। মনে রাখবেন যে আপনি একই ফলাফল পাবেন, তবে আরও অপারেশন থাকবে যেহেতু প্রতিটি মুছে ফেলার নিজস্ব অপারেশন হবে।

ক্যাসান্ড্রা

একক

cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='phone' and deviceid = '4c410523';

একাধিক

cqlsh:mykeyspace> DELETE from mobileTimeSeries where devicetype='tablet' and deviceid = 'a0b81f74';

ক্লাউড বিগটেবল

একক

এখানে আপনি একটি নির্দিষ্ট ফোন এবং তারিখের ডেটা মুছে ফেলবেন। একবারে একটি সারি মুছতে সারি কী ব্যবহার করুন।

try {
  String rowKey = "phone#4c410523#20190501";

  RowMutation mutation = RowMutation.create(tableId, rowKey).deleteRow();

  dataClient.mutateRow(mutation);
} catch (Exception e) {
  System.out.println("Error during Delete: \n" + e.toString());
}

একাধিক

এখানে আপনি একটি নির্দিষ্ট মোবাইল ট্যাবলেটের জন্য সমস্ত ডেটা মুছে ফেলবেন৷ একাধিক সারি মুছে একটি CQL-কোয়েরি স্থানান্তর করতে, আপনাকে একটি স্ক্যান করতে হবে এবং তারপর সারি কীগুলির ফলাফল সেট ব্যবহার করে প্রতিটি সারি মুছে ফেলতে হবে।

try {
  Query query = Query.create(tableId).prefix("tablet#a0b81f7");
  ServerStream<Row> rowStream = dataClient.readRows(query);
  BulkMutation bulkMutation = BulkMutation.create(tableId);
  for (Row row : rowStream) {
    bulkMutation.add(row.getKey(), Mutation.create().deleteRow());
  }

  dataClient.bulkMutateRows(bulkMutation);
} catch (Exception e) {
  System.out.println("Error during DeleteMultiple: \n" + e.toString());
}

8. শেষ করা

পরিষ্কার করুন

ক্যাসান্ড্রা

আপনি যদি এটির সাথে অনুসরণ করার জন্য একটি ক্যাসান্ড্রা ক্লাস্টার তৈরি করেন তবে এটিকে আপনি স্বাভাবিকভাবে মুছে ফেলতে দ্বিধা বোধ করবেন না।

ক্লাউড বিগটেবল

আপনি যদি একটি বিদ্যমান ক্লাউড বিগটেবল উদাহরণে আপনার টেবিল তৈরি করেন তবে আপনি এটি cbt কমান্ড দিয়ে মুছে ফেলতে পারেন

cbt deletetable mobile-time-series

আপনি যদি এমুলেটরটি ব্যবহার করেন তবে আপনি যে টার্মিনালে এটি শুরু করেছেন সেখানে CTRL-C লিখে সমস্ত কাজ পরিষ্কার করার জন্য এমুলেটরটিকে থামাতে পারেন।

পরবর্তী পদক্ষেপ