1. परिचय
इस कोडलैब में, आपको Java HBase क्लाइंट के साथ Cloud Bigtable को इस्तेमाल करने के बारे में जानकारी मिलेगी.
आपको इनके बारे में जानकारी मिलेगी
- स्कीमा डिज़ाइन में आम तौर पर होने वाली गलतियों से बचना
- क्रम वाली फ़ाइल में डेटा इंपोर्ट करें
- अपने डेटा के लिए क्वेरी करें
आपका काम हो जाने के बाद, आपके पास कई मैप होंगे, जिनमें न्यूयॉर्क शहर का बस डेटा दिखेगा. उदाहरण के लिए, आप मैनहैटन में बस यात्राओं का यह हीटमैप बनाएंगे:
Google Cloud Platform इस्तेमाल करने का आपका अनुभव कैसा रहा?
इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?
2. डेटासेट के बारे में जानकारी
यहां आपको न्यूयॉर्क शहर की बसों के बारे में एक डेटासेट दिखेगा. इस रास्ते पर जाने के लिए, बस के 300 से ज़्यादा रास्ते और 5,800 से ज़्यादा वाहन हैं. हमारा डेटासेट एक लॉग है, जिसमें गंतव्य का नाम, वाहन का आईडी, अक्षांश, देशांतर, पहुंचने का अनुमानित समय, और पहुंचने के लिए शेड्यूल किया गया समय शामिल होता है. यह डेटासेट जून 2017 के लिए हर 10 मिनट में लिए गए स्नैपशॉट से बना है.
3. स्कीमा डिज़ाइन
Cloud Bigtable से बेहतरीन परफ़ॉर्मेंस पाने के लिए, आपको स्कीमा डिज़ाइन करते समय काफ़ी सोच-विचार करना होगा. Cloud Bigtable में डेटा को शब्दकोश के हिसाब से अपने-आप क्रम से लगाया जाता है. इसलिए, अगर आप स्कीमा को सही तरीके से डिज़ाइन करते हैं, तो उससे जुड़े डेटा के लिए क्वेरी करना काफ़ी आसान होता है. Cloud Bigtable, पंक्ति की कुंजी या पंक्ति की रेंज के स्कैन के ज़रिए पॉइंट लुकअप का इस्तेमाल करके उन क्वेरी की अनुमति देता है जो पंक्तियों का एक सेट है. हालांकि, अगर आपका स्कीमा ठीक से सोच-समझकर तैयार नहीं किया गया है, तो हो सकता है कि आप कई पंक्तियों में एक साथ लुकअप कर पाएं या फिर पूरी टेबल स्कैन कर पाएं. इनमें बहुत ज़्यादा धीमी प्रोसेस होती हैं.
क्वेरी तय करना
हमारे डेटा में कई तरह की जानकारी होती है, लेकिन इस कोडलैब के लिए आपको बस की जगह और जगह की जानकारी का इस्तेमाल करना होगा.
इस जानकारी के साथ, ये क्वेरी की जा सकती हैं:
- किसी दिए गए घंटे में एक बस की जगह की जानकारी पाएं.
- बस लाइन या खास बस के लिए एक दिन का डेटा पाएं.
- मैप पर रेक्टैंगल में मौजूद सभी बसों को ढूंढें.
- सभी बसों की मौजूदा जगह की जानकारी पाएं (अगर यह डेटा रीयल टाइम में डाला जा रहा हो).
क्वेरी के इस सेट को एक साथ सही तरीके से पूरा नहीं किया जा सकता. उदाहरण के लिए, अगर समय के मुताबिक क्रम से लगाया जा रहा है, तो पूरी टेबल स्कैन किए बिना जगह के हिसाब से स्कैन नहीं किया जा सकता. आपको अक्सर की जाने वाली क्वेरी के हिसाब से प्राथमिकता तय करनी होगी.
इस कोडलैब के लिए, आपको क्वेरी के इन सेट को ऑप्टिमाइज़ करने और लागू करने पर फ़ोकस करना होगा:
- एक घंटे में किसी खास वाहन की जगह की जानकारी पाएं.
- एक घंटे में पूरी बस लाइन की जगह की जानकारी पाएं.
- एक घंटे में मुंबई में सभी बसों की जगह की जानकारी पाएं.
- एक घंटे में मुंबई में सभी बसों की सबसे हाल की जगह की जानकारी पाएं.
- महीने के दौरान पूरी बस लाइन की जगहों की जानकारी पाएं.
- एक घंटे में किसी खास मंज़िल के साथ बस की पूरी लाइन की जगह की जानकारी पाएं.
पंक्ति कुंजी डिज़ाइन करना
इस कोडलैब के लिए, आपको एक स्टैटिक डेटासेट के साथ काम करना होगा, लेकिन साइज़ बढ़ाने के लिए एक स्कीमा डिज़ाइन करना होगा. आपको ऐसा स्कीमा डिज़ाइन करना होगा जिससे आप टेबल में बस का ज़्यादा डेटा स्ट्रीम कर सकें और फिर भी अच्छा परफ़ॉर्म कर सकें.
पंक्ति कुंजी के लिए प्रस्तावित स्कीमा यहां दिया गया है:
[बस कंपनी/बस की लाइन/टाइमस्टैंप को घंटे/वाहन के आईडी में बदल दिया गया है]. हर पंक्ति में एक घंटे का डेटा होता है और हर सेल में डेटा के कई टाइम-स्टैंप्ड वर्शन होते हैं.
इस कोडलैब के लिए, आपको एक कॉलम फ़ैमिली का इस्तेमाल करना होगा, ताकि काम को आसान बनाया जा सके. यहां उदाहरण के तौर पर बताया गया है कि डेटा कैसा दिखता है. डेटा को पंक्ति की कुंजी के हिसाब से क्रम में लगाया जाता है.
लाइन बटन | cf:VehicleLocation.अक्षांश | cf:VehicleLocation.देशांतर | ... |
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 की एक टेबल होगी.
सबसे पहले, एक नया प्रोजेक्ट बनाएं. पहले से मौजूद क्लाउड शेल का इस्तेमाल करें. इसे "चालू क्लाउड शेल" पर क्लिक करके खोला जा सकता है बटन पर क्लिक करें.
कोडलैब के निर्देशों को आसानी से कॉपी करने और चिपकाने के लिए, इन एनवायरमेंट वैरिएबल को सेट करें:
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 एपीआई को चालू करें.
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
इंस्टेंस बनाने के बाद, cbt कॉन्फ़िगरेशन फ़ाइल को पॉप्युलेट करें. इसके बाद, इन निर्देशों की मदद से टेबल और कॉलम फ़ैमिली बनाएं:
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:00 बजे से सुबह 1:00 बजे के बीच M86-एसबीएस लाइन पर आने वाली बस का डेटा मिलेगा. 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
इसमें हमने इन विषयों के बारे में बताया
- स्कीमा डिज़ाइन
- इंस्टेंस, टेबल, और फ़ैमिली सेट अप करना
- डेटाफ़्लो की मदद से क्रम वाली फ़ाइलें इंपोर्ट करना
- लुकअप, स्कैन, फ़िल्टर, और कई रेंज वाले स्कैन की मदद से क्वेरी करना
अगले चरण
- दस्तावेज़ में Cloud Bigtable के बारे में ज़्यादा जानें.
- Google Cloud Platform की अन्य सुविधाएं खुद आज़माएं. हमारे ट्यूटोरियल देखें.
- OpenTSDB इंटिग्रेशन के साथ टाइम सीरीज़ के डेटा को मॉनिटर करने का तरीका जानें