我在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分钟安排一次。 请指导专家。
答案 0 :(得分:0)
重命名部分:
您的所有csv文件是否都与{{1}}同名?如果是,则需要在将每个文件上传到hdfs时重命名它们。
Crontab部分:
您可以使用以下命令每4分钟运行一次shell脚本:
customer.csv
在终端输入*/4 * * * * /your/shell/script/path
添加此行。
答案 1 :(得分:0)
试试这个脚本。它会给出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 $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