合并hadoop中的小文件

Raj*_*Raj 6 hadoop hive mapreduce hdfs hadoop2

我在HDFS中有一个目录(Final Dir),其中一些文件(例如:10 mb)每分钟加载一次.一段时间后,我想将所有小文件组合成一个大文件(例如:100 mb).但是用户不断将文件推送到Final Dir.这是一个持续的过程.

所以我第一次需要将前10个文件组合成一个大文件(例如:large.txt)并将文件保存到Finaldir.

现在我的问题是我将如何获得除前10个文件之外的下10个文件?

可以请一些帮助我

Adi*_*tya 9

这是另一个替代方案,这仍然是@Andrew在他的评论中指出的遗留方法,但是还有额外的步骤:将输入文件夹作为缓冲区来接收小文件及时将它们推送到tmp目录并合并它们将结果推回输入.

第1步:创建一个tmp目录

hadoop fs -mkdir tmp
Run Code Online (Sandbox Code Playgroud)

步骤2:在一个时间点将所有小文件移动到tmp目录

hadoop fs -mv input/*.txt tmp
Run Code Online (Sandbox Code Playgroud)

第3步 - 在hadoop-streaming jar的帮助下输入小文件

hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar \
                   -Dmapred.reduce.tasks=1 \
                   -input "/user/abc/input" \
                   -output "/user/abc/output" \
                   -mapper cat \
                   -reducer cat
Run Code Online (Sandbox Code Playgroud)

步骤4-将输出移动到输入文件夹

hadoop fs -mv output/part-00000 input/large_file.txt
Run Code Online (Sandbox Code Playgroud)

第5步 - 删除输出

 hadoop fs -rm -R output/
Run Code Online (Sandbox Code Playgroud)

第6步 - 从tmp中删除所有文件

hadoop fs -rm tmp/*.txt
Run Code Online (Sandbox Code Playgroud)

从步骤2到步骤6创建一个shell脚本,并安排它定期运行以定期合并较小的文件(可能根据您的需要每分钟)

计划用于合并小文件的cron作业的步骤

步骤1:在上述步骤(2到6)的帮助下创建一个shell脚本/home/abc/mergejob.sh

重要提示:您需要在脚本中指定hadoop的绝对路径,以便cron理解

#!/bin/bash
/home/abc/hadoop-2.6.0/bin/hadoop fs -mv input/*.txt tmp
wait
/home/abc/hadoop-2.6.0/bin/hadoop jar /home/abc/hadoop-2.6.0/share/hadoop/tools/lib/hadoop-streaming-2.6.0.jar \
                   -Dmapred.reduce.tasks=1 \
                   -input "/user/abc/input" \
                   -output "/user/abc/output" \
                   -mapper cat \
                   -reducer cat
wait
/home/abc/hadoop-2.6.0/bin/hadoop fs -mv output/part-00000 input/large_file.txt
wait
/home/abc/hadoop-2.6.0/bin/hadoop fs -rm -R output/
wait
/home/abc/hadoop-2.6.0/bin/hadoop fs -rm tmp/*.txt
Run Code Online (Sandbox Code Playgroud)

步骤2:使用cron计划脚本使用cron表达式每分钟运行一次

a)通过选择编辑器来编辑crontab

>crontab -e
Run Code Online (Sandbox Code Playgroud)

b)在结尾添加以下行并退出编辑器

* * * * * /bin/bash /home/abc/mergejob.sh > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

合并作业将安排为每分钟运行一次.

希望这有用.