学习大数据的第47天(HDFS以及Zookeeper)——HDFS的重要架构知识点以及zookeeper的安装和基本命令

HDFS的知识点

HDFS文件块的大小

有了hdfs为什么还要有hbase hdfs需要zookeeper吗_HDFS

HDFS的写流程

有了hdfs为什么还要有hbase hdfs需要zookeeper吗_HADOOP_02

自己的话总结一下:

首先客户端通过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();
数据备份:

有了hdfs为什么还要有hbase hdfs需要zookeeper吗_有了hdfs为什么还要有hbase_03

数据备份的意义:

1、机架容灾,网络问题,整个机架毁损

2、相同机架中的DataNode保存两份

为什么不放三个机架中 呢?

可能会造成很大的网络IO问题

机架感知:

有了hdfs为什么还要有hbase hdfs需要zookeeper吗_HDFS_04

HDFS的读流程

有了hdfs为什么还要有hbase hdfs需要zookeeper吗_数据库_05

代码详解:
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为什么还要有hbase hdfs需要zookeeper吗_HDFS_06

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的工作流程:

有了hdfs为什么还要有hbase hdfs需要zookeeper吗_HDFS_07

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=有了hdfs为什么还要有hbase hdfs需要zookeeper吗_学习_08ZOOKEEPER_HOME/bin

source /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 /test

ls /test

delete 只能删除没有子节点的节点
rmr /test 删除节点

9、重置zk

1、杀掉所有zk进程
kiil -9 pid

2、删除data目录下的version文件, 所有节点都要删除
rm -rf /usr/local/soft/zookeeper-3.4.6/data/version-2

2、启动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节点