С помощью команды hadoop fs -put
данные последовательно поступают в кластер.
Но как параллельно выгружать данные со стороны клиента в кластер HDFS?
Поскольку команда hadoop
является клиентом Hadoop, необходимо, чтобы несколько из них работали параллельно. Но вам нужно будет реализовать своего рода стратегию разделения и обработку ошибок, чтобы все файлы были загружены.
Он не устраняет другие узкие места, такие как дисковый ввод-вывод, ввод-вывод, использование сети и т. д.
Вы найдете некоторую справочную информацию о разделе Загрузка данных в HDFS - Часть 1 - Параллельная загрузка.
Да, hadoop fs - put
работает последовательно. Используйте команду distcp
(распределенная копия).
hadoop distcp file:///home/user/path /user/path
distcp
реализован как задание MapReduce, в котором копирование выполняется картами, которые работают параллельно в кластере. Редукторов нет. Каждый файл копируется одной картой, и distcp
пытается предоставить каждой карте примерно одинаковый объем данных, разбивая файлы на примерно равные участки. По умолчанию используется до 20 карт, но это можно изменить, указав аргумент -m
для distcp
.
См. Руководство здесь. Также см. это сообщение в блоге.
Также вы можете запускать команды оболочки параллельно, используя в конце амперсанд ('&'
):
hadoop fs - put src_file tgt_file &
hadoop fs - put src_file2 tgt_file2 &
@ U880D добавил больше информации
Это будет как-то зависеть от инфраструктуры и от того, где находятся данные источника данных. distcp не обеспечивает высокий уровень параллелизма, если входные данные находятся в локальной FS (нераспределенное хранилище), а не в HDFS.