这是另一个替代方案,这仍然是@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)
合并作业将安排为每分钟运行一次.
希望这有用.
| 归档时间: |
|
| 查看次数: |
6687 次 |
| 最近记录: |