mac - hadoop gz
Escribiendo datos a Hadoop (8)
Necesito escribir datos en Hadoop (HDFS) desde fuentes externas como un cuadro de Windows. En este momento, he estado copiando los datos en el namenode y utilizando el comando put de HDFS para ingerirlos en el clúster. En mi búsqueda del código no vi una API para hacer esto. Espero que alguien pueda mostrarme que estoy equivocado y que hay una manera fácil de codificar clientes externos contra HDFS.
Ahora también puede intentar usar Talend, que incluye componentes para la integración de Hadoop.
Aproximadamente 2 años después de mi última respuesta, ahora hay dos nuevas alternativas: Hoop / HttpFS y WebHDFS.
En cuanto a Hoop, se anunció por primera vez en el blog de Cloudera y se puede descargar desde un repositorio de github . Logré que esta versión hablara con éxito al menos con Hadoop 0.20.1, probablemente también pueda hablar con versiones ligeramente más antiguas.
Si está ejecutando Hadoop 0.23.1, que en el momento de la escritura aún no está disponible, Hoop es parte de Hadoop como su propio componente, el HttpFS. Este trabajo se realizó como parte de HDFS-2178 . Hoop / HttpFS puede ser un proxy no solo para HDFS, sino también para otros sistemas de archivos compatibles con Hadoop como Amazon S3.
Hoop / HttpFS se ejecuta como su propio servicio independiente.
También hay WebHDFS que se ejecuta como parte de los servicios NameNode y DataNode. También proporciona una API REST que, si entiendo correctamente, es compatible con la API HttpFS. WebHDFS es parte de Hadoop 1.0 y una de sus características principales es que proporciona una localidad de datos: cuando realice una solicitud de lectura, se le redirigirá al componente WebHDFS en el nodo de datos donde residen los datos.
El componente que elija depende un poco de su configuración actual y de las necesidades que tenga. Si necesita una interfaz HTTP REST para HDFS ahora y está ejecutando una versión que no incluye WebHDFS, comenzar con Hoop desde el repositorio de github parece ser la opción más fácil. Si está ejecutando una versión que incluye WebHDFS, buscaría eso a menos que necesite algunas de las características que Hoop tiene que carecen de WebHDFS (acceso a otros sistemas de archivos, limitación de ancho de banda, etc.)
Hay una API en Java. Puede usarlo incluyendo el código de Hadoop en su proyecto. El JavaDoc es bastante útil en general, pero, por supuesto, debe saber lo que está buscando * g * http://hadoop.apache.org/common/docs/
Para su problema particular, eche un vistazo a: http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileSystem.html (esto se aplica a la última versión, consulte otros JavaDocs para diferentes versiones!)
Una llamada típica sería: Filesystem.get(new JobConf()).create(new Path("however.file"));
Lo que te devuelve una secuencia que puedes manejar con JavaIO regular.
Para el problema de cargar los datos que necesitaba colocar en HDFS, elijo cambiar el problema.
En lugar de cargar los archivos a HDFS desde el servidor donde residían, escribí un trabajo Java Map / Reduce donde el asignador leyó el archivo desde el servidor de archivos (en este caso, a través de https), luego lo escribí directamente en HDFS (a través de http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/fs/FileSystem.html ).
La lista de archivos se lee desde la entrada. Luego tengo una secuencia de comandos externa que llena un archivo con la lista de archivos para recuperar, carga el archivo en HDFS (usando hadoop dfs -put ), luego inicie el trabajo de asignación / reducción con un número decente de asignadores.
Esto me da un excelente rendimiento de transferencia, ya que varios archivos se leen / escriben al mismo tiempo.
Tal vez no sea la respuesta que buscabas, pero espero que sea útil de todos modos :-).
Parece que ahora hay una página dedicada para esto en http://wiki.apache.org/hadoop/MountableHDFS :
Estos proyectos (enumerados a continuación) permiten montar HDFS (en la mayoría de las versiones de Unix) como un sistema de archivos estándar mediante el comando mount. Una vez montado, el usuario puede operar en una instancia de hdfs usando utilidades estándar de Unix como ''ls'', ''cd'', ''cp'', ''mkdir'', ''find'', ''grep'', o usar bibliotecas estándar de Posix como open, escribe, lee, cierra desde C, C ++, Python, Ruby, Perl, Java, bash, etc.
Posteriormente se describen estos proyectos.
- contrib / fuse-dfs se basa en un fusible, algo de pegamento C, libhdfs y el hadoop-dev.jar
- fuse-j-hdfs se basa en fuse, fuse para java y hadoop-dev.jar
- hdfs-fuse - un proyecto de código de Google es muy similar a contrib / fuse-dfs
- webdav - hdfs expuesto como un recurso de webdav mapR - contiene un sistema de archivos compatible de hdfs de código cerrado que admite el acceso NFS de lectura / escritura
- HDFS NFS Proxy: exporta HDFS como NFS sin utilizar un fusible. Admite Kerberos y reordena las escrituras para que se escriban en hdfs de forma secuencial.
No he probado ninguno de estos, pero actualizaré la respuesta pronto ya que tengo la misma necesidad que el OP
También puede utilizar HadoopDrive ( http://hadoopdrive.effisoft.eu ). Es una extensión de shell de Windows.
puede intentar montar HDFS en su máquina (llámelo machine_X) donde está ejecutando su código y machine_X debe tener conectividad infinita con el HDFS. Verifique esto, https://wiki.apache.org/hadoop/MountableHDFS
Instale Cygwin, instale Hadoop localmente (solo necesita el binario y las configuraciones que apuntan a su NN, no es necesario ejecutar los servicios), ejecute hadoop fs -copyFromLocal /path/to/localfile /hdfs/path/
También puede usar el nuevo escritorio de Cloudera para cargar un archivo a través de la interfaz de usuario web, aunque podría no ser una buena opción para archivos gigantes.
También hay una superposición de WebDAV para HDFS, pero no sé qué tan estable / confiable sea.