Job Hadoop MapReduce con Bigtable

Questo esempio utilizza Hadoop per eseguire un semplice job MapReduce che conta il numero di volte in cui una parola compare in un file di testo. Il job MapReduce utilizza Bigtable per archiviare i risultati dell'operazione di mapping. 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 esempi Java in questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

  1. Installa Google Cloud CLI.

  2. Configura gcloud CLI per utilizzare la tua identità federata.

    Per saperne di più, consulta Accedi a gcloud CLI con la tua identità federata.

  3. Crea credenziali di autenticazione locali per il tuo account utente:

    gcloud auth application-default login

    Se viene restituito un errore di autenticazione, verifica di aver eseguito l'accesso a gcloud CLI con la tua identità federata.

Per saperne di più, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

Panoramica dell'esempio di codice

L'esempio di codice fornisce una semplice interfaccia a riga di comando che accetta uno o più file di testo e un nome di tabella come input, trova tutte le parole che compaiono nel file e conta quante volte compare ogni parola. La logica MapReduce viene visualizzata nella classe 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 reducer somma quindi i valori per ogni chiave e scrive i risultati in una tabella Bigtable che hai specificato. Ogni chiave di riga è una parola del file di testo. Ogni riga contiene una colonna cf:count, che contiene il numero di volte in cui la chiave di riga appare 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;
  }
}