将一个本地文件放入多个HDFS目录
Put one local file into multiple HDFS directories
我正在为 CDH 5.3 集群安装编写完整性测试。我们有一个测试用例,它将在具有 1000 个分区的目录上创建一个 Hive table,然后查询随机分区。本来是用一系列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 循环复制也需要相当多的时间。
关于如何以最快、最有效的方式将一个文件复制到多个目录有什么想法吗?
实现此目的的更快方法是编写一个 Java 应用程序,该应用程序使用 Hadoop FileSystem API 将文件写入各种 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
一次提交多个 (10) 个命令,循环 100。
我正在为 CDH 5.3 集群安装编写完整性测试。我们有一个测试用例,它将在具有 1000 个分区的目录上创建一个 Hive table,然后查询随机分区。本来是用一系列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 循环复制也需要相当多的时间。
关于如何以最快、最有效的方式将一个文件复制到多个目录有什么想法吗?
实现此目的的更快方法是编写一个 Java 应用程序,该应用程序使用 Hadoop FileSystem API 将文件写入各种 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
一次提交多个 (10) 个命令,循环 100。