कैसंड्रा के उपयोगकर्ताओं के लिए Cloud Bigtable

1. परिचय

यह कोडलैब उन लोगों के लिए गाइड है जो Apache Cassandra से Google Cloud Bigtable पर क्वेरी को माइग्रेट कर रहे हैं.

इस कोडलैब में, आपको

  • Cloud Bigtable एम्युलेटर का इस्तेमाल करना
  • टाइम सीरीज़ के इस्तेमाल के उदाहरण देखें
  • टेबल और कॉलम फ़ैमिली बनाना
  • CQL Insert, अपडेट, चुनें, और Delete के Cloud Bigtable के Java के बारे में जानें

Google Cloud Platform इस्तेमाल करने का आपका अनुभव कैसा रहा?

शुरुआती इंटरमीडिएट कुशल

इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?

इसे सिर्फ़ पढ़ें इसे पढ़ें और कसरतों को पूरा करें

2. सेट अप करें

आपको सिर्फ़ कुछ पंक्तियों वाला सैंपल डेटासेट दिखेगा, ताकि आप मुख्य सिद्धांतों को जल्दी से समझ सकें.

कैसांद्रा

हर चरण में कैसंड्रा की मिलती-जुलती क्वेरी मौजूद होंगी. इसलिए, अगर आप चाहें, तो किसी लोकल क्लस्टर पर भी जाएं. इसके अलावा, इसमें क्लिक-टू-डिप्लॉयमेंट के लिए, Cassandra क्लस्टर को तुरंत सेट अप और एसएसएच (SSH) में भी किया जा सकता है.

अगर आपको इसे फ़ॉलो करना है, तो एक कीस्पेस बनाएं और उसका इस्तेमाल करें. यहां रेप्लिकेशन की रणनीति ज़रूरी नहीं होगी.

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

Cloud Bigtable

आपको अपनी टेबल के लिए, Cloud Bigtable के इंस्टेंस की ज़रूरत होगी. एम्युलेटर का इस्तेमाल करके, एक लोकल इंस्टेंस को मुफ़्त में सेट अप किया जा सकता है. आपको Cloud Bigtable में एक कीस्पेस बनाने की ज़रूरत नहीं होगी. आपके इंस्टेंस कॉन्फ़िगरेशन को रेप्लिकेशन (रेप्लिकेशन) मैनेज किया जाता है.

एम्युलेटर को चालू करने के लिए, यहां दिया गया निर्देश इस्तेमाल करें:

gcloud beta emulators bigtable start

इसके बाद, किसी अन्य शेल विंडो या टैब में, एम्युलेटर एनवायरमेंट वैरिएबल को इस कमांड से सेट करें:

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

इसके बाद, एक Java प्रोजेक्ट बनाएं जिसका इस्तेमाल आपको कोड के उदाहरणों को चलाने के लिए करना होगा. साथ ही, Maven, Gradle या SBT की मदद से Cloud Bigtable क्लाइंट को इंपोर्ट करना होगा. इसके बाद, एक नई Java फ़ाइल में, डेटा क्लाइंट से कनेक्शन बनाएं.

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. टेबल बनाने की सुविधा

कसांद्रा और Cloud Bigtable दोनों टेबल में, हर पंक्ति के साथ एक कुंजी जुड़ी हुई है. कैसंड्रा कुंजियों में पार्टिशन कुंजी और क्लस्टरिंग कॉलम होता है, जो अलग-अलग हो सकते हैं या ओवरलैप हो सकते हैं. Cloud Bigtable की पूरी कुंजियों का इस्तेमाल स्प्लिट (पार्टिशन) और ऑर्डर करने के लिए किया जाता है. प्राइमरी/लाइन की कुंजी बनाने के मामले में, ये दोनों सिस्टम काफ़ी हद तक एक जैसे हैं. दोनों सिस्टम मूल रूप से शब्दों की सूची को क्रम से लगाते हैं. इसमें कुंजियां नोड के बीच पंक्ति डिस्ट्रिब्यूशन के लिए मुख्य रूप से काम करती हैं. ज़्यादातर मामलों में, Cloud Bigtable के लिए एक ही कुंजी का फिर से इस्तेमाल किया जा सकता है.

इस कोडलैब में, मोबाइल फ़ोन और मोबाइल टैबलेट के बारे में टाइम सीरीज़ का डेटा सेव करने के लिए, Cloud Bigtable का इस्तेमाल किया जा सकता है. Bigtable टैबलेट के बारे में इसी तरह का भ्रम नहीं होना चाहिए. टेबल बनाने के लिए निर्देश नीचे दिए गए हैं.

कैसांद्रा

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));

Cloud Bigtable

Java क्लाइंट का इस्तेमाल करके टेबल और कॉलम फ़ैमिली बनाई जा सकती है, लेकिन cbt टूल के साथ इस कमांड का इस्तेमाल करना सबसे आसान है:

cbt createtable mobile-time-series families=stats_summary

Cloud Bigtable एक NoSQL डेटाबेस है, इसलिए आपको टेबल बनाते समय स्कीमा तय करने की ज़रूरत नहीं होगी. हालांकि, आपको उन क्वेरी के बारे में सोचना होगा जिन्हें चलाया जाएगा. साथ ही, उनके लिए पंक्ति कुंजी को ऑप्टिमाइज़ करना होगा.

कुंजी माइग्रेशन के लिए सबसे सामान्य रणनीति बस सभी विभाजन कुंजियों और क्लस्टरिंग कॉलम को लेना है और उन्हें जोड़कर Cloud Bigtable पंक्ति कुंजी को दर्शाने वाली एक स्ट्रिंग बनाना है. आम तौर पर, हम स्ट्रिंग के आधार पर कुंजियों का इस्तेमाल करने का सुझाव देते हैं, क्योंकि ये Key विज़ुअलाइज़र के ज़रिए, पासकोड डिस्ट्रिब्यूशन को डीबग करने में मदद करती हैं. हैश '#' जैसे सेपरेटर का इस्तेमाल किया जा सकता है में तय करें.

इस उदाहरण में हम "[DEVICE_TYPE]#[DEVICE_ID]#[YYYYMMDD]" की पंक्ति कुंजी का उपयोग करेंगे

4. निवेश

कैसेंड्रा और Cloud Bigtable के बीच इंसर्ट काफ़ी हद तक समान हैं. यहां आपको एक पंक्ति और फिर कई पंक्तियां जोड़ने के लिए, "[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;

Cloud Bigtable

सिंगल

आपको जिस पंक्ति कुंजी और डेटा का इस्तेमाल करना है उसका म्यूटेशन बनाएं. इसके बाद, डेटा क्लाइंट के लिए म्यूटेशन लागू करें. आपको फ़ोन के सेल कनेक्शन और ऑपरेटिंग सिस्टम की जानकारी के साथ डेटा की एक पंक्ति जोड़नी होगी.

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());
}

बैच

बल्कMutation ऑब्जेक्ट पर एक से ज़्यादा म्यूटेशन तय करें. इसके बाद, एक एपीआई कॉल में सभी म्यूटेशन लागू करने के लिए डेटा क्लाइंट का इस्तेमाल करें. आपको मोबाइल टैबलेट के ऑपरेटिंग सिस्टम के नाम और वर्शन के बारे में कुछ दिनों का डेटा जोड़ना होगा.

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';

Cloud Bigtable

Cloud Bigtable में, अपडेट को ठीक वैसे ही मैनेज किया जा सकता है जैसे कि लिखा गया हो.

सेल जोड़ना

यह सेल लिखने जैसा ही है. सिर्फ़ वह कॉलम दें जिसे आपने पहले नहीं लिखा है. यहां आपको फ़ोन की लाइन में ऑपरेटिंग सिस्टम का नाम जोड़ना होगा.

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 चुने स्टेटमेंट को माइग्रेट करते समय आपको चुनिंदा स्टेटमेंट के कई पहलुओं पर ध्यान देना होगा, जैसे कि कॉलम, जहां क्लॉज़ को फ़िल्टर करके फ़िल्टर किया जाता है, और फ़ंक्शन 'इसके हिसाब से ग्रुप करें' जैसे फ़ंक्शन को सीमित और एग्रीगेट किया जाता है. यहां, बुनियादी आइडिया पाने के लिए आपको दो आसान से स्टेटमेंट दिखेंगे. हालांकि, टेंप्लेट चुनने के बारे में ज़्यादा जानने के लिए दस्तावेज़ भी देखा जा सकता है. Cloud Bigtable में, डेटा वापस पाने की दो तरह की कार्रवाइयां होती हैं: पाएं और स्कैन करें. ' पाएं' स्कैन करके एक पंक्ति की जानकारी मिलती है, जबकि स्कैन से पंक्तियां की रेंज का पता चलता है.

कास्सांद्रा

सिंगल

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';

Cloud Bigtable

अविवाहित

तय तारीख पर किसी खास फ़ोन का डेटा पाने के लिए, पंक्ति लुकअप का इस्तेमाल करें. यह डेटा सिर्फ़ एक पंक्ति में होना चाहिए. इससे वैल्यू का हर टाइमस्टैंप वाला वर्शन दिखेगा, इसलिए आपको अलग-अलग टाइमस्टैंप पर 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. हटाए

यहां से अपनी टेबल में रखा गया डेटा मिट जाएगा. सबसे पहले आप एक अलग पंक्ति हटाएंगे, फिर एक से ज़्यादा पंक्तियां हटाएं.

सभी प्राथमिक कॉलम तय होने पर, कैसंड्रा का CQL एक पंक्ति और रेंज को हटाने की अनुमति देता है. Bigtable में ऐसा करने के लिए, किसी रेंज को स्कैन करें और फिर पंक्ति के लेवल को मिटाएं. ध्यान दें कि आपको वही नतीजा मिलेगा. हालांकि, इसमें कई कार्रवाइयां होंगी, क्योंकि हर बार डेटा मिटाने का अपना खुद का ऑपरेशन होगा.

कैसांद्रा

सिंगल

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

एक से ज़्यादा

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

Cloud Bigtable

सिंगल

यहां से किसी ख़ास फ़ोन और तारीख का डेटा मिटाया जाएगा. एक बार में एक पंक्ति मिटाने के लिए, पंक्ति की कुंजी का इस्तेमाल करें.

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. पूरा होने वाला है

खाली करने के लिए जगह

कास्सांद्रा

अगर आपने इसके साथ पालन करने के लिए एक Cassandra क्लस्टर बनाया है, तो इसे बेझिझक हटा दें जैसे कि आप सामान्य रूप से करते हैं.

Cloud Bigtable

अगर आपने अपनी टेबल किसी मौजूदा Cloud Bigtable इंस्टेंस पर बनाई है, तो इसे cbt कमांड से मिटाया जा सकता है

cbt deletetable mobile-time-series

अगर आपने एम्युलेटर का इस्तेमाल किया है, तो जिस टर्मिनल में आपने इसे शुरू किया था उसमें CTRL-C टाइप करके सभी काम को मिटाने के लिए एम्युलेटर को रोका जा सकता है.

अगले चरण