Давайте сначала предположим пару вещей.У вас есть один компьютер, на котором смонтирован внешний жесткий диск (с именем 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;
Надеюсь, это поможет!