Tarea de MapReduce de Hadoop con Bigtable

En este ejemplo se usa Hadoop para realizar una tarea MapReduce sencilla que cuenta el número de veces que aparece una palabra en un archivo de texto. El trabajo de MapReduce usa Bigtable para almacenar los resultados de la operación de asignación. El código de este ejemplo se encuentra en el repositorio de GitHub GoogleCloudPlatform/cloud-bigtable-examples, en el directorio java/dataproc-wordcount.

Configurar la autenticación

Para usar las Java muestras de esta página en un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, a continuación, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    Instala Google Cloud CLI.

    Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    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.

    If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

Para obtener más información, consulta Set up authentication for a local development environment.

Información general sobre el código de ejemplo

El ejemplo de código proporciona una interfaz de línea de comandos sencilla que toma como entrada uno o varios archivos de texto y un nombre de tabla, busca todas las palabras que aparecen en el archivo y cuenta cuántas veces aparece cada palabra. La lógica de MapReduce aparece en la clase WordCountHBase.

En primer lugar, un mapper tokeniza el contenido del archivo de texto y genera pares clave-valor, donde la clave es una palabra del archivo de texto y el valor es 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);
    }
  }
}

A continuación, un reductor suma los valores de cada clave y escribe los resultados en una tabla de Bigtable que hayas especificado. Cada clave de fila es una palabra del archivo de texto. Cada fila contiene una columna cf:count, que incluye el número de veces que aparece la clave de fila en el archivo de texto.

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