我正在为CDH 5.3群集安装编写一个健全性测试。我们有一个测试用例,它将在一个包含1000个分区的目录上创建一个Hive表,然后查询随机分区。最初使用一系列for循环,需要花费数小时才能完成:
hadoop fs -mkdir -p / hdfs / directory / partition {1 ... 1000}
然后:
hadoop fs -put / path / to / local / file / hdfs / directory / partitionX
将一个本地文件传递到多个目录只会引发错误,但使用for循环需要几个小时才能完成。 -copyFromLocal向-put抛出类似的错误。另外,-put到第一个目录并用for循环复制也需要相当长的时间。
关于如何以最快和最有效的方式将一个文件复制到多个目录的任何想法?
答案 0 :(得分:0)
实现这一目标的更快方法是编写一个使用Hadoop FileSystem API将文件写入各种HDFS目录的Java应用程序。
答案 1 :(得分:0)
为了加快复制速度,需要某种并行性。运行一个多线程程序很容易在java中提交几十个hdfs copy命令。
使用shell脚本,您可以执行以下操作:
m=10
for (( i = 0; i < 100; i++ )); do
sh hdfs_cp_script partition$(($i*$m + 1)) & sh hdfs_cp_script partition$(($i*$m + 2) & ... & sh hdfs_cp_script partition$(($i*$m + 10))
done
为循环100提交多个(10)命令。