Подтвердить что ты не робот

Перенос файла из HDFS

Я хочу перенести файлы из HDFS в локальную файловую систему другого сервера, который не находится в кластере hadoop, но в сети.

Я мог бы сделать:

hadoop fs -copyToLocal <src> <dest>
and then scp/ftp <toMyFileServer>.

Поскольку данные огромны и из-за ограниченного пространства на локальной файловой системе шлюзовой машины hadoop, я хотел избежать этого и отправлять данные непосредственно на мой файловый сервер.

Помогите с некоторыми указателями в том, как справиться с этой проблемой.

4b9b3361

Ответ 1

Таким образом, у вас, вероятно, есть файл с кучей деталей в качестве результата из вашей программы hadoop.

part-r-00000
part-r-00001
part-r-00002
part-r-00003
part-r-00004

Итак, давайте делать одну часть за раз?

for i in `seq 0 4`;
do
hadoop fs -copyToLocal output/part-r-0000$i ./
scp ./part-r-0000$i [email protected]:/home/you/
rm ./part-r-0000$i
done

Возможно, вам придется искать модификатор пароля для scp

Ответ 2

Это самый простой способ сделать это:

ssh <YOUR_HADOOP_GATEWAY> "hdfs dfs -cat <src_in_HDFS> " > <local_dst>

Он также работает для двоичных файлов.

Ответ 3

Я думаю, что самым простым решением было бы сетевое подключение или SSHFS для локального локального локального каталога файлового сервера.
Вы также можете монтировать FTP в качестве локального каталога: http://www.linuxnix.com/2011/03/mount-ftp-server-linux.html

Ответ 4

Для этого вы можете использовать API-интерфейс WebHDFS REST. Сделайте curl с машины, где вы хотите загрузить файлы.

curl -i -L "http://namenode:50075/webhdfs/v1/path_of_the_file?op=OPEN" -o ~/destination

Другим подходом может быть использование DataNode API через wget для этого:

wget http://$datanode:50075/streamFile/path_of_the_file

Но самым удобным способом, IMHO, было бы использовать веб-интерфейс NameNOde. Поскольку этот компьютер является частью сети, вы можете просто указать свой веб-браузер на NameNode_Machine:50070. После этого просмотрите HDFS, откройте файл, который хотите загрузить, и нажмите Download this file.

Ответ 5

Я тоже пытался это сделать (я использовал безопасность Kerberos). Это помогло мне после небольшого обновления: https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN

Запуск напрямую curl -L -i --negotiate "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN" не работал у меня, я объясню, почему.

Эта команда выполнит два шага:

  • найдите файл, который хотите загрузить, и создайте временную ссылку - return 307 Temporary Redirect

  • по этой ссылке он загрузит данные - return HTTP 200 OK.

Коммутатор -L говорит, что он берет файл и продолжает пилить напрямую. Если вы добавите команду curl -v, она будет регистрироваться для вывода; если это так, вы увидите описанные два шага в командной строке, как я уже сказал. НО - потому что из-за более старой версии завитка (которую я не могу обжаловать) это не сработает.

РЕШЕНИЕ ДЛЯ ЭТОГО (в оболочке):

LOCATION=`curl -i --negotiate -u : "${FILE_PATH_FOR_DOWNLOAD}?op=OPEN" | /usr/bin/perl -n -e '/^Location: (.*)$/ && print "$1\n"'`

Это получит временную ссылку и сохранит ее в переменной $LOCATION.

RESULT=`curl -v -L --negotiate -u : "${LOCATION}" -o ${LOCAL_FILE_PATH_FOR_DOWNLOAD}`

И это сохранит его в локальном файле, если вы добавите -o <file-path>.

Я надеюсь, что это помогло.

J.