一、HDFS概述
1. 什么是HDFS
HDFS 全称是Hadoop Distributed File System hadoop分布式(cluser)文件存储系统.
2. HDFS基本架构
1、hadoop1体系 64M一个快(少)
hadoop2体系 128M一个块(默认)
8TB (3TB/3TB/2TB)n=X/128 个快
提高数据读写效率(利于并行读取数据)
2、冗余存储 (24TB 动态扩充 ,保证数据安全)
3、校验和(确定块是否完整 是否损坏)
原理:实现思想(加密算法MD5 不可逆)
可对二进制加密,128M加密----> 32个字符串(16进制0F)
元不变(加密结果也不会改变)
datanode 定期检查块 (向nameNode汇报块是否损坏)。
NameNode 的持久化?:
3. 搭建[HDFS]
/opt/models 原始文件
/opt/install 安装文件放置的位置
1. linux服务器的基本配置
设置ip,关闭防火墙,关闭selinux,配置主机名,主机与ip映射
2. 安装jdk 1.7+
rpm -ivh jdk-7u71-linux-x64.rpm 默认安装位置 /usr
环境变量的配置
vi /etc/profile 环境变量 linux 所有用户生效
vi ~/.bash_profile 环境变量 当前用户生效
vi ~/.bashrc
JAVA_HOME=/usr/java/jdk1.7.0_71
CLASSPATH=.
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
export JAVA_HOME
export CLASSPATH
export PATH
source .bash_profile
4. 安装hadoop
tar -zxvf hadoop-2.5.2.tar.gz -C /opt/install
5. hadoop配置文件的配置 etc/hadoop
1.1 hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.7.0_71
1.2 core-site.xml
<!--用于设置namenode并且作为Java程序的访问入口--->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop.baizhiedu.com:8020</value>
</property>
<!--存储NameNode持久化的数据,DataNode块数据——>
<!--手工创建$HADOOP_HOME/data/tmp-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop-2.5.2/data/tmp</value>
</property>
1.3 hdfs-site.xml
<!--设置副本数量 默认是3 但是单节点测试,改成1-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
1.4 mapred-site.xml
<!--yarn 与 MR相关-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
1.5 yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
1.6 slaves
hadoop2.baizhiedu.com
6. namenode的格式化
【第一次搭建hdfs集群时需要使用】
目的作用:格式化hdfs系统,并且生成存储数据块的目录
bin/hdfs namenode -format
7. 启动hadoop守护进程
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
8. 测试验证安装成果
ps -ef | grep java
jps 查看相关4个进程
通过网络进行访问测试
浏览器 http://hadoop2.baizhiedu.com:50070 hdfs
http://hadoop2.baizhiedu.com:8088 yarn
9. Hadoop HDFS运行过程中的错误分析#
1. 查看日志
tail -nxxx 文件名
$HADOOP_HOME/logs
[hadoop-用户名-namenode-主机名.log]
hadoop-root-namenode-hadoop2.baizhiedu.com.log
hadoop-root-datanode-hadoop2.baizhiedu.com.log
yarn-root-resourcemanager-hadoop2.baizhiedu.com.log
yarn-root-nodemanager-hadoop2.baizhiedu.com.log
10、HDFS的client访问
1. 查看目录结构
bin/hdfs dfs -ls 路径
bin/hdfs dfs -ls /
2. 创建文件夹
bin/hdfs dfs -mkdir /suns
bin/hdfs dfs -mkdir -p /liuh/xiaojr
3. 本地上传文件到hdfs中
bin/hdfs dfs -put /root/hdfs/data /suns
bin/hdfs dfs -put local_path hdfs_path
4. 查看文件内容
bin/hdfs dfs -text /suns/data
bin/hdfs dfs -cat /suns/data
5. 删除
bin/hdfs dfs -rm /suns/data
注意事项:可以修改垃圾桶的存活时间
core-site.xml
<property>
<name>fs.trash.interval</name>
<value>10</value>
</property>
垃圾桶的位置:/user/root/.Trash/190522010000/suns/data
hdfs:有权限:
hdfs-site.xml
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
6. 删除非空文件夹
bin/hdfs dfs -rmr /suns
7. 从hdfs下载文件到本地
bin/hdfs dfs -get hdfs_path local_path
8. cp mv
11.指定 Hadoop的启停脚本
shell脚本 当前目录执行方式 ./hadoop-start.sh
绝对路径执行shell /opt/install/hadoo-2.5.2/hadoop-start.sh
linux hadoop-start.sh
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
hadoop-stop.sh
sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
sbin/yarn-daemon.sh start nodemanager
hadoop-stop.sh
sbin/hadoop-daemon.sh stop namenode
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop resourcemanager
sbin/yarn-daemon.sh stop nodemanager
二、NameNode的持久化(persistent)
NameNode在运行时,元数据放置在内存中。
如果内存出现问题,则元数据丢失。
为了保证元数据安全,NameNode有对应的持久化机制,把元数据持久化到硬盘存储。
1. FSImage和EditsLog
1、FSImage(文件系统镜像二进制)
存储某一个时间点(checkPoint)的NameNode镜像数据
默认存储位置 /opt/install/hadoop-2.5.2/data/tmp/dfs/name
dfs.namenode.name.dir
2、EditsLog
可编辑日志二进制 记录(检查点以后的所有写操作)
默认存储位置 dfs.namenode.edits.dir
3、 定制FSImage和EditsLog的存储位置
~~~markdown
hdfs-site.xml
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///xxx/xxxx</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///xxx/xxxx</value>
</property>
2、 安全模式(safe mode)
每一次启动namenode时,hdfs都需要进行FSImage和EditsLog的整合,
在这个过程中,不允许用户做写操作,把这个过程称之为安全模式(safe mode),默认30秒
(1). safe mode相关命令
bin/hdfs dfsadmin -safemode [enter leave get]
(2). HDFS集群启动是,完成流程
HDFS集群启动 过程 (安全模式)
1,整合 FSImage和EditsLog 生成新的EditsLog 和 FSImage,由新EditsLog接收用户写操作命令
2, DataNode都需NameNode主动汇报健康情况(心跳)3秒
3, 汇报块列表 通过校验和 检查块是否可用,并定期1小时汇报。
3、SecondaryNameNode作用
自定义SecondaryNameNode 拉取数据的周期
hdfs-site.xml
dfs.namenode.checkpoint.period 3600秒
dfs.namenode.checkpoint.txns 1000000
secondaryNameNode启动方式:
sbin/start-dfs.sh
sbin/hadoop-daemon.sh start secondarynamenode
定制secondaryNameNode 启动的节点
hdfs-site.xml
dfs.namenode.secondary.http-address 0.0.0.0:50090
dfs.namenode.secondary.https-address 0.0.0.0:50091
4、HANameNode集群(高可用)
zookeeper:选主过程
1 ,2,3,4,5,按编号依次启动:
服务器1启动,给自己投票,发投票信息,由于其它机器还没有启动所以它收
不到反馈信息,服务器1的状态一直属于Looking(选举状态)。
服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大
所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3
的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。
服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为小弟。
服务器5启动,后面的逻辑同服务器4成为小弟。
LOOKING,竞选状态。
FOLLOWING,随从状态,同步leader状态,参与投票。
OBSERVING,观察状态,同步leader状态,不参与投票。
LEADING,领导者状态。
zookeeper 集群高可靠 (奇数台)
作用:
1、选主namenode(投票)active/standby
2、管理EdisLog(QJN),将EdisLog同步给Standby(NameNode)
standyBy(Namenode)
作用:
1、从zookerper上拉取edisLog 进行整合成 FSImage 替换原有的FSImage
2、接受dataNode 的元数据信息。
3、当activeNameNode 宕机时,全权接管 activeNameNode的所有功能,对外进行服务
5、 hdfs写文件的步骤
(1)client向NameNode申请上传…/xxx.txt文件
(2)NN向client响应可以上传文件
(3)Client向NameNode申请DataNode
(4)NN向Client返回DN1,DN2,DN3
(5)Client向DN1,DN2,DN3申请建立文件传输通道
(6)DN3,DN2,DN1依次响应连接
6、 hdfs读取文件步骤
(1)client向NN请求下载…/xxx.txt文件
(2)NN向client返回文件的元数据
(3)Client向DN1请求访问读数据blk_1
(4)DN1向Client传输数据
(5)Client向DN2请求访问读数据blk_2
(6)DN2向Client传输数据
7、hadoop的shuffle过程
(1)、Map的输出会先写到内存缓冲区中
(2)、达到 阀值(100M)/0.8产生溢写
(3)、产生临时文件,写到本地磁盘
(4)、多个file1 临时文件 marge排序合并(按分区、排序) ,个数为分区个数。
存在本地linux服务器端。
(1)、reduce 通过 http 找nodemanager
(2)、主动拉去数据到 内存 环形缓冲区(分组排序 group sort)
(3)、产生溢写——多个临时文件
(4)、临时文件merge汇总(分组 、排序)交给——reduce
8、HANameNode集群的搭建
1. zookeeper集群
1.1 解压缩
tar -zxvf zookeeper-xxx-tar.gz -C /opt/install
1.2 创建数据文件夹
mdkir zookeeper_home/data
1.3 conf目录修改zookeeper的配置文件
修改zoo_sample.cfg 为 zoo.cfg
mv zoo_sample.cfg zoo.cfg
编辑内容
dataDir=/opt/install/zookeeper-3.4.5/data
server.0=hadoop2.baizhiedu.com:2888:3888
server.1=hadoop3.baizhiedu.com:2888:3888
server.2=hadoop4.baizhiedu.com:2888:3888
1.4 zookeeper_home/data
myid文件 0 hadoop2.baizhiedu.com
myid文件 1 hadoop3.baizhiedu.com
myid文件 2 hadoop4.baizhiedu.com
1.5 scp -r 命令 同步集群中所有节点 并 修改对应的myid文件
1.6 主节点 ssh 其他节点
1.7 启动zk服务
bin/zkServer.sh start | stop | restart
bin/zkServer.sh status 查看集群状态 【必须集群完整启动完成】
bin/zkCli.sh [leader]
2. HA-HDFS集群
删除 data/tmp
2.1 core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/install/hadoop-2.5.2/data/tmp</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop2.baizhiedu.com:2181,hadoop3.baizhiedu.com:2181,hadoop4.baizhiedu.com:2181</value>
</property>
2.2 hdfs-site.xml
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop2.baizhiedu.com:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop2.baizhiedu.com:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop3.baizhiedu.com:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop3.baizhiedu.com:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop2.baizhiedu.com:8485;hadoop3.baizhiedu.com:8485;hadoop4.baizhiedu.com:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/install/hadoop-2.5.2/journal</value>
</property>
<!-- 开启NameNode故障时自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制,如果ssh是默认22端口,value直接写sshfence即可 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
2.3 yarn-env.sh添加如下内容
export JAVA_HOME=/usr/java/jdk1.7.0_71
首先启动各个节点的Zookeeper,在各个节点上执行以下命令:
bin/zkServer.sh start
在某一个namenode节点执行如下命令,创建命名空间
bin/hdfs zkfc -formatZK
在每个journalnode节点用如下命令启动journalnode
sbin/hadoop-daemon.sh start journalnode
在主namenode节点格式化namenode和journalnode目录
bin/hdfs namenode -format ns
在主namenode节点启动namenode进程
sbin/hadoop-daemon.sh start namenode
在备namenode节点执行第一行命令,这个是把备namenode节点的目录格式化并把元数据从主namenode节点copy过来,并且这个命令不会把journalnode目录再格式化了!然后用第二个命令启动备namenode进程!
bin/hdfs namenode -bootstrapStandby
sbin/hadoop-daemon.sh start namenode
在两个namenode节点都执行以下命令
sbin/hadoop-daemon.sh start zkfc
在所有datanode节点都执行以下命令启动datanode
sbin/hadoop-daemon.sh start datanode
日常启停命令
sbin/start-dfs.sh
sbin/stop-dfs.sh