1. परिचय
इस कोडलैब में, आपको Java HBase क्लाइंट के साथ Cloud Bigtable का इस्तेमाल करने के बारे में जानकारी मिलेगी.
आपको इनके बारे में जानकारी मिलेगी
- स्कीमा डिज़ाइन करते समय सामान्य गलतियों से बचना
- सीक्वेंस फ़ाइल में डेटा इंपोर्ट करना
- अपने डेटा से जुड़ी क्वेरी करना
इसके बाद, आपके पास कई मैप होंगे. इनमें न्यूयॉर्क शहर की बसों का डेटा दिखेगा. उदाहरण के लिए, आपको मैनहैटन में बस की यात्राओं का यह हीटमैप बनाना होगा:

Google Cloud Platform इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?
इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?
2. डेटासेट के बारे में जानकारी
आपको न्यूयॉर्क सिटी की बसों के बारे में डेटासेट दिखेगा. यहां 300 से ज़्यादा बस रूट हैं और इन रूट पर 5,800 वाहन चलते हैं. हमारे डेटासेट में एक लॉग होता है. इसमें डेस्टिनेशन का नाम, वाहन का आईडी, अक्षांश, देशांतर, पहुंचने का अनुमानित समय, और पहुंचने का शेड्यूल किया गया समय शामिल होता है. इस डेटासेट में, जून 2017 के हर 10 मिनट के स्नैपशॉट शामिल हैं.
3. स्कीमा डिज़ाइन
Cloud Bigtable से सबसे अच्छी परफ़ॉर्मेंस पाने के लिए, आपको स्कीमा डिज़ाइन करते समय सोच-समझकर फ़ैसले लेने होंगे. Cloud Bigtable में डेटा को लेक्सिकोग्राफ़िक तरीके से अपने-आप क्रम से लगाया जाता है. इसलिए, अगर आपने अपने स्कीमा को अच्छी तरह से डिज़ाइन किया है, तो उससे जुड़े डेटा के लिए क्वेरी करना बहुत आसान हो जाता है. Cloud Bigtable में, क्वेरी के लिए पॉइंट लुकअप का इस्तेमाल किया जा सकता है. इसके लिए, पंक्ति के मुख्य कॉलम या पंक्ति-रेंज स्कैन का इस्तेमाल किया जाता है. इससे पंक्तियों का एक साथ सेट मिलता है. हालांकि, अगर आपका स्कीमा अच्छी तरह से नहीं बनाया गया है, तो आपको कई लाइनें ढूंढनी पड़ सकती हैं. इससे भी खराब यह है कि आपको पूरी टेबल स्कैन करनी पड़ सकती है. ये कार्रवाइयां बहुत धीमी होती हैं.
क्वेरी की योजना बनाना
हमारे डेटा में कई तरह की जानकारी होती है. हालांकि, इस कोडलैब के लिए, आपको बस की जगह और मंज़िल का इस्तेमाल करना होगा.
उस जानकारी के आधार पर, ये क्वेरी की जा सकती हैं:
- किसी बस की एक घंटे की लोकेशन की जानकारी पाना.
- किसी बस लाइन या बस के लिए, एक दिन का डेटा पाएं.
- मैप पर किसी आयत में मौजूद सभी बसें ढूंढो.
- सभी बसों की मौजूदा जगह की जानकारी पाएं. हालांकि, ऐसा तब होगा, जब आपने इस डेटा को रीयल टाइम में शामिल किया हो.
क्वेरी के इस सेट को एक साथ ऑप्टिमाइज़ नहीं किया जा सकता. उदाहरण के लिए, अगर आपको समय के हिसाब से डेटा को क्रम से लगाना है, तो पूरी टेबल को स्कैन किए बिना किसी जगह के हिसाब से स्कैन नहीं किया जा सकता. आपको उन क्वेरी के आधार पर प्राथमिकता तय करनी होगी जिन्हें अक्सर चलाया जाता है.
इस कोडलैब के लिए, आपको क्वेरी के इस सेट को ऑप्टिमाइज़ करने और लागू करने पर फ़ोकस करना होगा:
- किसी वाहन की एक घंटे से ज़्यादा की लोकेशन पाना.
- एक घंटे से ज़्यादा समय तक, बस लाइन की सभी जगहों की जानकारी पाएं.
- मैनहैटन में मौजूद सभी बसों की लोकेशन एक घंटे में पता करो.
- मैनहैटन में मौजूद सभी बसों की एक घंटे पहले की लोकेशन की जानकारी दो.
- किसी बस लाइन के पूरे महीने के रूट की जानकारी पाना.
- एक घंटे से ज़्यादा समय में, किसी बस लाइन के सभी स्टॉप की जानकारी पाएं.
लाइन की कुंजी डिज़ाइन करना
इस कोडलैब के लिए, आपको स्टैटिक डेटासेट के साथ काम करना होगा. हालांकि, आपको स्केलेबिलिटी के लिए स्कीमा डिज़ाइन करना होगा. आपको एक ऐसा स्कीमा डिज़ाइन करना होगा जिससे टेबल में बस का ज़्यादा डेटा स्ट्रीम किया जा सके और वह अब भी अच्छी तरह से काम करे.
यहां लाइन की कुंजी के लिए सुझाया गया स्कीमा दिया गया है:
[बस कंपनी/बस लाइन/टाइमस्टैंप को घंटे के हिसाब से कम किया गया/वाहन का आईडी]. हर लाइन में एक घंटे का डेटा होता है. साथ ही, हर सेल में डेटा के टाइमस्टैंप किए गए कई वर्शन होते हैं.
इस कोडलैब के लिए, एक कॉलम फ़ैमिली का इस्तेमाल किया जाएगा, ताकि चीज़ें आसान रहें. डेटा कैसा दिखता है, इसका एक उदाहरण यहां दिया गया है. डेटा को लाइन के हिसाब से क्रम से लगाया जाता है.
लाइन का बटन | cf:VehicleLocation.Latitude | cf:VehicleLocation.Longitude | ... |
MTA/M86-SBS/1496275200000/NYCT_5824 | 40.781212 @20:52:54.0040.776163 @20:43:19.0040.778714 @20:33:46.00 | -73.961942 @20:52:54.00-73.946949 @20:43:19.00-73.953731 @20:33:46.00 | ... |
MTA/M86-SBS/1496275200000/NYCT_5840 | 40.780664 @20:13:51.0040.788416 @20:03:40.00 | -73.958357 @20:13:51.00 -73.976748 @20:03:40.00 | ... |
MTA/M86-SBS/1496275200000/NYCT_5867 | 40.780281 @20:51:45.0040.779961 @20:43:15.0040.788416 @20:33:44.00 | -73.946890 @20:51:45.00-73.959465 @20:43:15.00-73.976748 @20:33:44.00 | ... |
... | ... | ... | ... |
4. उदाहरण, टेबल, और फ़ैमिली बनाना
इसके बाद, आपको Cloud Bigtable टेबल बनानी होगी.
सबसे पहले, एक नया प्रोजेक्ट बनाएं. Cloud Shell का इस्तेमाल करें. इसे खोलने के लिए, सबसे ऊपर दाएं कोने में मौजूद "Cloud Shell चालू करें" बटन पर क्लिक करें.

कोड लैब के निर्देशों को कॉपी और चिपकाने की प्रोसेस को आसान बनाने के लिए, इन एनवायरमेंट वैरिएबल को सेट करें:
INSTANCE_ID="bus-instance" CLUSTER_ID="bus-cluster" TABLE_ID="bus-data" CLUSTER_NUM_NODES=3 CLUSTER_ZONE="us-central1-c"
Cloud Shell में, इस कोडलैब में इस्तेमाल किए जाने वाले टूल पहले से इंस्टॉल होते हैं. जैसे, gcloud कमांड-लाइन टूल, cbt कमांड-लाइन इंटरफ़ेस, और Maven.
यह कमांड चलाकर, Cloud Bigtable API चालू करें.
gcloud services enable bigtable.googleapis.com bigtableadmin.googleapis.com
यहां दिया गया कमांड चलाकर, एक इंस्टेंस बनाएं:
gcloud bigtable instances create $INSTANCE_ID \
--cluster=$CLUSTER_ID \
--cluster-zone=$CLUSTER_ZONE \
--cluster-num-nodes=$CLUSTER_NUM_NODES \
--display-name=$INSTANCE_ID
इंस्टेंस बनाने के बाद, सीबीटी कॉन्फ़िगरेशन फ़ाइल भरें. इसके बाद, यहां दिए गए निर्देशों को चलाकर टेबल और कॉलम फ़ैमिली बनाएं:
echo project = $GOOGLE_CLOUD_PROJECT > ~/.cbtrc echo instance = $INSTANCE_ID >> ~/.cbtrc cbt createtable $TABLE_ID cbt createfamily $TABLE_ID cf
5. डेटा इंपोर्ट करना
इस कोडलैब के लिए, gs://cloud-bigtable-public-datasets/bus-data से सीक्वेंस फ़ाइलों का सेट इंपोर्ट करें. इसके लिए, यह तरीका अपनाएं:
इस निर्देश को चलाकर, Cloud Dataflow API को चालू करें.
gcloud services enable dataflow.googleapis.com
टेबल इंपोर्ट करने के लिए, ये कमांड चलाएं.
NUM_WORKERS=$(expr 3 \* $CLUSTER_NUM_NODES) gcloud beta dataflow jobs run import-bus-data-$(date +%s) \ --gcs-location gs://dataflow-templates/latest/GCS_SequenceFile_to_Cloud_Bigtable \ --num-workers=$NUM_WORKERS --max-workers=$NUM_WORKERS \ --parameters bigtableProject=$GOOGLE_CLOUD_PROJECT,bigtableInstanceId=$INSTANCE_ID,bigtableTableId=$TABLE_ID,sourcePattern=gs://cloud-bigtable-public-datasets/bus-data/*
इंपोर्ट की प्रोसेस पर नज़र रखना
Cloud Dataflow के यूज़र इंटरफ़ेस (यूआई) में जाकर, जॉब को मॉनिटर किया जा सकता है. इसके अलावा, Cloud Bigtable इंस्टेंस पर लोड की जानकारी देखने के लिए, मॉनिटरिंग यूआई का इस्तेमाल किया जा सकता है. पूरा डेटा इंपोर्ट होने में पांच मिनट लगेंगे.
6. कोड प्राप्त करें
git clone https://github.com/googlecodelabs/cbt-intro-java.git cd cbt-intro-java
Java 11 पर स्विच करने के लिए, ये कमांड चलाएं:
sudo update-java-alternatives -s java-1.11.0-openjdk-amd64 && export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
7. लुकअप करना
पहली क्वेरी में, आपको सिर्फ़ एक लाइन में मौजूद डेटा खोजना है. आपको 1 जून, 2017 को रात 12 बजे से 1 बजे तक, M86-SBS लाइन पर चलने वाली बस का डेटा मिलेगा. उस समय, बस लाइन पर NYCT_5824 आईडी वाला वाहन मौजूद था.
इस जानकारी और स्कीमा डिज़ाइन (बस कंपनी/बस लाइन/टाइमस्टैंप को घंटे के हिसाब से राउंड डाउन किया गया है/वाहन का आईडी) की मदद से, यह अनुमान लगाया जा सकता है कि लाइन की कुंजी यह है:
MTA/M86-SBS/1496275200000/NYCT_5824
BusQueries.java
private static final byte[] COLUMN_FAMILY_NAME = Bytes.toBytes("cf");
private static final byte[] LAT_COLUMN_NAME = Bytes.toBytes("VehicleLocation.Latitude");
private static final byte[] LONG_COLUMN_NAME = Bytes.toBytes("VehicleLocation.Longitude");
String rowKey = "MTA/M86-SBS/1496275200000/NYCT_5824";
Result getResult =
table.get(
new Get(Bytes.toBytes(rowKey))
.addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
.addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME));
नतीजे में, उस घंटे के अंदर बस की सबसे हाल की जगह की जानकारी होनी चाहिए. हालांकि, आपको सभी जगहें देखनी हैं. इसलिए, 'पाएं' अनुरोध पर वर्शन की ज़्यादा से ज़्यादा संख्या सेट करें.
BusQueries.java
Result getResult =
table.get(
new Get(Bytes.toBytes(rowKey))
.setMaxVersions(Integer.MAX_VALUE)
.addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
.addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME));
Cloud Shell में, एक घंटे के दौरान बस के अक्षांश और देशांतर की सूची पाने के लिए, यह कमांड चलाएं:
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=lookupVehicleInGivenHour
नतीजों को विज़ुअलाइज़ करने के लिए, अक्षांश और देशांतर को MapMaker ऐप्लिकेशन में कॉपी करके चिपकाया जा सकता है. कुछ लेयर के बाद, आपको मुफ़्त खाता बनाने के लिए कहा जाएगा. आपके पास खाता बनाने या मौजूदा लेयर मिटाने का विकल्प होता है. अगर आपको सिर्फ़ साथ-साथ काम करना है, तो इस कोडलैब में हर चरण के लिए विज़ुअलाइज़ेशन शामिल है. पहली क्वेरी का नतीजा यहां दिया गया है:

8. स्कैन करना
अब उस घंटे के लिए, बस लाइन का पूरा डेटा देखते हैं. स्कैन कोड, 'कोड पाएं' बटन के जैसा ही दिखता है. आपने स्कैनर को शुरुआती पोज़िशन दी है. इसके बाद, आपने बताया है कि आपको सिर्फ़ M86-SBS बस लाइन की पंक्तियां चाहिए. ये पंक्तियां, टाइमस्टैंप 1496275200000 से दिखाए गए घंटे के अंदर की होनी चाहिए.
BusQueries.java
Scan scan;
scan = new Scan();
scan.setMaxVersions(Integer.MAX_VALUE)
.addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
.addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME)
.withStartRow(Bytes.toBytes("MTA/M86-SBS/1496275200000"))
.setRowPrefixFilter(Bytes.toBytes("MTA/M86-SBS/1496275200000"));
ResultScanner scanner = table.getScanner(scan);
नतीजे पाने के लिए, यह कमांड चलाएं.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=scanBusLineInGivenHour

Map Maker ऐप्लिकेशन एक साथ कई सूचियां दिखा सकता है. इससे आपको यह पता चल सकता है कि पहली क्वेरी में कौनसी बसें शामिल थीं.

इस क्वेरी में एक दिलचस्प बदलाव यह है कि M86-SBS बस लाइन के लिए, पूरे महीने का डेटा देखा जा सकता है. ऐसा करना बहुत आसान है. नतीजा पाने के लिए, शुरुआती लाइन से टाइमस्टैंप और प्रीफ़िक्स फ़िल्टर हटाएं.
BusQueries.java
scan.withStartRow(Bytes.toBytes("MTA/M86-SBS/"))
.setRowPrefixFilter(Bytes.toBytes("MTA/M86-SBS/"));
// Optionally, reduce the results to receive one version per column
// since there are so many data points.
scan.setMaxVersions(1);
नतीजे पाने के लिए, यह कमांड चलाएं. (नतीजों की लंबी सूची दिखेगी.)
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=scanEntireBusLine
नतीजों को MapMaker में कॉपी करने पर, बस के रास्ते का हीटमैप देखा जा सकता है. नारंगी रंग के धब्बे, बस स्टॉप दिखाते हैं. वहीं, लाल रंग के चमकदार धब्बे, रास्ते की शुरुआत और आखिर को दिखाते हैं.

9. फ़िल्टर की सुविधा लॉन्च करना
इसके बाद, पूरब और पश्चिम की ओर जाने वाली बसों के हिसाब से फ़िल्टर करें. साथ ही, हर दिशा के लिए अलग-अलग हीटमैप बनाएं.
BusQueries.java
Scan scan;
ResultScanner scanner;
scan = new Scan();
SingleColumnValueFilter valueFilter =
new SingleColumnValueFilter(
COLUMN_FAMILY_NAME,
Bytes.toBytes("DestinationName"),
CompareOp.EQUAL,
Bytes.toBytes("Select Bus Service Yorkville East End AV"));
scan.setMaxVersions(1)
.addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
.addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME);
scan.withStartRow(Bytes.toBytes("MTA/M86-SBS/"))
.setRowPrefixFilter(Bytes.toBytes("MTA/M86-SBS/"));
scan.setFilter(valueFilter);
scanner = table.getScanner(scan);
पूरब की ओर जाने वाली बसों के नतीजे पाने के लिए, यह कमांड चलाएं.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=filterBusesGoingEast
पश्चिम की ओर जाने वाली बसें पाने के लिए, valueFilter में स्ट्रिंग बदलें:
BusQueries.java
SingleColumnValueFilter valueFilter =
new SingleColumnValueFilter(
COLUMN_FAMILY_NAME,
Bytes.toBytes("DestinationName"),
CompareOp.EQUAL,
Bytes.toBytes("Select Bus Service Westside West End AV"));
पश्चिम की ओर जाने वाली बसों की जानकारी पाने के लिए, यह कमांड चलाएं.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=filterBusesGoingWest
पूरब की ओर जाने वाली बसें

पश्चिम की ओर जाने वाली बसें

दोनों हीटमैप की तुलना करके, रास्तों में अंतर देखा जा सकता है. साथ ही, पेसिंग में अंतर भी देखा जा सकता है. डेटा के मुताबिक, पश्चिम की ओर जाने वाले रूट पर बसें ज़्यादा रुक रही हैं. खास तौर पर, सेंट्रल पार्क में प्रवेश करते समय. पूरब की ओर जाने वाली बसों के रास्ते में, आपको ज़्यादा रुकावटें नहीं दिखेंगी.
10. एक से ज़्यादा रेंज को स्कैन करना
आखिरी क्वेरी के लिए, आपको उस मामले को हल करना होगा जिसमें आपको किसी इलाके की कई बस लाइनों के बारे में जानकारी चाहिए:
BusQueries.java
private static final String[] MANHATTAN_BUS_LINES = {"M1","M2","M3",...
Scan scan;
ResultScanner scanner;
List<RowRange> ranges = new ArrayList<>();
for (String busLine : MANHATTAN_BUS_LINES) {
ranges.add(
new RowRange(
Bytes.toBytes("MTA/" + busLine + "/1496275200000"), true,
Bytes.toBytes("MTA/" + busLine + "/1496275200001"), false));
}
Filter filter = new MultiRowRangeFilter(ranges);
scan = new Scan();
scan.setFilter(filter);
scan.setMaxVersions(Integer.MAX_VALUE)
.addColumn(COLUMN_FAMILY_NAME, LAT_COLUMN_NAME)
.addColumn(COLUMN_FAMILY_NAME, LONG_COLUMN_NAME);
scan.withStartRow(Bytes.toBytes("MTA/M")).setRowPrefixFilter(Bytes.toBytes("MTA/M"));
scanner = table.getScanner(scan);
नतीजे पाने के लिए, यह कमांड चलाएं.
mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \ -Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \ -Dquery=scanManhattanBusesInGivenHour

11. प्रोसेस पूरी करें
शुल्क से बचने के लिए स्टोरेज खाली करना
इस कोडलैब में इस्तेमाल की गई सुविधाओं के लिए, अपने Google Cloud Platform खाते से शुल्क न लिए जाने के लिए, आपको अपना इंस्टेंस मिटाना होगा.
gcloud bigtable instances delete $INSTANCE_ID
हमने क्या-क्या बताया
- स्कीमा डिज़ाइन
- इंस्टेंस, टेबल, और फ़ैमिली सेट अप करना
- Dataflow की मदद से सीक्वेंस फ़ाइलें इंपोर्ट करना
- लुकअप, स्कैन, फ़िल्टर के साथ स्कैन, और मल्टी-रेंज स्कैन का इस्तेमाल करके क्वेरी करना
अगले चरण
- Cloud Bigtable के बारे में ज़्यादा जानने के लिए, दस्तावेज़ देखें.
- Google Cloud Platform की अन्य सुविधाओं को खुद आज़माएं. हमारे ट्यूटोरियल देखें.
- OpenTSDB इंटिग्रेशन की मदद से, टाइम-सीरीज़ डेटा को मॉनिटर करने का तरीका जानें