Как получить hasoop для создания каталогов, если они не существуют

Я использую 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, но это не будет хорошо работать.

Является ли это настраиваемым? Любые советы?

Ответ 1

Теперь вы должны использовать   hadoop fs -mkdir -p <path>

Ответ 2

hadoop fs ... используется вместо устаревших: hdfs dfs -mkdir ....

Ответ 3

Размещение файла в не существующей директории в 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