Job Hadoop MapReduce con Bigtable

Questo esempio utilizza Hadoop per eseguire un semplice job MapReduce che conteggia il numero di volte in cui una parola compare in un file di testo. Il job MapReduce utilizza Bigtable per memorizzare i risultati dell'operazione di mappatura. Il codice per questo esempio si trova nel repository GitHub GoogleCloudPlatform/cloud-bigtable-examples, nella directory java/dataproc-wordcount.

Configura l'autenticazione

Per utilizzare gli Java esempi in questa pagina in un ambiente di sviluppo locale, installa e inizializza l'interfaccia a riga di comando gcloud, quindi configura le credenziali predefinite dell'applicazione con le tue credenziali utente.

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

Per ulteriori informazioni, consulta Set up authentication for a local development environment.

Panoramica dell'esempio di codice

L'esempio di codice fornisce una semplice interfaccia a riga di comando che prende uno o più file di testo e il nome di una tabella come input, trova tutte le parole che compaiono nel e conta le occorrenze di ogni parola. Viene visualizzata la logica MapReduce del corso WordCountHBase.

Innanzitutto, un mapper tokenizza i contenuti del file di testo e genera coppie chiave-valore, in cui la chiave è una parola del file di testo e il valore è 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);
    }
  }
}

Un riduttore somma quindi i valori per ogni chiave e scrive i risultati in una tabella Bigtable specificata. Ogni chiave di riga è una parola del file di testo. Ogni riga contiene una colonna cf:count, che contiene il numero di volte che la chiave riga viene visualizzata nel file di testo.

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