Hadoop2.*解决了hadoop1.*里面的单点问题,在hadoop2中新的NameNode不再是只有一个,可以有多个每一个都有相同的职能。一个是active状态的,其他是standby状态的。集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可靠。Hadoop2.0中,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享(这也是主流的做法)。如下图所示,便是JournalNode的架构图。
好了废话不多说,开撸。
1.机器分布以及功能的分布
2.xshell or secureCRT
3.JDK1.6 或者 1.7 -------不建议1.8
4.centos的iso
5.安装ssh
6.hadoop2.5.2
download:http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.5.2/hadoop-2.5.2.tar.gz
download:http://hadoop.apache.org/releases.html#19+November%2C+2014%3A+Release+2.5.2+available
7.zookeeper-3.4.6.tar
download:http://www.apache.org/dyn/closer.cgi/zookeeper/
注意:apache提供的hadoop-2.5.2的安装包是在32位操作系统编译的,因为hadoop依赖一些C++的本地库,所以如果在64位的操作上安装hadoop-2.5.2就需要重新在64操作系统上重新编译(建议第一次安装用32位的系统)。
编译教程:http://blog.youkuaiyun.com/ggz631047367/article/details/42460589
64位hadoop2.5.2下载地址:http://pan.baidu.com/s/1kTnIeLT
现在4台虚拟机已经安装好了假设。搭建环境真正的开始 master,node1,node2,node3
一。
0.如果你其中3台虚拟机用的VMware克隆,需要保证ip能够自动获取,做以下修改。其中克隆的主机需要修改
克隆之后的操作系统需要重新分配MAC地址
a、vi /etc/sysconfig/network-scripts/ifcfg-eth0 (网卡信息)
将该文件中删除两行:UUID和物理地址
b、删除rm -rf /etc/udev/rules.d/70-persistent-net.rules 文件
c、重启 init 6 或reboot
1.修改linux主机名
修改每台主机的hostname
vim /etc/sysconfig/network
2.配置hosts文件
我的命名是master、node1、node2、 node3
3.修改IP(可选)改成固定ip,4台主机全部修改
vi /etc/sysconfig/network-scripts/ifcfg-eth0
的HWADDR这个属性=00:0c:29:49:e8:29 ok,mac地址修改好虚拟就可以用了,其他的几台机器的操作一样注意DEVICE="eth2" 这个属性,用ifconfig查看ip信息可以看到
说明网卡用的是eth2这个 接下来就的修改HWADDR这个属性了 vi/etc/udev/rules.d/70-persistent-net.rules 查看你的mac地址列表 找到Name="eth2" 这个,选择 ATTR{address}=="00:0c:29:49:e8:29" 这个mac地址 修改 </span></span>
vi /etc/sysconfig/network-scripts/ifcfg-eth0
4台机器配置完之后分别ping一下几台机器的host,如果ping的通的话就ok了
4.
关闭防火墙,重启还是自动重启
service iptables stop
永久关闭,建议永久关闭
chkconfig iptables off
查看防火墙关闭状态
service iptables status
5.免密设置
(1).
执行:ssh-keygen -t rsa
cd /root/.ssh 进入到 .ssh目录下
这时.ssh目录下会生成私钥和公钥的键值对id_rsa,id_rsa.pub
再其他服务器上执行同样的命令生成文件
(2).将所有服务器上的公钥合并到master 机器上的一个文件authorized_keys中
每台机器执行 cat id_rsa.pub >> authorized_keys
在master机器上执行
ssh root@node1 cat /root/.ssh/id_rsa.pub >> authorized_keys
ssh root@node2 cat /root/.ssh/id_rsa.pub >> authorized_keys
ssh root@node3 cat /root/.ssh/id_rsa.pub >> authorized_keys
(3).查看authorized_keys里面有多个server的公钥信息,如果你有多个server同样往里面加就好了
将authorized_keys、known_hosts分别复制到其他服务器的.ssh目录下
先进入到
scp authorized_keys root@node1:/root/.ssh/
scp known_hosts root@node1:/root/.ssh/
scp authorized_keys root@node2:/root/.ssh/
scp known_hosts root@node2:/root/.ssh/
scp authorized_keys root@node3:/root/.ssh/
scp known_hosts root@node3:/root/.ssh/
这时候再ssh登录,这时候就不用再输入密码啦。
二、安装JDK 配置环境变量之类的就不多说了,自己百度去吧
接下来开始配置zookeeper和hadoop
1.配置zookeeper
root用户下,在/opt/目录下新建一个zookeeper文件夹,用于存放zookeeper文件
mkdir /opt/zookeeper
将下载好的zookeeper-3.4.6文件copy到这个目录下解压
tar -zxvf zookeeper-3.4.6.tar.gz2.在master上配置zookeeper信息
master进行: cd /opt/zookeeper/zookeeper-3.4.6/conf cp zoo_sample.cfg zoo.cfg vim zoo.cfg 修改:dataDir=/opt/zookeeper/zookeeper 在最后添加: server.1=master:2888:3888 server.2=node2:2888:3888 server.3=node3:2888:3888 然后创建一个tmp文件夹 mkdir /opt/zookeeper/zookeeper 再创建一个空文件 touch /opt/zookeeper/zookeeper/myid 最后向该文件写入ID echo 1 > /opt/zookeeper/zookeeper/myid 3、将配置好的zookeeper拷贝到node1、node2三,配置Hadoopscp -r /opt/zookeeper root@node1:/opt[root@node2 node2]# zkServer.sh statusscp -r /opt/zookeeper root@node2:/opt注意:修改node2、node2对应/opt/zookeeper/zookeeper/myid内容 node1: echo 2 > /opt/zookeeper/zookeeper/myid node2: echo 3> /opt/zookeeper/zookeeper/myid 4.配置zookeeper的环境变量 vi /etc/profile/ 最后一行加入 export ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.6 export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin 保存退出 同样将环境变量copy到其他两台机器上 scp -r /etc/profile root@node1:/etc/profilescp -r /etc/profile root@node2:/etc/profile ok 到此zookeeper配置完毕,测试一下三台机器上分别执行此命令 命令:cd /opt/zookeeper/zookeeper-3.4.6/bin ./zkServer.sh start 或者 直接 zkServer.sh start [root@master zookeeper]# zkServer.sh start JMX enabled by default Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@master zookeeper]# 这表示zookeeper 已经启动,接下来在三台机器上分别查看一下zookeeper的启动状态 master机器上 [root@master zookeeper]# zkServer.sh status JMX enabled by default Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: follower [root@master zookeeper]# node1机器上 [root@node1 bin]# zkServer.sh status JMX enabled by default Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg Mode: leader [root@node1 bin]# node2机器上
JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[root@node2 node2]#
这说明zookeeper已经启动成功,两个follower,一个leader
切换到root用户下
命令:su root
在opt下新建hadoop-2.5.2文件夹
命令:mkdir /opt/hadoop-2.5.2
将下载好的hadoop-2.5.2.tar.gz 放到这个文件夹目录下,并解压
命令:tar -zxvf hadoop-2.5.2
修改hadoop的环境变量
vim /etc/profile
修改:
export JAVA_HOME=/usr/java/jdk1.7.0_79
export HADOOP_HOME=/opt/hadoop-2.5.2/hadoop-2.5.2
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
修改hadoop的配置文件
命令:cd /opt/hadoop-2.5.2/hadoop-2.5.2/etc/hadoop
1.修改core-site.xml
命令:vi core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!--指定hadoop数据临时存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,node1:2181,node2:2181</value>
</property>
</configuration>
2.修改hdfs-site.xml
<configuration> <!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- mycluster下面有两个NameNode,分别是master,node1 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>master,node1</value> </property> <!-- master的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.master</name> <value>master:8020</value> </property> <!-- node1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.node1</name> <value>node1:8020</value> </property> <!-- master的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.master</name> <value>master:50070</value> </property> <!-- master的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.node1</name> <value>node1:50070</value> </property> <!--指定NameNode的元数据在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> <!-- 使用隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/journalnode/data</value> </property> <!--开启NameNode故障自动切换--> -> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
</pre><span style="font-size:14px;"><span style="color:#0000ff;"></span></span>
3.修改mapred-site.xml
<configuration> <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
4.修改yarn-site.xml
5.修改slaves<configuration> <!-- Site specific YARN configuration properties --> <!-- 指定resourcemanager地址 --> <property> <name>yarn.resourcemanager.hostname</name> <value>master</value> </property> <!-- 指定nodemanager启动时加载server的方式为shuffle server --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
node1 node2 node3
6.修改修改hadoop-env.sh
#export JAVA_HOME=${JAVA_HOME} --原来
export JAVA_HOME=/usr/java/jdk1.7.0_79
修改完成之后,将hadoop配置文件copy到其他四个机器上
scp -r /opt/hadoop-2.5.2 root@node1:/opt/hadoop-2.5.2
至此Hadoop的配置完毕,接下来就是启动集群了
四。
1.zookeeper已经启动,没有启动则执行下面命令启动
zkServer.sh start
2.启动JournalNode集群
在master上执行已经命令
[root@master hadoop-2.5.2]$ sbin/hadoop-daemons.sh start journalnode
[root@node1 node1]# jps
8060 JournalNode <!--JournalNode进程-->
7788 QuorumPeerMain <!--Zookeeper进程-->
8121 Jps
[root@node1 node1]#
3.格式化zkfc,在zookeeper中生成ha节点 (master上执行)
hdfs zkfc -formatZK
4.格式化hdfs(master上执行)
hadoop namenode -format
core-site.xml中的这个配置
<!--指定hadoop数据临时存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop</value>
</property>
格式化后会在/opt/下建立一个hadoop的临时数据存放目录
5.启动NameNode几点
(1).在master上启动
hadoop-daemon.sh start namenode(2). 在node1上同步namenode的数据,同时启动standby的namenod,命令如下
hdfs namenode –bootstrapStandby
如果启动报错,则有可能格式化完成之后的clusterID 的值跟dataNode的clusterID值不一样,
查看
查看hadoop格式化后的的VERSION(master上执行)
命令:vi /opt/hadoop/dfs/name/current/VERSION
clusterID=CID-46e9e9b3-c242-417d-be4e-d6d493c94963
查看dataNode的clusterID(node1,node2,node3上执行)
命令:vi /opt/hadoop/dfs/data/current/VERSION
clusterID=CID-46234234-23234-be4e-d6d493c94sr2
#如果一样,则保存,排除这个错误,看日志找其他错误原因
#如果两个clusterID不一样,则以master的clusterID为准,将node1,node2,node3上的clusterID 替换为 master上的clusterID保存
在node1以上继续执行
hdfs namenode –bootstrapStandby
如果看到如下信息则表示node1上的namenode同步成功
(4).启动node1上的namenode
hadoop-daemon.sh start namenode
#jps查看进程
[root@node1 node1]# jps
8224 NameNode <!--表示namenode启动成功-->
8261 Jps
8060 JournalNode
7788 QuorumPeerMain
[root@node1 node1]#
hadoop-daemons.sh start datanode
[root@master hadoop]# hadoop-daemons.sh start datanode
192.168.221.129: starting datanode, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-datanode-node3.out
192.168.221.131: starting datanode, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-datanode-node2.out
192.168.221.130: starting datanode, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-datanode-node1.out
[root@master hadoop]#
表示三台datenode都启动成功了
start-yarn.sh
[root@master hadoop]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-master-resourcemanager-master.out
192.168.221.129: starting nodemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-root-nodemanager-node3.out
192.168.221.131: starting nodemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-root-nodemanager-node2.out
192.168.221.130: starting nodemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-root-nodemanager-node1.out
[root@master hadoop]#
表示yarn资源管理器启动成功
hadoop-daemons.sh start zkfc
[root@master hadoop]# hadoop-daemons.sh start zkfc
192.168.221.131: starting zkfc, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-zkfc-node2.out
192.168.221.129: starting zkfc, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-zkfc-node3.out
192.168.221.130: starting zkfc, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-zkfc-node1.out
[root@master hadoop]#
表示zkfc启动成功
接下来,分别查看每台机器上的进程jps
master
[root@master hadoop]# jps
7242 Jps
6481 QuorumPeerMain <!--zookeeper-->
6735 NameNode <!--namenode-->
6937 ResourceManager <!--resourceManager-->
[root@master hadoop]#
node1
[root@node1 node1]# jps
8224 NameNode <!--namenode-->
8448 NodeManager <!--dataManager-->
8601 DFSZKFailoverController <!--zkfc-->
8060 JournalNode <!--journalNode-->
8681 Jps
7788 QuorumPeerMain <!--zookeeper-->
8340 DataNode <!--dataNode-->
[root@node1 node1]#
node2
[root@node2 node2]# jps
4765 JournalNode <!--journalNode-->
4896 DataNode <!--datanode-->
5181 Jps
4998 NodeManager <!--dataManager-->
4514 QuorumPeerMain <!--zookeeper-->
[root@node2 node2]#
node3
[root@node3 logs]# jps
4521 DataNode <!--dataNode-->
4387 JournalNode <!--journalNode-->
4623 NodeManager <!--dataManager-->
4807 Jps
[root@node3 logs]#
以上几个信息如果都有,则表示hadoop集群搭建完成,测试一下
http://master:50070/
http://node1:50070/
因为有三台DataNode,所以 LiveNodes = 3 表示有3个活动的dataNode
大功告成