学习大数据的第47天(HDFS以及Zookeeper)——HDFS的重要架构知识点以及zookeeper的安装和基本命令
HDFS的知识点
HDFS文件块的大小
HDFS的写流程
自己的话总结一下:
首先客户端通过fs(类型为DistributedFileSystem)向NameNode发送请求,NameNode回应请求,继续请求上传第一个block块,NameNode回应客户端存储到哪个datanode中,这里数据在备份的时候要求跨机架,数据保存到多个Datanode中,FSDataInputStream请求建立连接,datanode之间应答通道请求,FSDataInputStream传输第一个block块,datanode返回传输结果。
代码详解:
Configuration conf = new Configuration();
// public void set(String name, String value) {
conf.set("fs.defaultFS","hdfs://master:9000");
FileSystem fs = FileSystem.get(conf);
/**
* Params:
* delSrc – whether to delete the src
* overwrite – whether to overwrite an existing file
* src – path 文件的路径
* dst – path HDFS 的文件路径 完整的路径
*/
fs.copyFromLocalFile(false,true,new Path("G:\\MyIdeaProjects\\HadoopCode\\data\\sanguo.txt"),new Path("/hdfsDemo/sanguo.txt"));
fs.close();
数据备份:
数据备份的意义:
1、机架容灾,网络问题,整个机架毁损
2、相同机架中的DataNode保存两份
为什么不放三个机架中 呢?
可能会造成很大的网络IO问题
机架感知:
HDFS的读流程
代码详解:
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:9000");
conf.set("dfs.replication", "3");
FileSystem fs = FileSystem.get(conf);
/**
* Params:
* f – is the path
* recursive – if the subdirectories need to be traversed recursively 如果需要递归,则设置为true
*
*/
RemoteIterator<LocatedFileStatus> files = fs.listFiles(new Path("/hdfsDemo/sanguo2.txt"), true);
while (files.hasNext()) {
LocatedFileStatus fileStatus = files.next();
//获取block 大小
System.out.println(fileStatus.getBlockSize());
//获取路径
System.out.println(fileStatus.getBlockLocations());
//获取所有者
System.out.println(fileStatus.getOwner());
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
for (BlockLocation b : blockLocations) {
//获取Host
System.out.println("hosts:" + b.getHosts());
System.out.println("names:" + b.getNames());
System.out.println("length:" + b.getLength());
}
}
fs.close();
NameNode:
NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件,namenode启动后一些新增元信息日志。
fstime:保存最近一次checkpoint的时间 (老版本)
以上这些文件是保存在linux的文件系统中。
hdfs-site.xml的dfs.namenode.name.dir属性
hdfs的两种命令模式:
hadoop fs
hdfs dfs
hdfs中的oiv和oev的用法
oiv apply the offline fsimage viewer to an fsimage
hdfs oiv -p xml -i fsimage_0000000000000000249 -o fsimage.xml
hdfs oiv -p 文件格式 -i 文件名 -o 转换后的文件路径
hdfs oev -p xml -i edits_inprogress_0000000000000000271 -o edits.xml
hdfs oev -p 文件格式 -i 文件名 -o 转换后的文件路径
NameNode的工作流程:
zookeeper 概述:
Zookeeper使用的数据结构为树形结构,根节点为"/"。Zookeeper集群中的节点,根据其身份特性分为leader、follower、observer。leader负责客户端writer类型的请求;follower负责客户端reader类型的请求,并参与leader选举;observer是特殊的follower,可以接收客户端reader请求,但是不会参与选举,可以用来扩容系统支撑能力,提高读取速度。
Zookeeper是一个基于观察者模式设计的分布式服务管理框架,负责存储和管理相关数据,接收观察者的注册。
zookeeper的安装过程:
1、上传安装包到master并解压
tar -xvf zookeeper-3.4.6.tar.gz
2、配置环境变量
vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6
export PATH=ZOOKEEPER_HOME/binsource /etc/profile
3、修改配置文件
cd conf
cp zoo_sample.cfg zoo.cfg修改
dataDir=/usr/local/soft/zookeeper-3.4.6/data增加
server.0=master:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:3888
4、同步到其它节点
scp -r zookeeper-3.4.6 node1:
pwd
scp -r zookeeper-3.4.6 node2:pwd
配置node1和node2的环境变量
scp /etc/profile node1:/etc/
scp /etc/profile node2:/etc/在所有节点执行
source /etc/profile
5、创建/usr/local/soft/zookeeper-3.4.6/data目录,所有节点都要创建
mkdir /usr/local/soft/zookeeper-3.4.6/data
在data目录下创建myid文件
vim myid
master,node1,node2分别加上0,1,2
6、启动zk,
zkServer.sh start 三台都需要执行
zkServer.sh status 查看状态当有一个leader的时候启动成功
7、连接zk
bash zkCli.sh
zk 是一个目录结构 ,每个节点可以存数据,同时可以有子节点
8、zk shell
创建目录
create /test test
create /test/a 1获取数据
get /testls /test
delete 只能删除没有子节点的节点
rmr /test 删除节点
9、重置zk
1、杀掉所有zk进程
kiil -9 pid2、删除data目录下的version文件, 所有节点都要删除
rm -rf /usr/local/soft/zookeeper-3.4.6/data/version-22、启动zk
zkServer.sh start
zookeeoer笔记:
>>>>>>>>>>>>>>>>>>zookeeper配置信息解释<<<<<<<<<<<<<<<<<<<<<<<<
# The number of milliseconds of each tick
# 心跳时间 ms 2秒一次心跳
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
# 通信限时 当服务启动时 限定初始的心跳数
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
# 超时心跳 数 syncLimit * tickTime = 10s
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/soft/zookeeper-3.4.6/data
# the port at which the clients will connect
clientPort=2181
>>>>>>>>>>>>>>>>>>zookeeper常用命令<<<<<<<<<<<<<<<<<<<<<<<<
# 登录zookeeper
bash zkcli.sh <- 默认连接 localhost:2181
# 命令:
help
表示帮助命令
ls:
表示查看指定路径节点下的节点信息
create /test abc
表示创建节点并赋值
get /test
表示获取指定节点位置的值
set /test cb
表示重新设置节点的值
delete /test/test1
表示删除test1节点