Bigtable ve Dataflow: Database Monitoring Art (HBase Java İstemcisi)

1. Giriş

Bu codelab'de Cloud Dataflow ve Java HBase istemcisi ile veri yazma ve okuma yoluyla çeşitli sanat eserleri oluşturmak için Cloud Bigtable'ın izleme araçlarını kullanacaksınız.

Neler öğreneceksiniz?

  • Cloud Dataflow'u kullanarak Bigtable'a büyük miktarlarda veri yükleme
  • Verileriniz beslenirken Bigtable örneklerini ve tablolarını izleyin
  • Dataflow işi kullanarak Bigtable'ı sorgulama
  • Şema tasarımınız nedeniyle hotspot'ları bulmak için kullanılabilecek temel görselleştirici aracını keşfedin
  • Tuş görselleştiriciyi kullanarak poster oluşturun

d098cc81f78f02eb.png

Cloud Bigtable kullanım deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

2. Bigtable veritabanınızı oluşturma

Cloud Bigtable, Google'ın NoSQL Büyük Veri veritabanı hizmetidir. Bu hizmet; Arama, Analytics, Haritalar ve Gmail dahil olmak üzere birçok temel Google hizmetini destekleyen veritabanıdır. Büyük analitik iş yüklerini çalıştırmak ve düşük gecikme süreli uygulamalar oluşturmak için idealdir. Kapsamlı bir giriş için Cloud Bigtable Codelab'e Giriş sayfasına göz atın.

Proje oluşturma

İlk olarak yeni bir proje oluşturun. "Cloud Shell'i etkinleştir"i tıklayarak açabileceğiniz yerleşik Cloud Shell'i kullanın. düğmesini tıklayın.

a74d156ca7862b28.png

Codelab komutlarının kopyalanıp yapıştırılmasını kolaylaştırmak için aşağıdaki ortam değişkenlerini ayarlayın:

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

Cloud Shell'de bu codelab'de kullanacağınız araçlar, gcloud komut satırı aracı, cbt komut satırı arayüzü ve Maven halihazırda yüklüdür.

Bu komutu çalıştırarak Cloud Bigtable API'lerini etkinleştirin.

gcloud services enable bigtable.googleapis.com bigtableadmin.googleapis.com

Aşağıdaki komutu çalıştırarak bir örnek oluşturun:

gcloud bigtable instances create $INSTANCE_ID \
    --cluster=$CLUSTER_ID \
    --cluster-zone=$CLUSTER_ZONE \
    --cluster-num-nodes=$CLUSTER_NUM_NODES \
    --display-name=$INSTANCE_ID

Örneği oluşturduktan sonra cbt yapılandırma dosyasını doldurun ve ardından aşağıdaki komutları çalıştırarak tablo ve sütun ailesi oluşturun:

echo project = $GOOGLE_CLOUD_PROJECT > ~/.cbtrc
echo instance = $INSTANCE_ID >> ~/.cbtrc

cbt createtable $TABLE_ID
cbt createfamily $TABLE_ID cf

3. Öğrenin: Dataflow ile Bigtable'da Kod Yazma

Yazmayla ilgili temel bilgiler

Cloud Bigtable'a yazarken CloudBigtableTableConfiguration yapılandırma nesnesi sağlamanız gerekir. Bu nesne, tablonuzun proje kimliğini ve örnek kimliğini ve tablonun adını belirtir:

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

Ardından ardışık düzeniniz, Put ve Delete dahil olmak üzere HBase Mutation nesnelerini iletebilir.

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

LoadData Dataflow işi

Sonraki sayfada LoadData işini nasıl çalıştıracağınız gösterilecek, ancak burada ardışık düzenin önemli bölümlerini anlatacağım.

Veri üretmek için, birkaç megabayt rastgele veri içeren bir dizi satır yazmak amacıyla GenerateSequence sınıfını (for döngüye benzer şekilde) kullanan bir ardışık düzen oluşturacaksınız. Satır anahtarı, doldurulan ve ters çevrilmiş sıra numarası olacağından 250, 0000000052 olur.

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'da veri oluşturun ve girişi izleyin

Aşağıdaki komutlar, tablonuza 40 GB'lık veri oluşturan bir dataflow işi çalıştırır. Bu, Key Visualizer'ın etkinleştirmesi için yeterli değildir:

Cloud Dataflow API'yi etkinleştirme

gcloud services enable dataflow.googleapis.com

Kodu github'dan alın ve dizine değiştirin

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

Verileri oluşturun (Komut dosyasının tamamlanması yaklaşık 15 dakika sürer)

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"

İçe aktarmayı izleme

İşi Cloud Dataflow kullanıcı arayüzünde izleyebilirsiniz. Ayrıca izleme kullanıcı arayüzü ile Cloud Bigtable örneğinizdeki yükü görüntüleyebilirsiniz.

Dataflow kullanıcı arayüzünde iş grafiğinin yanı sıra işlenen öğeler, mevcut vCPU'lar ve işleme hızı dahil çeşitli iş metriklerini görebilirsiniz.

9cecc290f5acea15.png

abb0561342dc6b60.png

Bigtable; örnek, küme ve tablo düzeyinde okuma/yazma işlemleri, kullanılan depolama alanı, hata oranı ve daha fazlası için standart izleme araçlarına sahiptir. Bunun yanı sıra, Bigtable'da en az 30 GB veri oluşturulduktan sonra kullanılacak satır tuşlarına göre kullanımınızı ayıran Temel Görselleştirici de vardır.

996f8589332dfc19.png

5. Öğrenin: Dataflow ile Bigtable'dan okuma

Okuma ile ilgili temel bilgiler

Cloud Bigtable'dan okuma yaparken bir CloudBigtableTableScanConfiguration yapılandırma nesnesi sağlamanız gerekir. CloudBigtableTableConfiguration parametresine benzerdir ancak taranacak ve okunacak satırları belirtebilirsiniz.

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

Ardından ardışık düzeninizi başlatmak için bunu kullanın:

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

Ancak ardışık düzeninizin bir parçası olarak okuma yapmak isterseniz AbstractCloudBigtableTableDoFn öğesini genişleten doFn öğesine CloudBigtableTableConfiguration aktarabilirsiniz.

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

Ardından yapılandırmanızla birlikte super() adlı kuruluşu, dağıtılmış bağlantı almak için de getConnection() çağrısı yapın.

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 Dataflow işi

Bu codelab için saniyede bir tablodan okuma yapmanız gerekir. Böylece ardışık düzeninizi, girilen bir CSV dosyasının süresine göre birden fazla okuma aralığını tetikleyen, oluşturulmuş bir sıra ile başlatabilirsiniz.

Belirli bir zamanda hangi satır aralıklarının taranacağını belirlemek için matematik işlemleri yapmak gerekir, ancak daha fazla bilgi edinmek isterseniz dosya adını tıklayarak kaynak kodu görüntüleyebilirsiniz.

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. Başyapıtınızı oluşturma

ad9c4c0b90626a3b.png

Artık Bigtable'a veri yüklemeyi ve Dataflow ile buradan veri okumayı öğrendiğinize göre 8 saatte Mona Lisa'nın resmini oluşturan son komutu çalıştırabilirsiniz.

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"

Kullanabileceğiniz mevcut resimlerin bulunduğu bir paket vardır. Alternatif olarak, bu aracı kullanarak kendi görüntülerinizden bir giriş dosyası oluşturabilir ve bunları herkese açık bir GCS paketine yükleyebilirsiniz.

Dosya adları gs://keyviz-art/[painting]_[hours]h.txt örneğinden alınmıştır: gs://keyviz-art/american_gothic_4h.txt

boyama seçenekleri:

  • american_gothic
  • mona_lisa
  • pearl_earring
  • persistence_of_memory
  • starry_night
  • sunday_afternoon
  • the_scream

saat seçenekleri: 1, 4, 8, 12, 24, 48, 72, 96, 120, 144

allUsers kullanıcısına Storage Object Viewer rolünü vererek GCS paketinizi veya dosyanızı herkese açık hale getirin.

ee089815364150d2.png

Resminizi seçtikten sonra, bu komuttaki --file-path parametresini değiştirmeniz yeterlidir:

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. Daha sonra tekrar kontrol edin

Resmin tam olarak görünmesi birkaç saat sürebilir ancak 30 dakika sonra tuş görselleştiricide etkinlik görmeye başlamanız gerekir. Kullanabileceğiniz çeşitli parametreler vardır: yakınlaştırma, parlaklık ve metrik. Farenizdeki kaydırma tekerleğini kullanarak veya tuş görselleştirici ızgarasında bir dikdörtgen sürükleyerek yakınlaştırabilirsiniz.

Parlaklık, resmin ölçeklendirmesini değiştirir. Bu özellik, çok sıcak bir alanı ayrıntılı olarak incelemek istediğinizde kullanışlıdır.

8e847f03df25572b.png

Hangi metriğin görüntüleneceğini de ayarlayabilirsiniz. OP, okuma baytı istemci, yazma baytları istemci gibi bazı yöntemleri bulunur. "İstemcinin baytını oku" "Ops" sırasında akıcı görüntüler üretiyor gibi görünüyor. bazı resimlerde çok güzel görünebilecek daha fazla çizgi içeren resimler üretir.

33eb5dcf4e4be861.png

8. Sonlandır

Ücret almamak için yer açın

Bu codelab'de kullanılan kaynaklar için Google Cloud Platform hesabınızın ücretlendirilmesini önlemek amacıyla örneğinizi silmeniz gerekir.

gcloud bigtable instances delete $INSTANCE_ID

İşlediklerimiz

  • Dataflow ile Bigtable'da yazma
  • Dataflow ile Bigtable'dan okuma (Ardışık düzeninizin başında, Ardışık düzeninizin ortasında)
  • Dataflow izleme araçlarını kullanma
  • Key Visualizer dahil olmak üzere Bigtable izleme araçlarını kullanma

Sonraki adımlar