Передача файлов в Hadoop HDFS с удаленного сервера Linux - PullRequest
0 голосов
/ 26 сентября 2018

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

как мы можем этого добиться.

1 Ответ

0 голосов
/ 26 сентября 2018

Давайте сначала предположим пару вещей.У вас есть один компьютер, на котором смонтирован внешний жесткий диск (с именем DISK), и один кластер машин с ssh-доступом к мастеру (мы обозначаем мастером в командной строке часть user @ hostname главной машины).Вы запускаете скрипт на машине с накопителем.Данные на диске состоят из нескольких каталогов с несколькими файлами в каждом (например, 100);цифры не имеют значения, это просто чтобы оправдать петли.Путь к данным будет храниться в переменной $ {DIR} (в Linux это будет / media / DISK и в Mac OS X / Volumes / DISK).Вот как выглядит скрипт:

DIR=/Volumes/DISK;

for d in $(ls ${DIR}/);
do
  for f in $(ls ${DIR}/${d}/);
  do
    cat ${DIR}/${d}/${f} | ssh master "hadoop fs -put - /path/on/hdfs/${d}/${f}";
  done;
done;

Обратите внимание, что мы перебираем каждый файл и копируем его в определенный файл, потому что API-интерфейс HDFS для put требует, чтобы «когда source был stdin, destination должен бытьфайл. "

К сожалению, это занимает вечность.Когда я вернулся на следующее утро, он обрабатывал только пятую часть данных (100 ГБ) и все еще работал ... В основном, по 20 минут на каталог!В итоге я решил временно скопировать данные на одну из машин, а затем скопировать их локально в HDFS.По причине нехватки места я сделал это по одной папке за раз, а затем сразу же удалил временную папку.Вот как выглядит скрипт:

DIR=/Volumes/DISK;
PTH=/path/on/one/machine/of/the/cluster;
for d in $(ls ${DIR}/);
do
  scp -r -q ${DIR}/${d} master:${PTH}/
  ssh master "hadoop fs -copyFromLocal ${PTH}/${d} /path/on/hdfs/";
  ssh master "rm -rf ${PTH}/${d}";
done;

Надеюсь, это поможет!

...