Guía para la optimización del rendimiento de MapReduce en HDInsight y Azure Data Lake Storage Gen1

Requisitos previos

Parámetros

Al ejecutar trabajos de MapReduce, estos son los parámetros más importantes que se pueden configurar para aumentar el rendimiento en Data Lake Storage Gen1:

Parámetro Descripción
Mapreduce.map.memory.mb Cantidad de memoria que se va a asignar a cada asignador.
Mapreduce.job.maps Número de tareas de asignación por trabajo.
Mapreduce.reduce.memory.mb Cantidad de memoria que se va a asignar a cada reductor.
Mapreduce.job.reduces Número de tareas de reducción por trabajo.

Mapreduce.map.memory/Mapreduce.reduce.memory

Ajuste este número en función de la cantidad de memoria necesaria para la tarea de asignación o reducción. Puede ver los valores predeterminados de mapreduce.map.memory y mapreduce.reduce.memory en Ambari a través de la configuración de Yarn. En Ambari, navegue a YARN y examine la pestaña Configs (Configuraciones). Se mostrará la memoria YARN.

Mapreduce.job.maps/Mapreduce.job.reduces

Determina el número máximo de asignadores o reductores que se van a crear. El número de divisiones determinará cuántos asignadores se crearán para el trabajo de MapReduce. Por lo tanto, puede que obtenga menos asignadores que los que solicitó si hay menos divisiones que el número de asignadores solicitados.

Guía

Paso 1: Determinación del número de trabajos en ejecución

De forma predeterminada, MapReduce usará todo el clúster para el trabajo. Puede usar una cantidad menor del clúster usando menos asignadores que los contenedores disponibles. En las instrucciones de este documento se asume que la aplicación es la única aplicación que se ejecuta en el clúster.

Paso 2: Establecimiento de mapreduce.map.memory/mapreduce.reduce.memory

El tamaño de la memoria para las tareas de asignación y reducción dependerá del trabajo específico. Puede reducir el tamaño de memoria si quiere aumentar la simultaneidad. El número de tareas en ejecución al mismo tiempo depende del número de contenedores. Al reducir la cantidad de memoria por asignador o reductor, pueden crearse más contenedores, que permiten que más asignadores o reductores se ejecuten a la vez. Si se reduce demasiado la cantidad de memoria puede provocar que algunos procesos se ejecuten con memoria insuficiente. Si recibe un error de montón al ejecutar el trabajo, aumente la memoria por asignador o reductor. Tenga en cuenta que la adición de más contenedores supondrá una sobrecarga adicional para cada contenedor de más, lo que podría reducir el rendimiento. Otra alternativa consiste en obtener más memoria mediante un clúster que tenga mayor cantidad de memoria o aumentar el número de nodos en el clúster. Más memoria permitirá que se usen más contenedores, lo que se traduce en una mayor simultaneidad.

Paso 3: Determinación de la memoria de YARN total

Para optimizar mapreduce.job.maps/mapreduce.job.reduces, considere la cantidad de memoria de YARN total disponible para su uso. Esta información está disponible en Ambari. Navegue a YARN y examine la pestaña Configs (Configuraciones). En esta ventana se muestra el tamaño de la memoria de YARN. Para obtener la memoria de YARN total, multiplique la memoria de YARN por el número de nodos que tiene en el clúster.

Total YARN memory = nodes * YARN memory per node

Si va a usar un clúster vacío, la memoria puede ser la memoria de YARN total para el clúster. Si otras aplicaciones usan memoria, puede elegir usar solamente una parte de la memoria del clúster; para ello, reduzca el número de asignadores o reductores al número de contenedores que quiere usar.

Paso 4: Cálculo del número de contenedores de YARN

Los contenedores YARN dictaminan la cantidad de simultaneidad disponible para el trabajo. Tome la memoria de YARN total y divídala entre el valor de mapreduce.map.memory.

# of YARN containers = total YARN memory / mapreduce.map.memory

Paso 5: Establecimiento de mapreduce.job.maps/mapreduce.job.reduces

Establece mapreduce.job.maps/mapreduce.job.reduces en al menos el número de contenedores disponibles. Puede seguir experimentando y aumentar el número de asignadores y reductores para ver si obtiene mejor rendimiento. Tenga en cuenta que cuantos más asignadores más sobrecarga, por lo que tener demasiados asignadores puede reducir el rendimiento.

Nota: la programación de CPU y el aislamiento de CPU están desactivadas de forma predeterminada, de modo que el número de contenedores de YARN está restringido por la memoria.

Cálculo de ejemplo

Supongamos que tiene actualmente un clúster compuesto de 8 nodos D14 y quiere ejecutar un trabajo de uso intensivo de E/S. Estos son los cálculos que se debe realizar:

Paso 1: Determinación del número de trabajos en ejecución

En nuestro ejemplo, suponemos que nuestro trabajo es el único en ejecución.

Paso 2: Establecimiento de mapreduce.map.memory/mapreduce.reduce.memory

En nuestro ejemplo, ejecuta un trabajo con uso intensivo de operaciones de E/S y decide que 3 GB de memoria para las tareas de asignación serán suficientes.

mapreduce.map.memory = 3GB

Paso 3: Determinación de la memoria de YARN total

total memory from the cluster is 8 nodes * 96GB of YARN memory for a D14 = 768GB

Paso 4: Cálculo del número de contenedores de YARN

# of YARN containers = 768 GB of available memory / 3 GB of memory = 256

Paso 5: Establecimiento de mapreduce.job.maps/mapreduce.job.reduces

mapreduce.map.jobs = 256

Limitaciones

Límite de Data Lake Storage Gen1

Como servicio multiinquilino, Data Lake Storage Gen1 establece los límites de ancho de banda de nivel de cuenta. Si se alcanzan estos límites, comenzará a ver errores de tarea. Para identificar esta situación, observe los errores de limitación en los registros de tareas. Si necesita más ancho de banda para su trabajo, póngase en contacto con nosotros.

Para comprobar si le están aplicando limitaciones, debe habilitar el registro de depuración en el lado del cliente. Así es cómo debe hacerlo:

  1. Coloque la propiedad siguiente en las propiedades log4j en Ambari > YARN > Config > (Configuración) Advanced (Opciones avanzadas) yarn-log4j: log4j.logger.com.microsoft.azure.datalake.store=DEBUG

  2. Reinicie todos los nodos/servicios para que la configuración surta efecto.

  3. Si se le están aplicando límites, verá el código de error HTTP 429 en el archivo de registro de YARN. El archivo de registro de YARN se encuentra en /tmp/<user>/yarn.log

Ejemplos de ejecución

Para demostrar cómo MapReduce se ejecuta en Data Lake Storage Gen1, a continuación se muestra código de ejemplo que se ejecutó en un clúster con la siguiente configuración:

  • 16 nodos D14v2
  • Clúster de Hadoop con HDI 3.6

Como punto de partida, estos son algunos comandos de ejemplo para ejecutar MapReduce: Teragen, Terasort y Teravalidate. Puede ajustar estos comandos en función de los recursos.

Teragen

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teragen -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 10000000000 adl://example/data/1TB-sort-input

Terasort

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar terasort -Dmapreduce.job.maps=2048 -Dmapreduce.map.memory.mb=3072 -Dmapreduce.job.reduces=512 -Dmapreduce.reduce.memory.mb=3072 adl://example/data/1TB-sort-input adl://example/data/1TB-sort-output

Teravalidate

yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-mapreduce-examples.jar teravalidate -Dmapreduce.job.maps=512 -Dmapreduce.map.memory.mb=3072 adl://example/data/1TB-sort-output adl://example/data/1TB-sort-validate