Ответ 1
Теперь вы должны использовать hadoop fs -mkdir -p <path>
Я использую Cloudera hadoop (0.20.2). В этой версии, если я помещаю файл в файловую систему, но структура каталогов не существует, он автоматически создает родительские каталоги:
Так, например, если у меня не было каталогов в hdfs и набрано:
hadoop fs -put myfile.txt/some/non/existing/path/myfile.txt
Он создавал бы все каталоги: некоторые, не, существующие и путь и помещал туда файл.
Теперь, с новым предложением hadoop (2.2.0) это автоматическое создание каталогов не происходит. Эта же команда выше дает:
put: `/some/non/existing/path/': Нет такого файла или каталога
У меня есть обход, чтобы просто сделать hadoop fs -mkdir во-первых, для каждого put, но это не будет хорошо работать.
Является ли это настраиваемым? Любые советы?
Теперь вы должны использовать hadoop fs -mkdir -p <path>
hadoop fs ...
используется вместо устаревших: hdfs dfs -mkdir ....
Размещение файла в не существующей директории в hdfs требует двухэтапного процесса. Как указано в @rt-vybor, используйте параметр -p для mkdir для создания нескольких отсутствующих элементов пути. Но поскольку ОП задал вопрос о том, как поместить файл в hdfs, следующий также выполнит hdfs put, и обратите внимание, что вы также можете (необязательно) проверить, что put успешно, и условно удалить локальную копию.
Сначала создайте соответствующий путь каталога в hdfs, а затем поместите файл в hdf. Вы хотите проверить, существует ли файл до размещения в hdf. И вы можете захотеть записать/показать, что файл был успешно помещен в hdf. Следующее объединяет все этапы.
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
И вы можете превратить это в оболочку script, используя путь hadoop и список файлов (также создайте путь один раз),
#!/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