一:Shell定时采集数据到HDFS
创建待上传文件存放的目录/export/data/logs/log ,执行:mkdir -p /export/data/logs/log
创建待上传文件存放的目录/export/data/logs/toupload, 执行:mkdir -p /export/data/logs/toupload
查看创建的目录树结构
2、编写脚本,实现功能
进入/export/data/logs目录,执行:cd /export/data/logs目录
执行:vim upload2HDFS.sh
注:
#!/bin/bash
JAVA_HOME=/usr/local/jdk1.8.0_231
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop-3.3.4/
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
#日志文件存放的目录,需手动创建
log_src_dir=/export/data/logs/log/
#待上传文件存放的目录,需手动创建
log_toupload_dir=/export/data/logs/toupload/
#设置日期
date1=`date +%Y_%m_%d`
#日志文件上传到hdfs的根路径
hdfs_root_dir=/data/clickLog/$date1/
#打印环境变量信息
echo "envs: hadoop_home: $HADOOP_HOME"
#读取日志文件的目录,判断是否有需要上传的文件
echo "log_src_dir: $log_src_dir"
ls $log_src_dir | while read fileName
do
if [[ "$fileName" == access.log.* ]]; then
date=`date +%Y_%m_%d_%H_%M_%S`
#将文件移动到待上传目录并重命名
echo "moving $log_src_dir$fileName to $log_toupload_dir"lzy_click_log_$fileName"$date"
mv $log_src_dir$fileName $log_toupload_dir"lzy_click_log_$fileName"$date
#将待上传的文件path写入一个列表文件willDoing,
echo $log_toupload_dir"lzy_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 read line
do
#打印信息
echo "toupload is in file: $line"
#将待上传文件列表willDoing改名为willDoing_COPY_
mv $log_toupload_dir$line $log_toupload_dir$line"_COPY_"
#读列表文件willDoing_COPY_的内容(一个一个的待上传文件名)
#此处的line 就是列表中的一个待上传文件的path
cat $log_toupload_dir$line"_COPY_" | while read line
do
#打印信息
echo "puting...$line to hdfs path...$hdfs_root_dir"
hdfs dfs -mkdir -p $hdfs_root_dir
hdfs dfs -put $line $hdfs_root_dir
done
mv $log_toupload_dir$line"_COPY_" $log_toupload_dir$line"_DONE_"
done
编辑权限,执行:chmod u+x upload2HDFS.sh
查看/export目录树结构
3、运行脚本,查看结果
创建四个日志文件,必须以acces.log.开头
查看目录结构,执行:tree /export
执行:./upload2HDFS.sh
查看目录结构
可以打开WebUI查看上传日志文件
二:使用JAVA API操作HDFS
1、HDFS常见的类和接口 【hadoop整合了众多文件,HDFS只是这个文件系统的示例】
2、FileSystem的常用方法 【对文件进行操作】
三:编写JAVA程序访问HDFS
1、创建Maven项目 【创建Maven项目-HDFSDemo】
2、添加相关依赖 【在pom.xml文件里添加hadoop和junit依赖】
点击按钮,下载依赖包到本地
注:
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
</dependencies>
Maven Repository(Maven仓库)- https://mvnrepository.com/
【搜索hadoop】
点击hadoop-client超链接
点击3.3.4超链接
3、创建日志性文件 【在resources目录中创建log4.properties文件】
注:
log4j.rootLogger=stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/hdfs.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
4、执行:start-dfs.sh ,启动HDFS服务
可以在Hadoop WebUI界面进行查看
5、HDFS上创建文件,创建createrFileOnHDFS类
在HDFS/ied目录上,创建hadoo.txt文件
注:
package net.hw.hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.net.URI;
/**
* 功能:在HDFS上创建文件
* 作者:花都
* 日期:2022年11月18日
*/
public class CreateFileOnHDFS {
public static void main(String[] args) throws Exception {
// 创建配置对象
Configuration conf = new Configuration();
// 定义统一资源标识符
String uri = "hdfs://master:9000";
// 创建文件系统对象
FileSystem fs = FileSystem.get(new URI(uri), conf);
// 创建路径对象
Path path = new Path(uri + "/ied01/hadoop.txt");
// 创建文件
boolean result = fs.createNewFile(path);
// 判断文件是否创建成功
if (result) {
System.out.println("文件[" + path + "]创建成功!");
} else {
System.out.println("文件[" + path + "]创建失败!");
}
}
}
运行程序,查看结果 【也可以在WebUI界面进行查看】