বিগটেবল এবং ডেটাফ্লো: ডেটাবেস মনিটরিং আর্ট (এইচবেস জাভা ক্লায়েন্ট)

1. ভূমিকা

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

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

  • ক্লাউড ডেটাফ্লো ব্যবহার করে বিগটেবলে প্রচুর পরিমাণে ডেটা লোড করুন
  • আপনার ডেটা ইনজেস্ট হওয়ার সাথে সাথে Bigtable দৃষ্টান্ত এবং টেবিল নিরীক্ষণ করুন
  • একটি Dataflow কাজ ব্যবহার করে Bigtable কোয়েরি করুন
  • আপনার স্কিমা ডিজাইনের কারণে হটস্পটগুলি খুঁজতে ব্যবহার করা যেতে পারে এমন কী ভিজ্যুয়ালাইজার টুলটি অন্বেষণ করুন
  • কী ভিজ্যুয়ালাইজার ব্যবহার করে শিল্প তৈরি করুন

d098cc81f78f02eb.png

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

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

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

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

2. আপনার Bigtable ডাটাবেস তৈরি করুন

ক্লাউড বিগটেবল হল Google এর NoSQL বিগ ডেটা ডেটাবেস পরিষেবা৷ এটি একই ডাটাবেস যা অনুসন্ধান, অ্যানালিটিক্স, মানচিত্র এবং Gmail সহ অনেকগুলি মূল Google পরিষেবাকে ক্ষমতা দেয়৷ এটি বৃহৎ বিশ্লেষণাত্মক কাজের চাপ চালানো এবং কম লেটেন্সি অ্যাপ্লিকেশন তৈরি করার জন্য আদর্শ। গভীরভাবে পরিচিতির জন্য ক্লাউড বিগটেবল কোডল্যাবের ভূমিকা দেখুন।

একটি প্রকল্প তৈরি করুন

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

a74d156ca7862b28.png

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

BIGTABLE_PROJECT=$GOOGLE_CLOUD_PROJECT
INSTANCE_ID="keyviz-art-instance"
CLUSTER_ID="keyviz-art-cluster"
TABLE_ID="art"
CLUSTER_NUM_NODES=1
CLUSTER_ZONE="us-central1-c" # You can choose a zone closer to you

ক্লাউড শেল সেই সরঞ্জামগুলির সাথে আসে যা আপনি এই কোডল্যাবে ব্যবহার করবেন, 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

3. শিখুন: ডেটাফ্লো দিয়ে বিগটেবলে লেখা

লেখার বেসিক

আপনি যখন ক্লাউড বিগটেবলে লিখবেন, আপনাকে অবশ্যই একটি CloudBigtableTableConfiguration কনফিগারেশন অবজেক্ট প্রদান করতে হবে। এই বস্তুটি আপনার টেবিলের জন্য প্রজেক্ট আইডি এবং ইনস্ট্যান্স আইডি, সেইসাথে টেবিলের নামও নির্দিষ্ট করে:

CloudBigtableTableConfiguration bigtableTableConfig =
    new CloudBigtableTableConfiguration.Builder()
        .withProjectId(PROJECT_ID)
        .withInstanceId(INSTANCE_ID)
        .withTableId(TABLE_ID)
        .build();

তারপর আপনার পাইপলাইন HBase Mutation অবজেক্ট পাস করতে পারে, যার মধ্যে পুট এবং ডিলিট অন্তর্ভুক্ত থাকতে পারে।

p.apply(Create.of("hello", "world"))
    .apply(
        ParDo.of(
            new DoFn<String, Mutation>() {
              @ProcessElement
              public void processElement(@Element String rowkey, OutputReceiver<Mutation> out) {
                long timestamp = System.currentTimeMillis();
                Put row = new Put(Bytes.toBytes(rowkey));

                row.addColumn(...);
                out.output(row);
              }
            }))
    .apply(CloudBigtableIO.writeToTable(bigtableTableConfig));

লোডডেটা ডেটাফ্লো কাজ

পরের পৃষ্ঠাটি আপনাকে দেখাবে কিভাবে লোডডেটা কাজ চালাতে হয়, তবে এখানে আমি পাইপলাইনের গুরুত্বপূর্ণ অংশগুলিকে কল করব।

ডেটা জেনারেট করতে, আপনি একটি পাইপলাইন তৈরি করবেন যা জেনারেট সিকোয়েন্স ক্লাস ব্যবহার করে (একইভাবে লুপের জন্য) কয়েক মেগাবাইট র্যান্ডম ডেটা সহ বেশ কয়েকটি সারি লিখতে। rowkey হবে সিকোয়েন্স নম্বর প্যাড করা এবং বিপরীত, তাই 250 হয়ে যায় 0000000052

LoadData.java

String numberFormat = "%0" + maxLength + "d";

p.apply(GenerateSequence.from(0).to(max))
    .apply(
        ParDo.of(
            new DoFn<Long, Mutation>() {
              @ProcessElement
              public void processElement(@Element Long rowkey, OutputReceiver<Mutation> out) {
                String paddedRowkey = String.format(numberFormat, rowkey);

                // Reverse the rowkey for more efficient writing
                String reversedRowkey = new StringBuilder(paddedRowkey).reverse().toString();
                Put row = new Put(Bytes.toBytes(reversedRowkey));

                // Generate random bytes
                byte[] b = new byte[(int) rowSize];
                new Random().nextBytes(b);

                long timestamp = System.currentTimeMillis();
                row.addColumn(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes("C"), timestamp, b);
                out.output(row);
              }
            }))
    .apply(CloudBigtableIO.writeToTable(bigtableTableConfig));

4. Bigtable এ ডেটা জেনারেট করুন এবং ইনফ্লো নিরীক্ষণ করুন

নিম্নলিখিত কমান্ডগুলি একটি ডেটাফ্লো কাজ চালাবে যা আপনার টেবিলে 40GB ডেটা তৈরি করে, কী ভিজ্যুয়ালাইজার সক্রিয় করার জন্য যথেষ্ট বেশি:

Cloud Dataflow API সক্ষম করুন

gcloud services enable dataflow.googleapis.com

Github থেকে কোড পান এবং ডিরেক্টরিতে পরিবর্তন করুন

git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
cd java-docs-samples/bigtable/beam/keyviz-art

ডেটা তৈরি করুন (স্ক্রিপ্টটি প্রায় 15 মিনিট সময় নেয়)

mvn compile exec:java -Dexec.mainClass=keyviz.LoadData \
"-Dexec.args=--bigtableProjectId=$BIGTABLE_PROJECT \
--bigtableInstanceId=$INSTANCE_ID --runner=dataflow \
--bigtableTableId=$TABLE_ID --project=$GOOGLE_CLOUD_PROJECT"

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

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

Dataflow UI-তে, আপনি কাজের গ্রাফ এবং প্রক্রিয়াকৃত উপাদান, বর্তমান vCPUs এবং থ্রুপুট সহ বিভিন্ন কাজের মেট্রিক্স দেখতে সক্ষম হবেন।

9cecc290f5acea15.png

abb0561342dc6b60.png

বিগটেবলের উদাহরণ, ক্লাস্টার এবং টেবিল স্তরে পড়া/লেখার ক্রিয়াকলাপ, ব্যবহৃত স্টোরেজ, ত্রুটির হার এবং আরও অনেক কিছুর জন্য স্ট্যান্ডার্ড মনিটরিং সরঞ্জাম রয়েছে। এর বাইরে, বিগটেবলের কী ভিজ্যুয়ালাইজারও রয়েছে যা সারি কীগুলির উপর ভিত্তি করে আপনার ব্যবহারকে ভেঙে দেয় যা আমরা একবার অন্তত 30GB ডেটা তৈরি করার পরে ব্যবহার করব।

996f8589332dfc19.png

5. শিখুন: ডেটাফ্লো সহ বিগটেবল থেকে পড়া

পড়ার বেসিক

আপনি যখন ক্লাউড বিগটেবল থেকে পড়বেন, আপনাকে অবশ্যই একটি CloudBigtableTableScanConfiguration কনফিগারেশন অবজেক্ট প্রদান করতে হবে। এটি CloudBigtableTableConfiguration এর অনুরূপ, তবে আপনি স্ক্যান করতে এবং পড়ার জন্য সারিগুলি নির্দিষ্ট করতে পারেন।

Scan scan = new Scan();
scan.setCacheBlocks(false);
scan.setFilter(new FirstKeyOnlyFilter());

CloudBigtableScanConfiguration config =
    new CloudBigtableScanConfiguration.Builder()
        .withProjectId(options.getBigtableProjectId())
        .withInstanceId(options.getBigtableInstanceId())
        .withTableId(options.getBigtableTableId())
        .withScan(scan)
        .build();

তারপর আপনার পাইপলাইন শুরু করতে এটি ব্যবহার করুন:

p.apply(Read.from(CloudBigtableIO.read(config)))
    .apply(...

যাইহোক, যদি আপনি আপনার পাইপলাইনের অংশ হিসাবে একটি রিড করতে চান, তাহলে আপনি একটি CloudBigtableTableConfiguration একটি doFn এ পাস করতে পারেন যা AbstractCloudBigtableTableDoFn প্রসারিত করে।

p.apply(GenerateSequence.from(0).to(10))
    .apply(ParDo.of(new ReadFromTableFn(bigtableTableConfig, options)));

তারপর আপনার কনফিগারেশন সহ super() কল করুন এবং একটি বিতরণ করা সংযোগ পেতে getConnection() কল করুন।

public static class ReadFromTableFn extends AbstractCloudBigtableTableDoFn<Long, Void> {
    public ReadFromTableFn(CloudBigtableConfiguration config, ReadDataOptions readDataOptions) {
      super(config);
    }

    @ProcessElement
    public void processElement(PipelineOptions po) {
        Table table = getConnection().getTable(TableName.valueOf(options.getBigtableTableId()));
        ResultScanner imageData = table.getScanner(scan);
    }   
}

ReadData ডেটাফ্লো কাজ

এই কোডল্যাবের জন্য আপনাকে প্রতি সেকেন্ডে টেবিল থেকে পড়তে হবে, যাতে আপনি একটি উত্পন্ন ক্রম দিয়ে আপনার পাইপলাইন শুরু করতে পারেন যা একটি ইনপুট করা CSV ফাইলের সময়ের উপর ভিত্তি করে একাধিক পঠিত রেঞ্জ ট্রিগার করে।

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

ReadData.java

p.apply(GenerateSequence.from(0).withRate(1, new Duration(1000)))
    .apply(ParDo.of(new ReadFromTableFn(bigtableTableConfig, options)));

ReadData.java

  public static class ReadFromTableFn extends AbstractCloudBigtableTableDoFn<Long, Void> {

    List<List<Float>> imageData = new ArrayList<>();
    String[] keys;

    public ReadFromTableFn(CloudBigtableConfiguration config, ReadDataOptions readDataOptions) {
      super(config);
      keys = new String[Math.toIntExact(getNumRows(readDataOptions))];
      downloadImageData(readDataOptions.getFilePath());
      generateRowkeys(getNumRows(readDataOptions));
    }

    @ProcessElement
    public void processElement(PipelineOptions po) {
      // Determine which column will be drawn based on runtime of job.
      long timestampDiff = System.currentTimeMillis() - START_TIME;
      long minutes = (timestampDiff / 1000) / 60;
      int timeOffsetIndex = Math.toIntExact(minutes / KEY_VIZ_WINDOW_MINUTES);

      ReadDataOptions options = po.as(ReadDataOptions.class);
      long count = 0;

      List<RowRange> ranges = getRangesForTimeIndex(timeOffsetIndex, getNumRows(options));
      if (ranges.size() == 0) {
        return;
      }

      try {
        // Scan with a filter that will only return the first key from each row. This filter is used
        // to more efficiently perform row count operations.
        Filter rangeFilters = new MultiRowRangeFilter(ranges);
        FilterList firstKeyFilterWithRanges = new FilterList(
            rangeFilters,
            new FirstKeyOnlyFilter(),
            new KeyOnlyFilter());
        Scan scan =
            new Scan()
                .addFamily(Bytes.toBytes(COLUMN_FAMILY))
                .setFilter(firstKeyFilterWithRanges);

        Table table = getConnection().getTable(TableName.valueOf(options.getBigtableTableId()));
        ResultScanner imageData = table.getScanner(scan);
      } catch (Exception e) {
        System.out.println("Error reading.");
        e.printStackTrace();
      }
    }

    /**
     * Download the image data as a grid of weights and store them in a 2D array.
     */
    private void downloadImageData(String artUrl) {
    ...
    }

    /**
     * Generates an array with the rowkeys that were loaded into the specified Bigtable. This is
     * used to create the correct intervals for scanning equal sections of rowkeys. Since Bigtable
     * sorts keys lexicographically if we just used standard intervals, each section would have
     * different sizes.
     */
    private void generateRowkeys(long maxInput) {
    ...
    }

    /**
     * Get the ranges to scan for the given time index.
     */
    private List<RowRange> getRangesForTimeIndex(@Element Integer timeOffsetIndex, long maxInput) {
    ...
    }
  }

6. আপনার মাস্টারপিস তৈরি করা

ad9c4c0b90626a3b.png

এখন যেহেতু আপনি বুঝতে পেরেছেন কিভাবে Bigtable-এ ডেটা লোড করতে হয় এবং Dataflow এর মাধ্যমে এটি থেকে পড়তে হয়, আপনি চূড়ান্ত কমান্ড চালাতে পারেন যা 8 ঘন্টার মধ্যে মোনা লিসার একটি চিত্র তৈরি করবে।

mvn compile exec:java -Dexec.mainClass=keyviz.ReadData \
"-Dexec.args=--bigtableProjectId=$BIGTABLE_PROJECT \
--bigtableInstanceId=$INSTANCE_ID --runner=dataflow \
--bigtableTableId=$TABLE_ID --project=$GOOGLE_CLOUD_PROJECT"

আপনি ব্যবহার করতে পারেন বিদ্যমান ইমেজ সঙ্গে একটি বালতি আছে. অথবা আপনি এই টুলের সাহায্যে আপনার নিজের ইমেজ থেকে একটি ইনপুট ফাইল তৈরি করতে পারেন, এবং তারপর একটি পাবলিক GCS বালতিতে আপলোড করতে পারেন।

ফাইলের নামগুলি gs://keyviz-art/[painting]_[hours]h.txt থেকে তৈরি করা হয়েছে উদাহরণ: gs://keyviz-art/american_gothic_4h.txt

পেইন্টিং বিকল্প:

  • আমেরিকান_গথিক
  • মোনা_লিসা
  • মুক্তা_কানের দুল
  • অধ্যবসায়_অব_স্মৃতি
  • starry_night
  • রবিবার_বিকাল
  • চিৎকার

ঘন্টা বিকল্প: 1, 4, 8, 12, 24, 48, 72, 96, 120, 144

allUsers Storage Object Viewer ভূমিকা দিয়ে আপনার GCS বালতি বা ফাইলকে সর্বজনীন করুন৷

ee089815364150d2.png

একবার আপনি আপনার ছবি বাছাই করার পরে, এই কমান্ডে --file-path প্যারামিটার পরিবর্তন করুন:

mvn compile exec:java -Dexec.mainClass=keyviz.ReadData \
"-Dexec.args=--bigtableProjectId=$BIGTABLE_PROJECT \
--bigtableInstanceId=$INSTANCE_ID --runner=dataflow \
--bigtableTableId=$TABLE_ID --project=$GOOGLE_CLOUD_PROJECT \
--filePath=gs://keyviz-art/american_gothic_4h.txt"

7. পরে এটি চেক আপ করুন

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

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

8e847f03df25572b.png

কোন মেট্রিক প্রদর্শিত হবে তাও আপনি সামঞ্জস্য করতে পারেন। ওপি আছে, বাইট ক্লায়েন্ট পড়ুন, বাইট ক্লায়েন্ট লিখুন কয়েকটি নাম। "রিড বাইটস ক্লায়েন্ট" মসৃণ চিত্র তৈরি করে বলে মনে হচ্ছে যখন "অপস" আরও লাইন সহ চিত্র তৈরি করে যা কিছু ছবিতে সত্যিই দুর্দান্ত দেখায়।

33eb5dcf4e4be861.png

8. শেষ করুন

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

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

gcloud bigtable instances delete $INSTANCE_ID

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

  • ডেটাফ্লো সহ বিগটেবলে লেখা
  • ডেটাফ্লো সহ বিগটেবল থেকে পড়া (আপনার পাইপলাইনের শুরুতে, আপনার পাইপলাইনের মাঝখানে)
  • ডেটাফ্লো মনিটরিং টুল ব্যবহার করে
  • কী ভিজ্যুয়ালাইজার সহ বিগটেবল মনিটরিং টুল ব্যবহার করা

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