subir fsck commands comandos archivos hadoop hdfs cloudera put biginsights

fsck - Cómo obtener hadoop put para crear directorios si no existen



hdfs fsck command (3)

Ahora deberías usar hadoop fs -mkdir -p <path>

He estado usando el hadoop de Cloudera (0.20.2). Con esta versión, si pongo un archivo en el sistema de archivos, pero la estructura de directorios no existía, se crearon automáticamente los directorios principales:

Entonces, por ejemplo, si no tuviera directorios en hdfs y escribiera:

hadoop fs -put myfile.txt /some/non/existing/path/myfile.txt

Crearía todos los directorios: algunos, no, existentes y ruta y pondría el archivo allí.

Ahora, con una nueva oferta de hadoop (2.2.0), esta creación automática de directorios no está ocurriendo. El mismo comando de arriba rinde:

poner: `/ some / non / existing / path / '': No existe tal archivo o directorio

Tengo una solución para hacer hadoop fs -mkdir primero, para cada puesto, pero esto no va a funcionar bien.

¿Es esto configurable? ¿Algún consejo?


Colocar un archivo en un directorio no existente en hdfs requiere un proceso de dos pasos. Como se indica en @ rt-vybor, use la opción ''-p'' para mkdir para crear múltiples elementos de ruta faltantes. Pero como el OP preguntó cómo colocar el archivo en hdfs, lo siguiente también realiza la colocación de hdfs, y tenga en cuenta que también puede (opcionalmente) verificar que la colocación se realizó correctamente y eliminar condicionalmente la copia local.

Primero cree la ruta del directorio relevante en hdfs, y luego coloque el archivo en hdfs. Desea verificar que el archivo exista antes de colocarlo en hdfs. Y es posible que desee registrar / mostrar que el archivo se ha colocado con éxito en hdfs. Lo siguiente combina todos los pasos.

fn=myfile.txt if [ -f $fn ] ; then bfn=`basename $fn` #trim path from filename hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/ hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn success=$? #check whether file landed in hdfs if [ $success ] ; then echo "remove local copy of file $fn" #rm -f $fn #uncomment if you want to remove file fi fi

Y puede convertir esto en un script de shell, tomando una ruta de hadoop, y una lista de archivos (también crea una sola ruta una vez),

#!/bin/bash hdfsp=${1} shift; hdfs dfs -mkdir -p /here/is/some/non/existant/path/in/hdfs/ for fn in $*; do if [ -f $fn ] ; then bfn=`basename $fn` #trim path from filename hdfs dfs -put $fn /here/is/some/non/existant/path/in/hdfs/$bfn hdfs dfs -ls /here/is/some/non/existant/path/in/hdfs/$bfn >/dev/null success=$? #check whether file landed in hdfs if [ $success ] ; then echo "remove local copy of file $fn" #rm -f $fn #uncomment if you want to remove file fi fi done


hadoop fs ... está en desuso en su lugar usa: hdfs dfs -mkdir ....