我们先来看一下hadoop1.x的架构图
image
可以看到,有且只有一个namenode,集群可靠性会受到影响,当namenode出现问题时会影响到整个集群工作,所以,在hadoop2.x中解决了这个问题。
Hadoop 2.0产生背景
- hadoop 1.0 中HDFS和MapReduce在高可用、扩展性等方面存在问题
- HDFS存在的问题
1.NameNode单点故障,难以用于在线场景
2.NameNode压力过大,且内存受限,影响系统扩展性 - MapReduce存在的问题
1.JobTracker访问压力大,影响系统扩展性
2.难以支持除MapReduce之外的计算框架,比如Spark、Storm等
Hadoop 1.x与Hadoop2.x
- Hadoop 2.x由HDFS、MapReduce和YARN三个分支构成:
1.HDFS:NN Federation、HA;
2.MapReduce:运行在YARN上的MR
3.YARN:资源管理系统
HDFS 2.x Federation - 通过多个namenode/namespace把元数据的储存和管理分散到多个节点中,使namenode/namespace可以通过增加机器来进行水平扩展
- 能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会降低HDFS的性能,可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode下
HDFS 2.0 Federation
QQ截图20180306183158.png
Federation配置:
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1</name>
<value>nn-host1:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value>nn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns1</name>
<value>snn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2</name>
<value>nn-host2:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2</name>
<value>nn-host2:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns2</name>
<value>snn-host2:http-port</value>
</property>
.... Other common configuration ...
</configuration>
Hadoop HA(HDFS High Availability)
对namenode实现高可用,当一个namenode出现故障,备用的namenode会进行自动接管。因此,备用的namenode的元数据要和第一台namenode保持一致,也就是说,fsimage和edits要保持一致。
HA有两种方式,分别是:
HDFS High Availability NFS
HDFS High Availability QJM
HDFS High Availability NFS将edits文件上传至NFS服务器,通过NFS服务器实现多个namenode之间的共享,但是,如果NFS服务器挂掉了,就会影响整个集群环境,也就是说NFS本身就被单点故障所限制,所以,我们一般不会采用这种模式。
HDFS High Availability QJM
JN也就是journalnode,本身就是一个小的集群,直接把edits文件交给JN来管理。通过zookeeper来监控各namenode的状态
HA环境搭建
下载安装hadoop2.x
下载安装zookeeper
依然以五个节点node1-node5为例,node1和node2为namenode。node1-node3为journalnode。node3-node5为zookeeper集群,node3-node5为datanode。理论上来说应该一个节点对应一个独立功能,但是服务器有限,所以功能有所重叠。
1.时间同步:ntpdate -u edu.ntp.org.cn
关闭网络hosts防火墙
2.安装jdk
3.上传hadoop安装文件并解压
4.免密钥登录:node1到node1-5
node2到node1-5
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
5.修改配置文件
hadoop1.x中创建的masters文件要保证每台服务器都删除。
hadoop_env.sh中的JAVA_HOME
core-site.xml
hdfs-site.xml
slaves 指定datanode
6.同步配置文件
7.启动journalnode在node1-node3上执行:hadoop-daemon.sh start journalnode
8.格式化其中一台namenode:hdfs namenode -format
9.同步其他没有格式化的NN,在其他NN上执行:hdfs namenode -bootstrapStandby
10.启动zookeeper集群,分别在node3-node5上执行:进入zookeeper的bin目录下执行./zkServer.sh start
11.格式化zookeeper:在一台namenode上执行hdfs zkfc -formatZK
12.启动 start-dfs.sh
以后每次重启集群时
[停集群:stop-dfs.sh]
再启动:
启动zookeeper集群:node3-node5,./zkServer.sh start
启动hdfs:start-dfs.sh
详细配置
配置过hadoop1.x的同学一定要删除每个节点配置文件中的masters
修改hadoop_env.sh中的JAVA_HOME为jdk安装目录
hdfs-site.xml配置
<!--指定nameservice,value可以随便起,但必须保证后面配置的一致,建议默认>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!--两个namenode别名,如果更改了nameservice,需要将mycluster更改,下同不赘述>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!--指定rpc地址>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node1:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node2:8020</value>
</property>
<!--指定http地址>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node2:50070</value>
</property>
<!--指定journalnode集群>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
<!--配置故障代理>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--指定私钥文件>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<!--私钥文件位置>
<value>/home/gaojz/.ssh/id_rsa</value>
</property>
<!--配置edits文件存放目录>
<property>
<name>dfs.journalnode.edits.dir</name>
<!--保证目录不存在或为空>
<value>/home/gaojz/opt/journal</value>
</property>
<!--启动自动故障处理>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
core-site.xml配置
<!--nameservice 值为hdfs-site.xml中指定的名称>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--配置文件存储目录>
<property>
<name>hadoop.tmp.dir</name>
<!--保证目录不存在或为空>
<value>/home/gaojz/opt/hadoop</value>
</property>
<!--指定zookeeper集群>
<property>
<name>ha.zookeeper.quorum</name>
<value>node3:2181,node4:2181,node5:2181</value>
</property>
zookeeper配置(在node3-node5安装zookeeper)
进入zookeeper目录的conf下,修改zoo_sample.cfg的文件名为zoo.cfg
tickTime=2000
dataDir=/home/gaojz/opt/zookeeper (文件目录 默认为临时,一定要改)
clientPort=2181
initLimit=5
syncLimit=2
server.1=node3:2888:3888
server.2=node4:2888:3888
server.3=node5:2888:3888
进入zoo.cfg的dataDir配置的目录下,创建myid文件。内容为server对应的数字。比如在node3上,对应的是server.1,因此myid中就写一个1,node4为2,node5为3。
同步配置文件。
启动zookeeper:进入node3-node5的zookeeper的bin目录下分别执行 ./zkServer.sh start
启动之后执行./zkServer.sh status查看状态,leader和follow为正常启动。
启动journalnode集群:在node1-node3上分别执行hadoop-daemon.sh start journalnode启动之后用jps命令查看是否有journalnode进程
在node1上执行hdfs namenode -format
在node1上执行hadoop-daemon.sh start namenode(否侧node2同步会失败)
在node2上同步node1的format:hdfs namenode -bootstrapStandby
格式化zookeeper在node1上执行:hdfs zkfc -formatZK
启动hdfs:start-dfs.sh
网友评论