shell—如何将zipfiles从本地文件系统自动复制到hdfs

a5g8bdjr  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(315)

据我所知 copyFromLocal <localSrc> <dest> 此命令用于将文件复制到hdfs。我不想手动复制,因为我每周都从源代码处获取文件,每次手动复制都很困难。
以下是我的要求。
当我掉下去的时候 file.zip 到本地文件系统路径: /usr/data/ingestion/ 文件应自动从本地吸收并复制到hdfs路径,如 hdfs://usr/data/raw/file.zip 有可能吗?或者任何框架都支持这种特性?
谢谢

wtlkbnrh

wtlkbnrh1#

您可以这样编写shell脚本…并计划每天从cron或手动运行:


# !/bin/sh

local_zip_dir=/home/username/data
hdfs_zip_dir=/user/cloudera/data

for local_zip_file in $(ls -1 $local_zip_dir/*.zip)
do
   file_name=$(echo $local_zip_file|awk -F '/' '{print $NF}')
   if hadoop fs -test –e  $hdfs_zip_dir/$file_name;
   then
               echo "$local_zip_file already copied to hdfs"
   else
               echo "Coping $local_zip_file to $hdfs_zip_dir"
               hadoop fs -copyFromLocal $local_zip_file $hdfs_zip_dir/$file_name
   fi
done

p、 s:修复语法错误,如果有,因为这是没有测试和回答从移动应用程序
进一步在本地路径上删除zip文件的步骤中,可以删除空文件:
例如,你在本地的辍学应该完成以下两个步骤:

original file to copy: file.zip
empty file copied as:  file.zip.ready

然后shell脚本应该每隔一到五分钟检查一次,如果有的话 *.ready 文件,如果有的话,那就复制一下 file.zip 并移除 .ready 复制到后的文件 hdfs :
像这样的。。。


# !/bin/sh

local_zip_dir=/home/username/data
hdfs_zip_dir=/user/cloudera/data

while(true)
do  
 for local_zip_file in $(ls -1 $local_zip_dir/*.ready)
 do
   file_name=$(echo $local_zip_file|awk -F '/' '{print $NF}'|awk -F '.' '{print $1,$2}'|sed 's/ /./')
   if hadoop fs -test –e  $hdfs_zip_dir/$file_name;
   then
               echo "$local_zip_file already copied to hdfs"
   else
               echo "Coping $local_zip_file to $hdfs_zip_dir"
               hadoop fs -copyFromLocal $local_zip_file $hdfs_zip_dir/$file_name
               #lets delete .ready file
               rm -f $local_zip_file 
   fi
 done

# sleep for 5 minutes

sleep 300
done

相关问题