1、其他API&stream操作
Stream流形式操作HDFS,这是一个更底层的操作方式:
public void testUpload() throws Exception{
FSDataOutputStream outputStream =fs.create(newPath("/1.txt",true));
FileInputStream inputStream=new FileInputStream("D:\\1.txt");
IOUtils.copy(inputStream,outputStram);
}
2、案例:shell定时采集数据至HDFS
网站每天产生的日志数据准时上传至HDFS集群上
2.1 技术分析:
HDFS SHELL:
hadoop fs -put //满足上传文件,不能满足定时,周期性传入
Linux crontab:
crontab -e
0 0 * * */shell/uploadFile2Hdfs.sh //每天凌晨12:00执行一次
2.2 实现流程: 采用Nginx进行日志采集
upliadFile2HDFS.sh
HDFS定时上传shell案例:
#!/bin/bash
#set java env
exportJAVA_HOME=/export/software/jdk1.8.0_65
exportJRE_HOME=${JAVA_HOME}/jre
exportCLASSPATH=.:${JAVA_HOME}/bin:{JRE_HOME}/bin
exportPATH=${JAVA_HOME}/bin:$PATH
#set hadoop env
export HADOOP HOME+/export/software/hadoop-2.7.4
exportPATH=${HADOOP_HOME}/bin:{HADOOP_HOME}/sbin:$PATH
#日志文件存放的目录
log_src_dir+/root/logs/log/
#待上转文件的存放目录
log_toupload_dir=/root/logs/toupload
#日志上传到HDFS的根路径
datel=‘date -d last-day+%Y_%m_%d’
hdfs_root_dir=/data/clickLog/$datel/
#打印环境变量信息
echo"envs:hadoop_home:$HADOOP_HOME"
#读取日志文件的目录,判断是否有需要上传的文件
echo"log_src_dir:"$log_src_dir
ls $log_src_dir | whileresd fileName
do
if[["$filename"==access.log.*]];then
#if["access.log"=="$fileName"];then
date='date +%Y_%m_%d_%H_%M_%S'
#将文件移动到待上传目录并重命名
#打印信息
echo "moving $log_src_dir$fileName to$log_toupload_dir"xxxxx_click_log_$fileName"$date"
mv $log_scr_dir$fileName $log_toupload_dir"xxxxx_click_log_$fileName"$date
#将待上传的文件path写入一个列表文件willDoing
echo ¥log_toupload_dir"xxxx_click_log_$filename"$date>>$log_toupload_dir"willDoing."$date
fi
done
# 找到列表文集willDoing
ls $log_toupload_dir |grep will |grep -v "_COPY_" | grep -v "_DONE_" | while readline
do
#打印信息
echo "toupload is infile:"$line
#将待上转文件列表willDoing改名为willDoing_COPY
mv $log_toupload_dir$line$log_toup_dir$line"_COPY_"
#读列文件willdoing-copy内容,此处的line就是列表中等待上传的一个文件的path
cat $log_toupload_dir$line"_COPY_" |while read line
do
#打印信息
echo "puting ...$line to hdfspath......$hdfs_root_dir"
hadoop fs -mkdir -p $hdfs_root_dir
hadoop fs -put $line$hdfs_root_dir
done
mv$log_toupload_dir$line"_COPY_"$log_toupload_dir$line"_DONE_"
done