一起重新开始学大数据-hadoop篇-Day45-hdfs解析和zookeeper安装 |
hadoop启动脚本
详细启动脚本介绍
第一种:全部启动集群所有进程
启动:sbin/start-all.sh
停止:sbin/stop-all.sh
第二种:单独启动hdfs【web端口50070】和yarn【web端口8088】的相关进程
启动:sbin/start-dfs.sh sbin/start-yarn.sh
停止:sbin/stop-dfs.sh sbin/stop-yarn.sh
每次重新启动集群的时候使用
第三种:单独启动某一个进程
启动:hdfs:sbin/hadoop-daemon.sh start (namenode | datanode)
停止:hdfs:sbin/hadoop-daemon.sh stop (namenode | datanode)
启动:yarn:sbin/yarn-daemon.sh start (resourcemanager | nodemanager)
停止:yarn:sbin/yarn-daemon.sh stop(resourcemanager | nodemanager)
用于当某个进程启动失败或者异常down掉的时候,重启进程
hdfs
hdfs Shell介绍
调用文件系统(FS)Shell命令应使用 bin/hdfs dfs -xxx 的形式。
所有的FS shell命令使用URI路径作为参数。
URI格式是scheme://authority/path。HDFS的scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。
例如:/parent/child可以表示成hdfs://namenode:namenodePort/parent/child,或者更简单的/parent/child(假设配置文件是namenode:namenodePort)
大多数FS Shell命令的行为和对应的Linux Shell命令类似。
调用文件系统(FS)Shell命令
应使用hdfs dfs -xxx 的形式
-ls
查看hdfs上目录,如 hdfs dfs -ls /-put
将本地文件上传到hdfs,如hdfs dfs -put 本地文件路径 hdfs路径-get
将hdfs文件下载到本地,如 hdfs dfs -get hdfs文件路径 本地文件路径-mkdir
在hdfs 上创建文件夹,如hdfs dfs -mkdir /test-cp
将hdfs文件或目录复制 如 hdfs dfs -cp /test.txt /a/-cat
查看hdfs上文件内容 如hdfs dfs -cat /test.txt
HDFS概述
- 数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 。
- 是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。
- 通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
-m容错。即使系统中有某些节点宕机,整体来说系统仍然可以持续运作而不会有数据损失【通过副本机制实现】。
- 分布式文件管理系统很多,hdfs只是其中一种,不合适小文件。
HDFS架构
Namenode
NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件,namenode启动后一些新增元信息日志。
fstime:保存最近一次checkpoint的时间
以上这些文件是保存在linux的文件系统中。
hdfs-site.xml的dfs.namenode.name.dir属性
secondary namenode的工作流程
- secondary通知namenode切换edits文件
- secondary从namenode获得fsimage和edits(通过http)
- secondary将fsimage载入内存,然后开始合并edits
- secondary将新的fsimage发回给namenode
- namenode用新的fsimage替换旧的fsimage
什么时候checkpiont
- fs.checkpoint.period指定两次checkpoint的最大时间间隔,默认3600秒。
- fs.checkpoint.size规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。
DataNode
- 提供真实文件数据的存储服务。
- 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。2.0以后HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
hdfs-site.xml中dfs.blocksize属性 - 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
- Replication。多复本。默认是三个。
hdfs-site.xml的dfs.replication属性
HDFS的Trash回收站
和Linux系统(桌面环境)的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,fs.trash.interval是在指在这个回收周期之内,文件实际上是被移动到trash的这个目录下面,而不是马上把数据删除掉。等到回收周期真正到了以后,hdfs才会将数据真正删除。默认的单位是分钟,1440分钟=60*24,刚好是一天。 配置:在每个节点(不仅仅是主节点)上添加配置 core-site.xml,增加如下内容
注意:如果删除的文件过大,超过回收站大小的话会提示删除失败
需要指定参数 -skipTrash
FileSystem
fileSysterm是使用java代码操作hdfs的api接口
文件操作
- create 写文件
- open 读取文件
- delete 删除文件
目录操作
- mkdirs 创建目录
- delete 删除文件或目录
- listStatus 列出目录的内容
- getFileStatus 显示文件系统的目录和文件的元数据信息
- getFileBlockLocations 显示文件存储位置
实操
pom.xml导包
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
HdfsDemo.java
package hdfs;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.*;
public class HdfsDemo {
FileSystem fs=null;
@Before
public void getconf() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://master:9000");
fs = FileSystem.get(conf);
}
@Test
public void create() throws IOException {
FSDataOutputStream os=null;
if (!fs.exists(new Path("/1.txt"))) {
os = fs.create(new Path("/1.txt"));
}else{
os=fs.append(new Path("/1.txt"));
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write("hadoop hdfs mapreduce yarn");
bw.close();
}
@Test
public void readFile()throws Exception{
FSDataInputStream is = fs.open(new Path("/1.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line=null;
while ((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
is.close();
}
@Test
public void deleteFile() throws IOException {
fs.delete(new Path("/1.txt"),true);
}
@Test
public void mkdir() throws IOException {
fs.mkdirs(new Path("/dir1/dir2"));
}
@Test
public void deledir() throws IOException {
fs.delete(new Path("/dir1/dir2"),true);
}
@Test
public void listStatus() throws IOException {
FileStatus[] fs1 = fs.listStatus(new Path("/"));
for (FileStatus f : fs1) {
if(f.isFile()){
System.out.println(f);
}else if (f.isDirectory()){
FileStatus[] fileStatuses = fs.listStatus(f.getPath());
for (FileStatus f1 : fileStatuses) {
System.out.println(f1);
}
}
}
}
@After
public void close() throws IOException {
fs.close();
}
}
Client读取多副本文件过程
RPC(Remote Procedure Call)
- RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
- RPC采用客户机(client)/服务器(server)模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
- hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)。
HDFS中的单位block,packet,chunk
1、Block
文件上传前需要分块,这个块就是block,一般为128MB,当然你可以去改,不顾不推荐。因为块太小:寻址时间占比过高。块太大:Map任务数太少,作业执行速度变慢。它是最大的一个单位。
2、Packet
packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB。
3、Chunk
chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk写入packet的大小为516Byte。由此可见真实数据与校验值数据的比值约为128 : 1。(即64*1024 / 512)
例如,在client端向DataNode传数据的时候,HDFSOutputStream会有一个chunk buff,写满一个chunk后,会计算校验和并写入当前的chunk。之后再把带有校验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DataNode就是从这个dataQueue获取client端上传的数据并存储的。同时一个DataNode成功存储一个packet后之后会返回一个ack packet,放入ack Queue中。
HDFS读文件
读文件流程分析
1.首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例
2.DistributedFileSystem通过rpc获得文件的第一个block的locations,同一block按照副本数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面.
3.前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。
4.数据从datanode源源不断的流向客户端。
5.如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。
6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。
7.如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像
8.该设计的方向就是客户端直接连接datanode来检索数据并且namenode来负责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。
HDFS写文件
(注:写完数据,发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性)
写文件流程分析
1.客户端通过调用DistributedFileSystem的create方法创建新文件
2.DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前,namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,namenode就会记录下新文件,否则就会抛出IO异常.
3.前两步结束后会返回FSDataOutputStream的对象,与读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream.DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列data quene。
4.DataStreamer会去处理接受data queue,他先问询namenode这个新的block最适合存储的在哪几个datanode里,比如副本数是3,那么就找到3个最适合的datanode,把他们排成一个pipeline.DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。
5.DFSOutputStream还有一个对列叫ack queue,也是由packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
如果在写的过程中某个datanode发生错误,会采取以下几步:
1) pipeline被关闭掉;
2)为了防止丢包 ack queue里的packet会同步到data queue里;
3)把产生错误的datanode上当前在写但未完成的block删掉;
4)block剩下的部分被写到剩下的两个正常的datanode中;
5)namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。
6.客户端完成写数据后调用close方法关闭写入流
7.DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一个ack后,通知datanode把文件标示为已完成。
ZooKeeper
zk安装
1、上传安装包到master并解压tar -xvf zookeeper-3.4.10.tar.gz -c /usr/local/soft
2、配置环境变量vim /etc/profile
export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile
3、添加data文件目录,添加myid文件cd /usr/local/soft/zookeeper-3.4.10/
mkdir zkdata
cd zkdata
touch myid
4、修改配置文件cd conf
①配置文件重命名
cp zoo_sample.cfg zoo.cfg
②修改
vim zoo.cfg
③修改文件内容
dataDir=/usr/local/soft/zookeeper-3.4.10/zkdata
④增加
server.0=master:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:3888
配置参数详解
Server.A=B:C:D。
A 是一个数字,表示第几台服务器;
B 是这台服务器的 IP 地址;
C 是这台服务器与集群中的 Leader 服务器交换信息的端口;
D 表示当集群中的 Leader 服务器无法正常运行时,需要一个端口来重新进行选举,
选出一个新的 Leader 服务器,而这个端口就是用来执行选举时服务器相互通信的端口。
在集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,其中有一个数据就是 A
的值,Zookeeper 启动时读取此文件,并将里面的数据与 zoo.cfg 文件里面的配置信息进行比
较,从而判断到底是哪台服务器。
5、同步到其它节点cd /usr/local/soft/
scp -r zookeeper-3.4.10 node1:pwd
scp -r zookeeper-3.4.10 node2:pwd
配置node1和node2的环境变量
在所有节点执行
source /etc/profile
6、编辑/usr/local/soft/zookeeper-3.4.10/zkdata/myid
master,node1,node2分别加上0,1,2
7、启动zkzkServer.sh start
三台都需要执行
zkServer.sh status
查看状态
通过jps可以查看zk的进程:QuorumPeerMain
当有一个leader的时候启动成功
– —停止zk方式-----zkServer.sh stop
一旦执行三台都需要执行
8、连接zk
zkCli.sh
参数:
-server host:port
zk简析
zk 是一个目录结构 ,每个节点可以存数据,同时可以有子节点
zk shell
命令
创建目录create /test testData
create /test/a aData
获取数据
get /test
ls /test
delete
只能删除没有子节点的节点
rmr /test
删除节点
重置zk
1、杀掉所有zk进程
kiil -9 pid
2、删除data目录下的version文件, 所有节点都要删除
rm -rf /usr/local/soft/zookeeper-3.4.10/zkdata/version-2
3、启动zk
zkServer.sh start
|
|
|
|
上一章-hadoop篇-Day44-Hadoop、hdfs概述架构简析,Hadoop集群搭建下一章-hadoop篇-day46 Hdfs、yarn的HA,mapreduce(1) |
|
|
|
|
听说长按大拇指👍会发生神奇的事情呢!好像是下面的画面,听说点过的人🧑一个月内就找到了对象的💑💑💑,并且还中了大奖💴$$$,考试直接拿满分💯,颜值突然就提升了😎,虽然对你好像也不需要,是吧,吴彦祖🤵! |