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 ....