如何使用shell脚本每隔4分钟在hdfs(hadoop)上查找目录中是否有新文件

drkbr07n  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(501)

我在hdfs上有一个目录,例如:/user/customers,在这个目录中我每3分钟转储一次客户的数据文件,我想写一个shell脚本来检查这个文件夹,如果有一个新的文件可用,那么这个文件数据将放在hbase中,我已经知道如何将数据放在hbase中。但是我对shell脚本非常陌生,我想知道如何获得新的文件名。
我的hadoop命令将文件的数据放入hbase中,如下所示:

hadoop jar /opt/mapr/hbase/hbase-0.94.12/hbase-0.94.12-mapr-1310.jar importtsv -Dimporttsv.separator=, -Dimporttsv.columns=HBASE_ROW_KEY,cust:phno,cust:name,cust:memebershiptype /user/tablename customer.csv

现在的想法是取代这个 customer.csv 使用最近转储到文件夹中的文件名,然后运行此命令。
因此,如果我没有错,我将需要一个cron作业来完成调度部分。但我需要的逻辑,我如何可以得到新的文件名在上述命令第一。接下来我要学习的是crontab,它每4分钟安排一次。请各位Maven指导。

lxkprmvk

lxkprmvk1#

试试这个脚本。它将给出想法。基本上首先我列出的文件,并存储到客户所有的文件。txt。在为循环传递文件名,存储文件名到已经处理的文件。差分命令将找到新的文件,并存储它们需要处理的文件。这是非常简单的通过它。

hadoop fs -ls hdfs://IPNamenode/user/customers/  | sed '1d;s/  */ /g' | cut -d\  -f8 |  xargs -n 1 basename > /home/givepath/customer_all_file.txt

diff /home/givpath/customer_all_files.txt /home/givepath/customer_processedfiles.txt > /home/givepath/need_to_process.txt

for line in `awk '{ print $2 }' /home/givepath/need_to_process.txt`;
do
echo "$line"

hadoop jar /opt/mapr/hbase/hbase-0.94.12/hbase-0.94.12-mapr-1310.jar importtsv -Dimporttsv.separator=, -Dimporttsv.columns=HBASE_ROW_KEY,cust:phno,cust:name,cust:memebershiptype /user/tablename $line

echo "$line" >> /home/givepath/customer_already_processedfiles.txt

done
whhtz7ly

whhtz7ly2#

重命名部件:
您的所有csv文件是否与 customer.csv ? 如果是,则需要在将每个文件上载到hdfs时重命名它们。
crontab部分:
您可以使用以下命令每4分钟运行一次shell脚本:


* /4 * * * * /your/shell/script/path

通过键入添加此行 crontab -e 在终点站。

相关问题