Tugas Hadoop MapReduce dengan Bigtable

Contoh ini menggunakan Hadoop untuk menjalankan tugas MapReduce sederhana yang menghitung jumlah kemunculan kata dalam file teks. Tugas MapReduce menggunakan Bigtable untuk menyimpan hasil operasi peta. Kode untuk contoh ini ada di repositori GitHub GoogleCloudPlatform/cloud-bigtable-examples, di direktori java/dataproc-wordcount.

Menyiapkan autentikasi

Untuk menggunakan contoh Java di halaman ini dalam lingkungan pengembangan lokal, instal dan lakukan inisialisasi gcloud CLI, lalu siapkan Kredensial Default Aplikasi dengan kredensial pengguna Anda.

  1. Instal Google Cloud CLI.

  2. Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus terlebih dahulu login ke gcloud CLI dengan identitas gabungan Anda.

  3. Jika Anda menggunakan shell lokal, buat kredensial autentikasi lokal untuk akun pengguna Anda:

    gcloud auth application-default login

    Anda tidak perlu melakukan hal ini jika menggunakan Cloud Shell.

    Jika error autentikasi ditampilkan, dan Anda menggunakan penyedia identitas (IdP) eksternal, pastikan Anda telah login ke gcloud CLI dengan identitas gabungan Anda.

Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

Ringkasan contoh kode

Contoh kode ini menyediakan antarmuka command line sederhana yang menggunakan satu atau beberapa file teks dan nama tabel sebagai input, menemukan semua kata yang muncul dalam file, dan menghitung jumlah kemunculan setiap kata. Logika MapReduce muncul di WordCountHBase class.

Pertama, pemeta melakukan tokenisasi konten file teks dan menghasilkan pasangan nilai kunci, dengan kunci adalah kata dari file teks dan nilainya adalah 1:

public static class TokenizerMapper extends
    Mapper<Object, Text, ImmutableBytesWritable, IntWritable> {

  private final static IntWritable one = new IntWritable(1);

  @Override
  public void map(Object key, Text value, Context context) throws IOException,
      InterruptedException {
    StringTokenizer itr = new StringTokenizer(value.toString());
    ImmutableBytesWritable word = new ImmutableBytesWritable();
    while (itr.hasMoreTokens()) {
      word.set(Bytes.toBytes(itr.nextToken()));
      context.write(word, one);
    }
  }
}

Kemudian, pereduksi menjumlahkan nilai untuk setiap kunci dan menulis hasilnya ke tabel Bigtable yang Anda tentukan. Setiap kunci baris adalah kata dari file teks. Setiap baris berisi kolom cf:count, yang berisi jumlah kemunculan kunci baris dalam file teks.

public static class MyTableReducer extends
    TableReducer<ImmutableBytesWritable, IntWritable, ImmutableBytesWritable> {

  @Override
  public void reduce(ImmutableBytesWritable key, Iterable<IntWritable> values, Context context)
      throws IOException, InterruptedException {
    int sum = sum(values);
    Put put = new Put(key.get());
    put.addColumn(COLUMN_FAMILY, COUNT_COLUMN_NAME, Bytes.toBytes(sum));
    context.write(null, put);
  }

  public int sum(Iterable<IntWritable> values) {
    int i = 0;
    for (IntWritable val : values) {
      i += val.get();
    }
    return i;
  }
}