我在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分钟调度一次。请指导专家。
发布于 2015-03-25 13:25:27
试试这个剧本。它将给idea.basically首先列出文件,并将它们存储到customer_all_file.txt.in以循环传递文件名,将文件名存储到已处理的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发布于 2015-03-25 11:47:39
重命名部件:
您的csv文件是否都有与customer.csv相同的名称?如果是,则需要在将每个文件上载到hdfs时重命名它们。
Crontab部件:
您可以每4分钟运行一次shell脚本,方法是:
*/4 * * * * /your/shell/script/path通过在终端中键入crontab -e添加这一行。
https://stackoverflow.com/questions/29254382
复制相似问题