如何使用 shell 脚本每 4 分钟查找 HDFS(Hadoop)目录中是否有新文件

How to find if there are new files in a directory on HDFS (Hadoop) every 4 min using shell script

我在 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 作业来完成计划部分。但是我需要先了解如何在上述命令中获取新文件名的逻辑。然后我后面要学习的部分是每 4 分钟安排一次的 crontab。 请高手指点。

重命名部分:

您的所有 csv 文件都与 customer.csv 同名吗?如果是,您需要在将每个文件上传到 hdfs 时重命名它们。

Crontab 部分:

您可以每 4 分钟 运行 您的 shell 脚本,方法是:

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

在终端中输入 crontab -e 添加这一行。

试试这个脚本。它会给 idea.basically 首先我列出文件并将它们存储到 customer_all_file.txt.in for 循环传递文件名,将文件名存储到已处理的 files.difference 命令将找到新文件和将它们存储到 need_to_processed files.its 非常简单。

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  }' /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