ক্লাউড বিগটেবলের ভূমিকা

1. ভূমিকা

এই কোডল্যাবে, আপনি Java HBase ক্লায়েন্টের সাথে Cloud Bigtable ব্যবহার করার সাথে পরিচিত হবেন।

আপনি কিভাবে শিখবেন

  • স্কিমা ডিজাইনের সাথে সাধারণ ভুলগুলি এড়িয়ে চলুন
  • একটি সিকোয়েন্স ফাইলে ডেটা আমদানি করুন
  • আপনার ডেটা জিজ্ঞাসা করুন

আপনার হয়ে গেলে, আপনার কাছে নিউ ইয়র্ক সিটি বাসের ডেটা দেখায় এমন বেশ কয়েকটি মানচিত্র থাকবে। উদাহরণস্বরূপ, আপনি ম্যানহাটনে বাস ভ্রমণের এই হিটম্যাপটি তৈরি করবেন:

7349d94f7d41f1d1.png

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

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

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

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

2. ডেটাসেট সম্পর্কে

আপনি নিউ ইয়র্ক সিটি বাস সম্পর্কে একটি ডেটাসেট দেখবেন। 300 টিরও বেশি বাস রুট এবং 5,800 যানবাহন সেই রুটগুলি অনুসরণ করে। আমাদের ডেটাসেট হল একটি লগ যাতে গন্তব্যের নাম, গাড়ির আইডি, অক্ষাংশ, দ্রাঘিমাংশ, প্রত্যাশিত আগমনের সময় এবং নির্ধারিত আগমনের সময় অন্তর্ভুক্ত থাকে। ডেটাসেটটি জুন 2017 এর জন্য প্রতি 10 মিনিটে নেওয়া স্ন্যাপশটগুলির সমন্বয়ে তৈরি৷

3. স্কিমা ডিজাইন

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

প্রশ্নগুলি পরিকল্পনা করুন

আমাদের ডেটাতে বিভিন্ন তথ্য রয়েছে, তবে এই কোডল্যাবের জন্য, আপনি বাসের অবস্থান এবং গন্তব্য ব্যবহার করবেন।

সেই তথ্য দিয়ে, আপনি এই প্রশ্নগুলি সম্পাদন করতে পারেন:

  • একটি নির্দিষ্ট ঘন্টার মধ্যে একটি বাসের অবস্থান পান।
  • একটি বাস লাইন বা নির্দিষ্ট বাসের জন্য এক দিনের মূল্যের ডেটা পান।
  • একটি মানচিত্রে একটি আয়তক্ষেত্রে সব বাস খুঁজুন.
  • সমস্ত বাসের বর্তমান অবস্থানগুলি পান (যদি আপনি রিয়েল টাইমে এই ডেটা গ্রহণ করেন)।

প্রশ্নের এই সেট সব একসাথে সর্বোত্তমভাবে করা যাবে না. উদাহরণস্বরূপ, যদি আপনি সময় অনুসারে বাছাই করেন তবে আপনি একটি সম্পূর্ণ টেবিল স্ক্যান না করে একটি অবস্থানের উপর ভিত্তি করে স্ক্যান করতে পারবেন না। আপনি সাধারণত যে প্রশ্নগুলি চালান তার উপর ভিত্তি করে আপনাকে অগ্রাধিকার দিতে হবে।

এই কোডল্যাবের জন্য, আপনি নিম্নলিখিত প্রশ্নের সেটগুলিকে অপ্টিমাইজ এবং কার্যকর করার উপর ফোকাস করবেন:

  • এক ঘন্টার মধ্যে একটি নির্দিষ্ট গাড়ির অবস্থান পান।
  • এক ঘন্টার মধ্যে একটি সম্পূর্ণ বাস লাইনের অবস্থানগুলি পান।
  • এক ঘন্টার মধ্যে ম্যানহাটনের সমস্ত বাসের অবস্থান পান।
  • এক ঘন্টার মধ্যে ম্যানহাটনের সমস্ত বাসের সাম্প্রতিক অবস্থানগুলি পান।
  • মাসে একটি সম্পূর্ণ বাস লাইনের অবস্থান পান।
  • এক ঘন্টার মধ্যে একটি নির্দিষ্ট গন্তব্য সহ একটি সম্পূর্ণ বাস লাইনের অবস্থানগুলি পান।

সারি কী ডিজাইন করুন

এই কোডল্যাবের জন্য, আপনি একটি স্ট্যাটিক ডেটাসেটের সাথে কাজ করবেন, তবে আপনি স্কেলেবিলিটির জন্য একটি স্কিমা ডিজাইন করবেন। আপনি একটি স্কিমা ডিজাইন করবেন যা আপনাকে টেবিলে আরও বাস ডেটা স্ট্রিম করতে এবং এখনও ভাল পারফর্ম করতে দেয়।

এখানে সারি কীটির জন্য প্রস্তাবিত স্কিমা রয়েছে:

[বাস কোম্পানি/বাস লাইন/টাইমস্ট্যাম্প ঘন্টা/যানবাহন আইডি পর্যন্ত বৃত্তাকার]। প্রতিটি সারিতে এক ঘন্টা ডেটা থাকে এবং প্রতিটি কক্ষে ডেটার একাধিক টাইম-স্ট্যাম্পযুক্ত সংস্করণ থাকে।

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

সারি কী

cf: Vehicle Location.Latitude

cf: Vehicle Location.Longitude

...

MTA/M86-SBS/1496275200000/NYCT_5824

40.781212 @20:52:54.00 40.776163 @20:43:19.00 40.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.00 40.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.00 40.779961 @20:43:15.00 40.788416 @20:33:44.00

-73.946890 @20:51:45.00 -73.959465 @20:43:15.00 -73.976748 @20:33:44.00

...

...

...

...

...

4. উদাহরণ, টেবিল এবং পরিবার তৈরি করুন

এর পরে, আপনি একটি ক্লাউড বিগটেবল টেবিল তৈরি করবেন।

প্রথমত, একটি নতুন প্রকল্প তৈরি করুন। অন্তর্নির্মিত ক্লাউড শেল ব্যবহার করুন, যা আপনি উপরের-ডানদিকের কোণায় "অ্যাক্টিভেট ক্লাউড শেল" বোতামে ক্লিক করে খুলতে পারেন।

a74d156ca7862b28.png

কোডল্যাব কমান্ড অনুলিপি এবং আটকানো সহজ করতে নিম্নলিখিত পরিবেশ ভেরিয়েবল সেট করুন:

INSTANCE_ID="bus-instance"
CLUSTER_ID="bus-cluster"
TABLE_ID="bus-data"
CLUSTER_NUM_NODES=3
CLUSTER_ZONE="us-central1-c"

ক্লাউড শেল সেই সরঞ্জামগুলির সাথে আসে যা আপনি এই কোডল্যাবে ব্যবহার করবেন, gcloud কমান্ড-লাইন টুল , cbt কমান্ড-লাইন ইন্টারফেস , এবং Maven , ইতিমধ্যে ইনস্টল করা আছে।

এই কমান্ডটি চালিয়ে ক্লাউড বিগটেবল এপিআই সক্ষম করুন।

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 থেকে নিম্নলিখিত ধাপগুলি সহ একটি সিকোয়েন্স ফাইল আমদানি করুন :

এই কমান্ডটি চালিয়ে ক্লাউড ডেটাফ্লো 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/*

আমদানি নিরীক্ষণ করুন

আপনি ক্লাউড ডেটাফ্লো UI- তে কাজটি নিরীক্ষণ করতে পারেন। এছাড়াও, আপনি আপনার ক্লাউড বিগটেবল ইন্সট্যান্সের লোডটি তার পর্যবেক্ষণ UI এর সাথে দেখতে পারেন। পুরো আমদানির জন্য এটি 5 মিনিট সময় নেওয়া উচিত।

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 তারিখে M86-SBS লাইনে একটি বাসের জন্য ডাটা পাবেন 12:00 টা থেকে 1:00 টা পর্যন্ত। 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));

ক্লাউড শেলে, ঘন্টা ধরে সেই বাসের জন্য অক্ষাংশ এবং দ্রাঘিমাংশের তালিকা পেতে নিম্নলিখিত কমান্ডটি চালান:

mvn package exec:java -Dbigtable.projectID=$GOOGLE_CLOUD_PROJECT \
-Dbigtable.instanceID=$INSTANCE_ID -Dbigtable.table=$TABLE_ID \
-Dquery=lookupVehicleInGivenHour

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

f1a1fac6051c6210.png

8. একটি স্ক্যান সঞ্চালন

এখন, সেই ঘন্টার জন্য বাস লাইনের সমস্ত ডেটা দেখা যাক। স্ক্যান কোডটি গেট কোডের মতো দেখতে বেশ মিল রয়েছে। আপনি স্ক্যানারটিকে একটি প্রারম্ভিক অবস্থান দেন এবং তারপরে টাইমস্ট্যাম্প 1496275200000 দ্বারা নির্দেশিত ঘন্টার মধ্যে আপনি শুধুমাত্র M86-SBS বাস লাইনের জন্য সারি চান।

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

c18a4ac6522d08a2.png

Map Maker অ্যাপটি একবারে একাধিক তালিকা প্রদর্শন করতে পারে, যাতে আপনি দেখতে পারেন যে কোন বাসটি আপনি প্রথম ক্যোয়ারীতে চালান।

234c1b51e3b201e.png

এই প্রশ্নের একটি আকর্ষণীয় পরিবর্তন হল 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-এ ফলাফল অনুলিপি করলে, আপনি বাস রুটের একটি হিটম্যাপ দেখতে পারেন। কমলা ব্লবগুলি স্টপগুলি নির্দেশ করে এবং উজ্জ্বল লাল ব্লবগুলি হল রুটের শুরু এবং শেষ।

346f52e61b3d8902.png

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

বাসগুলি পশ্চিমে যেতে, মান ফিল্টারে স্ট্রিংটি পরিবর্তন করুন:

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

বাসগুলো পূর্ব দিকে যাচ্ছে

76f6f62096a6847a.png

বাসগুলো পশ্চিম দিকে যাচ্ছে

2b5771ee9046399f.png

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

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

7349d94f7d41f1d1.png

11. শেষ করুন

চার্জ এড়াতে পরিষ্কার করুন

এই কোডল্যাবে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্টে চার্জ এড়াতে আপনার উদাহরণটি মুছে ফেলা উচিত।

gcloud bigtable instances delete $INSTANCE_ID

আমরা কভার করেছি কি

  • স্কিমা ডিজাইন
  • একটি উদাহরণ, টেবিল এবং পরিবার সেট আপ করা হচ্ছে
  • ডেটাফ্লো সহ সিকোয়েন্স ফাইল ইম্পোর্ট করা হচ্ছে
  • একটি লুকআপ, একটি স্ক্যান, একটি ফিল্টার সহ একটি স্ক্যান এবং একটি মাল্টি-রেঞ্জ স্ক্যান সহ প্রশ্ন করা

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