Hadoop-MapReduce-Job mit Bigtable

In diesem Beispiel wird Hadoop verwendet, um einen einfachen MapReduce-Job auszuführen, der zählt, wie oft ein Wort in einer Textdatei vorkommt. Der MapReduce-Job verwendet Bigtable zum Speichern der Ergebnisse des Zuordnungsvorgangs. Der Code für dieses Beispiel ist im GitHub-Repository GoogleCloudPlatform/cloud-bigtable-examples im Verzeichnis java/dataproc-wordcount enthalten.

Authentifizierung einrichten

Wenn Sie die Java-Beispiele auf dieser Seite aus einer lokalen Entwicklungsumgebung heraus verwenden möchten, installieren und initialisieren Sie die gcloud CLI und richten dann die Standardanmeldedaten für Anwendungen mit Ihren Nutzeranmeldedaten ein.

  1. Installieren Sie die Google Cloud CLI.
  2. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  3. Erstellen Sie lokale Anmeldedaten zur Authentifizierung für Ihr Google-Konto:

    gcloud auth application-default login

Weitere Informationen: Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

Überblick über das Codebeispiel

Das Codebeispiel stellt eine einfache Befehlszeile zur Verfügung, die als Eingabe eine oder mehrere Textdateien und einen Tabellennamen benötigt. Es findet alle Wörter, die in der Datei vorkommen, und zählt, wie oft jedes Wort vorkommt. Die MapReduce-Logik befindet sich in der Klasse WordCountHBase.

Zuerst führt ein Mapper eine Tokenisierung der Inhalte der Textdatei durch. Er generiert Schlüssel/Wert-Paare, wobei der Schlüssel ein Wort aus der Textdatei und der Wert 1 ist:

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

Ein Reduzierer summiert dann die Werte für jeden Schlüssel und schreibt die Ergebnisse in eine von Ihnen festgelegte Bigtable-Tabelle. Jeder Zeilenschlüssel ist ein Begriff aus der Textdatei. Jede Zeile enthält eine Spalte cf:count, die angibt, wie oft der Zeilenschlüssel in der Textdatei vorkommt.

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