windows 系统下操作hdfs 以及shell编程规范
以上是 在node1主机上 有一个 1.txt文件 分成三块 备份副本数为2
Node1 : blk-1 ,blk-3
Node2 :blk-2,blk-1
Node3 :blk-3,blk-2
1.请求下载文件
2.确认是否具有操作文件的权限
3.Namenode 视情况分批返回该文件的元数据信息或者全部元数据信息。
4.在该批次中,客户端拉取数据是并行的,分别启动多线程提取指定的dn上拉取数据。
5.当客户端吧该文件的所有数据块block拉取下来之后,需要按照块的顺序进行拼接(merge)形成文件的最终样子。 【blk-1,blk-2,blk-3】
6.在拉取过程中 内部会使用crc进行校验。
Windom系统下 安装hadoop 并通过java代码操作hdfs (相当于windows 系统下 hdfs client)
1.首先配置全局JAVA_HOME ; PATH ;HADOOP_HOME;PATH (windows系统下安装hadoop时,给的有一个hadoop 包解压即可。已上传百度云)
2.查看hadoop是否安装成功 hadoop ;hadoop version
3.Hadoop version 不成功 ,一般是因为 到hadoop 安装目录下 etc/hadoop/hadoop-env.cmd 找到set JAVA_HOME=D:\PROGRA~1\Java\jdk1.8.0_141 即可。
代码:
创建 Maven 工程,引入 pom 依赖
org.apache.hadoop
hadoop-common
2.7.4
org.apache.hadoop
hadoop-hdfs
2.7.4
org.apache.hadoop
hadoop-client
2.7.4
配置maven仓库。配一下 (视频中没配)
创建包 cn.itcast
创建类 HdfsClient 主方法
直接使用 pom中 引入的 FIleSystem.get(new URI(“hdfs://note1:9000”),conf,”root”)
public class HDFSClient {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
// conf.set(“fs.defaultFS”,“hdfs://note1:9000”);
FileSystem fs = FileSystem.get(new URI(“hdfs://note1:9000”), conf, “root”);
fs.mkdirs(new Path("/CreateByJava"));
fs.copyFromLocalFile(new Path(“d://1.txt”),new Path("/CreateByJava"));
fs.copyToLocalFile(false,new Path("/CreateByJava/1.txt"),new Path(“e:\”),false);
fs.close();
}
}
在上传可以成功,但下载是个空文件 ,而且报一下错误:
Exception in thread “main” ExitCodeException exitCode=-1073741515:
at org.apache.hadoop.util.Shell.runCommand(Shell.java:585)
at org.apache.hadoop.util.Shell.run(Shell.java:482)
红字错误:是因为缺失 api-ms-win-crt-string-l1-1-0.dll 丢失
然后在网上查找了:并下载 放置到了 c:\Windows\SysWOW64 下 并win+r 输入:regsvr32 c:\Windows\SysWOW64\api-ms-win-crt-string-l1-1-0.dll
shell规范化编程:
- 定义跟本次shell运行相关的软件环境变量
- 定义本次shell当中的一些常量变量 比如:路径 时间 类名 属性等等 便于后期集中维护
- 本次shell的核心逻辑(要结合流程控制 做精准判断)
举例:创建一个.sh 文件脚本 粘贴一下代码:
*#!/bin/bash
#set java env
export JAVA_HOME=/export/servers/jdk1.8.0_65
export JRE_HOME={JAVA_HOME}/lib:{JAVA_HOME}/bin:KaTeX parse error: Expected 'EOF', got '#' at position 6: PATH
#̲set hadoop env
…{HADOOP_HOME}/bin:PATH
#日志文件存放的目录
log_src_dir=/root/logs/log/
#待上传文件存放的目录
log_toupload_dir=/root/logs/toupload/
#日志文件上传到hdfs的根路径
date1=date -d last-day +%Y_%m_%d
hdfs_root_dir=/data/clickLog/$date1/
#打印环境变量信息
echo “envs: hadoop_home: KaTeX parse error: Expected 'EOF', got '#' at position 14: HADOOP_HOME"
#̲读取日志文件的目录,判断是否有…log_src_dir
ls fileName” == access.log. ]]; then
# if [ “access.log” = “$fileName” ];then
date=date +%Y_%m_%d_%H_%M_%S
#将文件移动到待上传目录并重命名
#打印信息
echo “moving fileName to KaTeX parse error: Expected group after '_' at position 33: …xxxxx_click_log_̲fileName”$date"
mv fileName KaTeX parse error: Expected group after '_' at position 33: …xxxxx_click_log_̲fileName"$date
#将待上传的文件path写入一个列表文件willDoing
echo KaTeX parse error: Expected group after '_' at position 33: …xxxxx_click_log_̲fileName"$date >> date
fi
done
#找到列表文件willDoing
ls KaTeX parse error: Expected 'EOF', got '#' at position 89: … read line
do
#̲打印信息
echo "tou…line
#将待上传文件列表willDoing改名为willDoing_COPY_
mv line line"COPY"
#读列表文件willDoing_COPY_的内容(一个一个的待上传文件名) ,此处的line 就是列表中的一个待上传文件的path
cat line"COPY" |while read line
do
#打印信息
echo “puting…hdfs_root_dir”
hadoop fs -mkdir -p $hdfs_root_dir
hadoop fs -put $line $hdfs_root_dir
done
mv line"COPY" line"DONE"
done**
上面这个代码:主要是在linux中 将log目录下的日志文件,上传(移动到logs/toupload/)下