Hadoop 在HDFS中递归合并多个文件
HDFS中我的文件夹路径结构如下所示:Hadoop 在HDFS中递归合并多个文件,hadoop,hdfs,Hadoop,Hdfs,HDFS中我的文件夹路径结构如下所示: /data/topicname/year=2017/month=02/day=28/hour=00 /data/topicname/year=2017/month=02/day=28/hour=01 /data/topicname/year=2017/month=02/day=28/hour=02 /data/topicname/year=2017/month=02/day=28/hour=03 在这些路径中,我有许多小尺寸的json文件。我正在编写一个
/data/topicname/year=2017/month=02/day=28/hour=00
/data/topicname/year=2017/month=02/day=28/hour=01
/data/topicname/year=2017/month=02/day=28/hour=02
/data/topicname/year=2017/month=02/day=28/hour=03
在这些路径中,我有许多小尺寸的json文件。我正在编写一个shell脚本,它可以根据路径将所有这些单独目录中的所有文件合并到一个单独的文件名中
例如:
将/data/topicname/year=2017/month=02/day=28/hour=00中的所有json合并到一个完整的文件full_2017_02_28_00.json中
将/data/topicname/year=2017/month=02/day=28/hour=01中的所有json合并为一个完整的文件\u 2017\u 02\u 28\u 01.json
将/data/topicname/year=2017/month=02/day=28/hour=02中的所有json合并到一个文件full_2017_02_28_02.json中,依此类推
保持上述模式中的文件名是我将尝试实现的次要工作。目前我可以硬编码文件名
但是,目录路径结构内部的递归连接并没有发生
到目前为止,我已经尝试了以下方法:
hadoop fs -cat /data/topicname/year=2017/* | hadoop fs -put - /merged/test1.json
错误:-
cat: `/data/topicname/year=2017/month=02/day=28/hour=00': Is a directory
cat: `/data/topicname/year=2017/month=02/day=28/hour=01': Is a directory
cat: `/data/topicname/year=2017/month=02/day=28/hour=02': Is a directory
递归cat在上述尝试中没有发生
hadoop fs -ls /data/topicname/year=2017/month=02 | find /data/topicname/year=2017/month=02/day=28 -name '*.json' -exec cat {} \; > output.json
错误:-
find: ‘/data/topicname/year=2017/month=02/day=28’: No such file or directory
cannot write output to stream message is repeated multiple times
file /merged/output.json is repeated a few times
在上面的尝试中,它是在本地FS中查找而不是在HDFS中查找
for i in `hadoop fs -ls -R /data/topicname/year=2017/ | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - /merged/output.json`; done
错误:-
find: ‘/data/topicname/year=2017/month=02/day=28’: No such file or directory
cannot write output to stream message is repeated multiple times
file /merged/output.json is repeated a few times
这是如何实现的?我不想用Spark 使用:
所用时间取决于文件的数量和大小,因为该过程是连续的。使用:
所花费的时间取决于文件的数量和大小,因为该过程是连续的。我能够通过以下脚本实现我的目标:
#!/bin/bash
for k in 01 02 03 04 05 06 07 08 09 10 11 12
do
for j in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
do
for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
do
hadoop fs -cat /data/topicname/year=2017/month=$k/day=$j/hour=$i/* | hadoop fs -put - /merged/TEST1/2017"_"$k"_"$j"_"$i.json
hadoop fs -du -s /merged/TEST1/2017"_"$k"_"$j"_"$i.json > /home/test/sizetest.txt
x=`awk '{ print $1 }' /home/test/sizetest.txt`
echo $x
if [ $x -eq 0 ]
then
hadoop fs -rm /merged/TEST1/2017"_"$k"_"$j"_"$i.json
else
echo "MERGE DONE!!! All files generated at hour $i of $j-$k-2017 merged into one"
echo "DELETED 0 SIZED FILES!!!!"
fi
done
done
done
rm -f /home/test/sizetest.txt
hadoop fs -rm -r /data/topicname
我能够通过以下脚本实现我的目标:
#!/bin/bash
for k in 01 02 03 04 05 06 07 08 09 10 11 12
do
for j in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
do
for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
do
hadoop fs -cat /data/topicname/year=2017/month=$k/day=$j/hour=$i/* | hadoop fs -put - /merged/TEST1/2017"_"$k"_"$j"_"$i.json
hadoop fs -du -s /merged/TEST1/2017"_"$k"_"$j"_"$i.json > /home/test/sizetest.txt
x=`awk '{ print $1 }' /home/test/sizetest.txt`
echo $x
if [ $x -eq 0 ]
then
hadoop fs -rm /merged/TEST1/2017"_"$k"_"$j"_"$i.json
else
echo "MERGE DONE!!! All files generated at hour $i of $j-$k-2017 merged into one"
echo "DELETED 0 SIZED FILES!!!!"
fi
done
done
done
rm -f /home/test/sizetest.txt
hadoop fs -rm -r /data/topicname
这需要很多时间。它运行了大约20分钟,只能够附加10-15个文件,合并文件大小为5字节,使用fsshell是顺序的,速度会很慢。此解决方案是您发布的问题的语法正确版本。要实现并行性,请使用MapReduce或Spark(您已经提到,这是您不想使用的)。它运行了大约20分钟,只能够附加10-15个文件,合并文件大小为5字节,使用fsshell是顺序的,速度会很慢。此解决方案是您发布的问题的语法正确版本。要实现并行性,请使用MapReduce或Spark(您已经提到了不想使用)。