Hadoop 将一个本地文件放入多个HDFS目录

Hadoop 将一个本地文件放入多个HDFS目录,hadoop,hdfs,cloudera,Hadoop,Hdfs,Cloudera,我正在为CDH5.3集群安装编写一个健全性测试。我们有一个测试用例,它将在包含1000个分区的目录上创建一个配置单元表,然后查询随机分区。最初是通过一系列for循环完成的,需要几个小时: hadoop fs-mkdir-p/hdfs/directory/partition{1…1000} 然后: hadoop fs-put/path/to/local/file/hdfs/directory/partitionX 将一个本地文件传递到多个目录只会抛出一个错误,但使用for循环需要几个小时才能完成-

我正在为CDH5.3集群安装编写一个健全性测试。我们有一个测试用例,它将在包含1000个分区的目录上创建一个配置单元表,然后查询随机分区。最初是通过一系列for循环完成的,需要几个小时:

hadoop fs-mkdir-p/hdfs/directory/partition{1…1000}

然后:

hadoop fs-put/path/to/local/file/hdfs/directory/partitionX

将一个本地文件传递到多个目录只会抛出一个错误,但使用for循环需要几个小时才能完成-copyFromLocal会向-put抛出类似的错误。另外,-放入第一个目录并使用for循环进行复制也需要相当长的时间


关于如何以最快、最有效的方式将一个文件复制到多个目录,有什么想法吗?

实现这一点的更快方法是编写一个Java应用程序,使用将文件写入不同的HDFS目录。

为了加快复制速度,需要某种并行性。在java中,运行一个多线程程序一次提交几十个hdfs复制命令是很容易的

使用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
m=10
对于((i=0;i<100;i++);做
sh hdfs_cp_脚本分区$($i*$m+1))&sh hdfs_cp_脚本分区$($i*$m+2)&sh hdfs_cp_脚本分区$($i*$m+10))
完成

提交多份(10份)命令循环时间为100。

因为听起来像是要将同一个文件复制到多个位置,所以通过执行
put
,然后使用
cp
移动到其他HDFS目录,可能会获得更好的性能。
cp
可能没有帮助,因为数据必须通过HDFS客户端传输。bash脚本几乎像对于我们来说,e是一个符咒,但它忘了对任何带有0(即10、20、30…170、180、190)的东西使用,这很奇怪。查看测试脚本:m=4;for((i=0;i<6;i++);do echo$($i*$m+1));echo$($i*$m+2));echo$($i*$m+3));完成;结果确实包含一些0:1 2 3 5 6 7 9 10 11 13 14 15 17 18 19 21 22这解决了问题,因为每个hdfs/hadoop-fs作业都会启动一个新作业,并且每个作业都是按顺序执行的(一个接一个,串联执行)。每个都很小,但您需要它们并行。@Paul H.如果我的配置单元表是在某个日期列上进行分区的,那么如何使用上面的脚本进行同样的操作?谢谢。请展示一些代码或脚本来完成此操作。这将非常有帮助:-)