2011-09-20 34 views
23

Estoy ejecutando colmenas en EMR, y necesito copiar algunos archivos en todas las instancias de EMR.¿Cómo copio archivos de S3 a Amazon EMR HDFS?

Una forma que entiendo es simplemente copiar archivos al sistema de archivos local en cada nodo, el otro es copiar los archivos al HDFS, pero no he encontrado una manera simple de copiar stright de S3 a HDFS.

¿Cuál es la mejor manera de hacerlo?

Respuesta

26

la mejor manera de hacerlo es usar el comando distcp de Hadoop. Ejemplo (en uno de los nodos del clúster):

% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile

Esto copiar un archivo denominado myfile de un MyBucket llamado S3 cubo para /root/myfile en HDFS. Tenga en cuenta que este ejemplo asume que está utilizando el sistema de archivos S3 en modo "nativo"; esto significa que Hadoop ve cada objeto en S3 como un archivo. Si usa S3 en modo bloque, reemplazará s3n por s3 en el ejemplo anterior. Para obtener más información sobre las diferencias entre S3 nativo y el modo de bloque, así como una explicación sobre el ejemplo anterior, consulte http://wiki.apache.org/hadoop/AmazonS3.

Encontré que distcp es una herramienta muy poderosa. Además de poder usarlo para copiar una gran cantidad de archivos dentro y fuera de S3, también puede realizar copias rápidas de clúster a clúster con grandes conjuntos de datos. En lugar de empujar todos los datos a través de un solo nodo, distcp utiliza múltiples nodos en paralelo para realizar la transferencia. Esto hace que distcp sea considerablemente más rápido cuando se transfieren grandes cantidades de datos, en comparación con la alternativa de copiar todo en el sistema de archivos local como intermediario.

+0

sigue recibiendo un error al mover s3 a hdfs con distcp. en mi caso, estoy tratando de mover un archivo muy grande (más de 300 GB) después de mover el 40 o 50%, comienza la forma inicial y no sé por qué. ¿¿alguna idea?? – rht

3

Tenga en cuenta que según Amazon, en http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html "Amazon Elastic MapReduce - archivo de configuración del sistema", el S3 Bloque de sistema de archivos es obsoleto y su prefijo URI está ahora s3bfs: // y específicamente desalentar a usarlo ya que" puede desencadenar una condición de carrera que podría causar que falle el flujo de trabajo ".

De acuerdo con la misma página, HDFS ahora es el sistema de archivos de "primera clase" en S3 aunque es efímero (desaparece cuando los trabajos de Hadoop finalizan).

15

Ahora Amazon tiene un contenedor implementado sobre distcp, a saber: s3distcp.

S3DistCp es una extensión de DistCp que está optimizado para trabajar con Amazon Web Services (AWS), particularmente Amazon simple servicio de almacenamiento (Amazon S3). Utiliza S3DistCp agregándolo como un paso en un flujo de trabajo. Con S3DistCp, puede copiar eficientemente grandes cantidades de datos de Amazon S3 a HDFS, donde se pueden procesar siguiendo los pasos subsiguientes en su flujo de trabajo de Amazon Elastic MapReduce (Amazon EMR). También puede utilizar S3DistCp para copiar datos entre cubos de Amazon S3 o desde HDFS a Amazon S3

Ejemplo Copiar los archivos de registro de Amazon S3 para hdfs

Este siguiente ejemplo ilustra cómo copiar los archivos de registro almacenado en un cubo de Amazon S3 en HDFS. En este ejemplo, la opción --srcPattern se usa para limitar los datos copiados a los registros de daemon.

elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \ 
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar \ 
--args '--src,s3://myawsbucket/logs/j-3GY8JC4179IOJ/node/,\ 
--dest,hdfs:///output,\ 
--srcPattern,.*daemons.*-hadoop-.*'