使用 Shell 脚本根据时间戳将文件从 HDFS 复制到本地文件系统

使用 Shell 脚本根据时间戳将文件从 HDFS 复制到本地文件系统

我想根据时间戳将 Hadoop 目录中的 n 个文件移动到本地文件系统。场景:

  1. 假设我第一次从 HDFS 转换到本地文件系统,因此本地文件系统中也不会有文件。在这种情况下,HDFS 目录中的所有文件都将移动到本地文件系统
  2. 现在,如果新文件进入 HDFS 目录,我需要再次将该文件移动到本地文件系统,在这种情况下,仅根据时间戳传输尚未处理的最新文件。

我想创建一个自动化脚本来执行此任务

优先使用 shell 脚本

答案1

根据上述场景,要完成这项任务,有多种方法,我们可以基于以下方法完成时间戳在某些日志文件中跟踪已处理的文件

我在这里使用的方法我将跟踪已处理的文件的名称即从HDFS 到本地文件系统。

如果我第一次运行脚本,则驻留在 HDFS 中的文件将被移动到本地文件系统,并检查该文件的名称是否存在已处理文件.txt是否。如果不是,则文件将移动到本地文件系统,并进入已处理文件.txt. 如果 filename 存在于已处理文件.txt就不会移动到本地文件系统。

代码:

# Local file system location
path=/home/cloudera/test/

#processedfile.txt location
logpath=/home/cloudera/test/processedfile.txt

#HDFS file location
hdfspath=/user/test/

# to get list of files from HDFS dir
for filename in `hadoop fs -ls ${hdfspath}*|  awk '{print $NF}'  | tr '\n' ' '`
do

# get file name
    name=$(basename $filename)

# check filename is present in processedfile.txt or not 
            if grep -Fxq $name $logpath;
        then
        echo $name is present in local file system
        else

#copy file from HDFS to Local File System.      
          hadoop fs -copyToLocal $filename $path
          echo "$name" >> "$logpath"
        fi
done
echo prosessing completed   

相关内容