Hadoop2.X的认识
Hadoop 2x
一.Hadoop1.x的弊端
1.namenode只有一个-->容易发生单点故障:当前直接出现问题,整个集群没办法工作
2.namenode没办法扩充
NameNode会随着业务量的增大,内存中的数据会越来越大
会导致一直要增加内存来满足集群的需要
一旦业务量大大的超过内存那么业务就无法被处理
3.NameNode内存太大
如果内存大小达到上百G,开机时间过长
4.不能实现业务隔离
二.Hadoop2.x的解决方案
1.集群高可用
添加主备namenode节点
当主节点发生故障时,直接切换成备用namenode节点
2.集群可扩展性
联邦机制(hdfs federation) 进行分而治之
2.x的变化对用户来讲都是透明的,对用的操作影响很小
三.Hadoop2.x之HA
1.HA的节点
ActiveNameNode(ANN) 活跃的节点
作用:管理元数据信息(路径 文件 权限 等...);启动时接受DN汇报的BLK信息;维护文件与块的映射,维护块与DN的映射;与DN保持心跳,监控DN的存活(3秒, 10 分钟);当客户端写入读取文件的时候都与ANN通信.
StandbyNameNode(SNN) 备用的NamdeNode
删除了SecondaryNameNode,其功能完全有StandbyNameNode代替;如果主节点发生故障可以瞬间切换到备用节点;
作用:管理元数据信息(路径 文件 权限 等...);启动时接受DN汇报的BLK信息;维护文件与块的映射,维护块与DN的映射;与DN保持心跳,监控DN的存活(3s,10m),但是它只是监控,命令全部由ANN完成;当ANN生成日志后,SNN会获取到日志文件在自己的内存中重做;达到阈值(检查点 64M 3600S) 合并edits日志和FSimage快照(
因为备用节点有fsimage和日志,整个合并都是在SNN节点上完成的;整个合并的过程并不是停止SNN进行拍摄快照,而是根据fsimage和edits生成快照);快照生成之后会保存在SNN,并拷贝一份到ANN中.
JournalNode 帮助我们拉取或者存放日志文件
作用:当ANN生成edits的时候,拉取一份到JN集群上;SNN会从JN集群上获取到最新的日志文件,进行重做;
2.zookeeper
作用:管理NameNode的主备切换;监控主节点和备用节点的存活
ZKFC:管理NameNode的主备切换;监控主节点和备用节点的存活
DataNode 存储数据
作用:启动时他会同时向主备节点汇报blk的信息;运行时他会同时和主备节点保持心跳
四.Hadoop2.x之联邦机制
在2.x新增了联邦机制,使用命名空间(namespace)划分namenode作用的范围
namespace相当于是一个目录
具体数据还是要存放在DataNode上
虽然划分了命名空间,但是每个命名空间中namenode还是对应全部的datanode
这样datanode的使用率才会更高
blockpool-->存放着当前命名空间中所有的块对应dn的数据
命名空间卷 = namespace元数据+blockpool
因为命名空间卷是相互独立的,所有当一个namenode挂掉之后,其他命名空间是不会进行任何管理的
联邦机制依然存在单点故障的问题,也就是联邦内的命名空间也要实现HA
五.搭建Hadoop2.x的HA集群
1.搭建ZooKeeper集群
首先集群整体恢复到相互免密钥
上传并解压zookeeper
tar -zxvf zookeeper-3.4.6.tar.gz
移动压缩包到指定目录
mv zookeeper-3.4.6 /opt/sxt/
进入zookeeper文件中的conf
cd /opt/sxt/zookeeper-3.4.6/conf
拷贝zoo_sample.cfg并改名为zoo.cfg
cp zoo_sample.cfg zoo.cfg
修改配置文件
vim zoo.cfg
修改dataDir为dataDir=/var/sxt/zookeeper
添加:
server.1=node01:2888:3888
server.2=node02:2888:3888
server.3=node03:2888:3888
创建zookeeper数据目录
mkdir -p /var/sxt/zookeeper
设置当前zookeeper的权值
echo 1 > /var/sxt/zookeeper/myid
配置zookeeper环境变量
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_67
export ZOOKEEPER_HOME=/opt/sxt/zookeeper-3.4.6
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
重新加载配置文件
source /etc/profile
拷贝到其他主机
scp -r /opt/sxt/zookeeper-3.4.6/ root@node02:/opt/sxt/
scp -r /opt/sxt/zookeeper-3.4.6/ root@node03:/opt/sxt/
在另外两台主机上创建指定路径
mkdir -p /var/sxt/zookeeper
修改权值
[root@node02 ~]# echo 2 > /var/sxt/zookeeper/myid
[root@node03 ~]# echo 2 > /var/sxt/zookeeper/myid
拷贝环境变量到其他主机
scp -r /etc/profile root@node02:/etc/profile
scp -r /etc/profile root@node03:/etc/profile
重新加载配置文件
source /etc/profile
启动zookeeper集群
zkServer.sh start
查看状态
zkServer.sh status
关闭zookeeper
zkServer.sh stop
关闭并拍摄快照
2.搭建Hadoop-HA集群
上传Hadoop压缩包并解压
tar -zxvf hadoop-2.6.5.tar.gz
移动Hadoop解压包到指定路径下
mv hadoop-2.6.5 /opt/sxt/
进入该路径下
cd /opt/sxt/hadoop-2.6.5/etc/hadoop/
修改JAVA_HOME路径
hadoop-env.sh
marped-env.sh
yarn-env.sh
配置核心文件
coer-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://shsxt</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/sxt/hadoop/ha</value>
</property>
hdfs-site.xml
<property>
<name>dfs.nameservices</name>
<value>shsxt</value>
</property>
<property>
<name>dfs.ha.namenodes.shsxt</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.shsxt.nn1</name>
<value>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.shsxt.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.shsxt.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.shsxt.nn2</name>
<value>node02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/shsxt</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/sxt/hadoop/ha/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.shsxt</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
<value>shell(true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_dsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
修改salves文件
删除localhost
添加
node01
node02
node03
配置Hadoop环境变量
export JAVA_HOME=/usr/java/jdk1.7.0_67
export HADOOP_HOME=/opt/sxt/hadoop-2.6.5
export ZOOKEEPER_HOME=/opt/sxt/zookeeper-3.4.6
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin:$PATH
拷贝该文件到其他主机上
scp /etc/profile root@node02:/etc/profile
scp /etc/profile root@node03:/etc/profile
在三天虚拟机上同时加载加载配置文件
source /etc/profile
将Hadoop拷贝到其他主机上
scp -r /opt/sxt/hadoop-2.6.5/ root@node02:/opt/sxt/
scp -r /opt/sxt/hadoop-2.6.5/ root@node03:/opt/sxt/
创建hadoop数据目录
mkdir -p /var/sxt/hadoop/ha/jn
三台拟机同时启动zookeeper
zkServer.sh start
查看zookeeper状态
zkServer.sh status
在三台虚拟机上启动JouralNode
hadoop-daemon.sh start journalnode
在第一台虚拟机上格式化NameNode
hdfs namenode -format
hadoop-daemon.sh start namenode
在第二台虚拟机上格式化bootstrapStandby
hdfs namenode -bootstrapStandby
在第一台虚拟机上格式化ZKFC
hdfs zkfc -formatZK
在第一台虚拟机上启动集群
start-dfs.sh
注意:这里是以第一台虚拟机作为主虚拟机
执行命令
hdfs dfs -mkdir -p /shsxt/java
hdfs dfs -D dfs.blocksize=1048576 -put jdk-7u67-linux-x64.rpm /user/root
进网站查看相关信息
关机拍摄快照
3.脑裂
ZKFC专门监控Namenode的状态
health monitor 健康监控器;ActiveStandbyElector 主备的选举
health monitor监控主备节点,如果发现主节点发生故障,通知ZKFC;当ZKFC确认需要发生重新选择的时候;ActiveStandbyElector和Zookeeper会对主备重新进行投票选举;肯定选择备用节点为主节点,zkfc通过rpc调用将节点的standby状态设置为active.
4.搭建集群出现的坑
(1)先启动Hadoop后启动zookeeper,zookeeper无法选举主节点,即就是没有主节点,全是从节点
解决方案:删除相关文件var/sxt/hadoop/ha/jn
rm -rf var/sxt/hadoop/ha/jn
重新创建该文件
mkdir -p /var/sxt/hadoop/ha/jn
先启动zookeeper再启动Hadoop即可
(2)jdk路径找不到
解决方案:由于执行配置环境变量这一步 vim /etc/profile 时 没有进行 souerce /etc/profile ;删除相关文件var/sxt/hadoop/ha/jn,再重新生成,再执行 souerce /etc/profile,最后启动即可.
(3)某个节点莫名其妙的死亡
解决方案:该主机的主机名与hdfs-site.xml中的名称不一致,进去修改 .删除相关文件,重新启动即可.
六.搭建eclipse环境
1.Windows配置Hadoop文件
解压hadoop-2.6.5.tar.gz
将其拷贝到 D:\hadoop-2.6.5\hadoop-2.6.5
解压bin.zip文件
将解压后的文件覆盖D:\hadoop-2.6.5\hadoop-2.6.5\bin
配置环境变量
配置HADOOP_HOME : D:\hadoop-2.6.5\hadoop-2.6.5
配置HADOOP_USER_NAME : root
配置PATH: 添加 %HADOOP_HOME%/bin
%HADOOP_HOME%/sbin
配置C:\Windows\System32\drivers\etc\hosts
添加虚拟机节点信息
192.168.61.220 node01
192.168.61.221 node02
192.168.61.222 node03
2.Windows配置eclipse文件
解压Eclipse
放到指定目录 D:\Program Files\eclipse-hadoop
打开eclipse
打开map-reduce视图
创建新的链接
连接名称 shsxt-ha (自定义名称就可以)
node01(查看节点,该节点为主节点)
8020(hdfs-site.xml中配置的访问端口)
user name :root