@Hadoop高可用搭建
前期搭建可以通过以下链接学习:
一、如何安装虚拟机与通过克隆在虚拟机里安装四台Linux系统及配置安装
二、伪分布式安装
你好! 本篇文章主要对完全分布式Hadoop集群环境的安装与配置步骤进行介绍。
本文章的特点是,操作详细,在实践过程中出现的错误进行分析,对常见问题进行了解决,希望可以帮到大家。
下面是需要的一些安装文件,需要者自取
[ 提取码:657t ] jdk安装包、Hadoop、xshell、xftp
hostname | idadderess |
---|---|
node01 | NameNode、Jps、JournalNode、DFSZKFailoverController |
node02 | NameNode、Jps、JournalNode、DFSZKFailoverController、DataNode、QuorumPeerMain、NodeManager |
node03 | Jps、JournalNode、DataNode、QuorumPeerMain、NodeManager、ResourceManager |
node04 | Jps、DataNode、QuorumPeerMain、NodeManager、ResourceManager |
我们首先需要下载虚拟机,同时在虚拟机里面安装四台Linux。方便起见,可以选择先添加一台Linux,配置完成后进行克隆。还需要用到xshell方便操作(这里只简要概述,不具体介绍,具体见前面目录一)
vi etc/sysconfig/network-scripts/ifcfg-eth0
vi /etc/sysconfig/network
vi /etc/hosts
(1)service iptables stop
(2) chkconfig iptables off
(3) vi /etc/selinux/config
SELINUX=disabled
这样设置更安全,如时间错了就把相应文件变成只读文件
(1)存放安装软件 mkdir software
(2)在opt目录中建立gy 文件夹cd /opt
mkdir gy
配置文件
目录: vi + /etc/profile
export JAVA_HOME=/usr/bin/java
export PATH=$PATH:$JAVA_HOME/bin
更新一下文件
source /etc/profile
红色框内为打错的,大家可不要出现输入错误哦
输入jps,结果出现 xxxx jps,说明安装成功
注意:出现 command not find
<1>、查看是否输入正确,source必须执行,否则修改无效
<2>、更改绝对路径
export JAVA_HOME=/usr/bin/java
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin
(1)传文件(在node01上):
注意pwd左右两边的符号,是tab键上面那个
scp jdk-7u67-linux-x64.rpm node02:`pwd`
scp jdk-7u67-linux-x64.rpm node03:`pwd`
scp jdk-7u67-linux-x64.rpm node04:`pwd`
(2)安装文件
在node03、node04、node05上执行rpm安装命令:-rpm -i jdk-7u67-linux-x64.rpm
分发文件node01中的profile文件分发node02、node03、node04
scp profile node02:`pwd`
scp profile node03:`pwd`
scp profile node04:`pwd`
注意pwd左右两边的符号,是tab键上面那个
(3) 检查是否安装完成
利用Xshell全部会话栏,source /etc/profile
利用Xshell全部会话栏,jps,看02、03、04这三台机子的jdk是否装好。
输入jps,结果出现 xxxx jps,说明安装成功
时间相差太大,集群启动后某些进程跑不起来,所以要同步时间
cat /etc/sysconfig/network
cat /etc/hosts
cat /etc/sysconfig/selinux
SELINUX=disabled
service iptables status
在家目录下ll -a
:查看有无.ssh文件,如果没有就ssh localhost
ssh localhost 之后一定要exit退出,不然出大问题哦
cd .ssh
,并ll
查看当前文件
免秘钥操作:
-ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
-cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_key
验证:
ssh localhost 看看需不需要输入密码
一定要exit哦
在node01上给其他三个发送公钥( 路径为:cd .ssh
)
scp id_dsa.pub node02:`pwd`/node01.pub
scp id_dsa.pub node03:`pwd`/node01.pub
scp id_dsa.pub node04:`pwd`/node01.pub
查看一下发送成功没有(到node02、node03、node04的.ssh文件下去看)
首先到目录:cd .ssh
接下来去查看一下 node02:
node03:
node04:
在另外三台机子上追加(node02、node03、node04都要哦)
cat node01.pub >> authorized_keys
验证:
在node01上分别ssh node02
,ssh node03
,ssh node04
,看看能否免秘钥登录
记得ssh 登录以后以后一定要exit
首先做5、1 使每台机子自己可以免秘钥登录
现在实现让node02也可以直接登录node01
scp id_dsa.pub node01:'pwd'/node02.pub
cat node02.pub >> authorized_keys
ssh node01
验证可否免秘钥登录到Hadoop目录下更改:cd /opt/gy/hadoop-2.6.5/etc/hadoop/
(1)去掉snn的配置
dfs.namenode.secondary.http-address
node03:50090
(2)增加以下property
dfs.nameservices
mycluster
dfs.replication
3
dfs.ha.namenodes. mycluster
nn1,nn2
dfs.namenode.rpc-address. mycluster.nn1
node01:9000
dfs.namenode.http-address. mycluster.nn1
node01:50070
dfs.namenode.rpc-address.mycluster.nn2
node02:9000
dfs.namenode.http-address.mycluster.nn2
node02:50070
dfs.namenode.shared.edits.dir
qjournal://node02:8485;node03:8485;node04:8485/mycluster
dfs.journalnode.edits.dir
/var/gy/hadoop/ha/jn //这里的gy改成你建立的名字
dfs.ha.automatic-failover.enabled.cluster
true
dfs.client.failover.proxy.provider.cluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_rsa
改动处写有文字注释、注意修改哦
fs.defaultFS
hdfs://mycluster
ha.zookeeper.quorum
node02:2181,node03:2181,node04:2181
vi slaves
删除node01 添加如下
node02
node03
node04
这段文字改动很小,创建文件名改一下,主机名改一下,但是,一定要注意检查多遍,以防错误,后面查日志文件多半是这里出错
先在node01中安装,后面传输一下即可,传文件方法前面已介绍
利用tar 命令直接解压安装包(此处的gy是自己创建的,具体在文章开头已介绍)
-tar xf hadoop-2.6.5.tar.gz -C /opt/gy (注:-C的C 是大写)
到/opt/gy目录下看是否解压好 cd /opt/gy/hadoop-2.6.5
想要实现任意目录下均可启动hadoop
在目录:cd /opt/gy/hadoop-2.6.5/etc/hadoop/
vi + /etc/profile
export JAVA_HOME=/usr/bin/java
export HADOOP_HOME=/opt/ldy/hadoop-2.6.5
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
在hadoop路径下(前面完整路径,黄色加粗字体),修改profile文件
进入文件内修改(修改完 !wq 保存退出)
修改完成一定要source
验证:输入hd按Tab键可以联想出hdfs
输入start-d按Tab键可以联想出start-dfs.
就表示配置成功了
不要忘记source,更改会不生效哦
在etc目录中修改:cd /opt/ldy/hadoop-2.6.5/etc/hadoop
以上路径的etc不是根目录的etc
vi hadoop-env.sh
vi mapred-env.sh
vi yarn-env.sh
给这三个文件夹的JAVA_HOME改成绝对路径:/usr/java/jdk1.7.0_67
到opt目录下,将其下的目录分发到node02、node03、node04
在目录:cd /opt
scp –r gy/ node02:`pwd`
scp –r gy/ node03:`pwd`
scp –r gy/ node04:`pwd`
pwd左右的符号是tab键上方的键
将hdfs-site.xml和core-site.xml分发到node02、03、04
scp hdfs-site.xml core-site.xml node02:`pwd`
scp hdfs-site.xml core-site.xml node03:`pwd`
scp hdfs-site.xml core-site.xml node04:`pwd`
pwd上的符号注意注意
zookeeper是在node02、node03、node04上安装的
解压安装zookeeper
(1)在目录:cd /sotfware
(四台都在sotfware里安装,如果无根目录下mkdir softer
)
tar xf zookeeper-3.4.6.tar.gz -C /opt/gy
(2)下载传输完成后可以看到在software里看到文件
(3)在sotfware目录下解压安装 tar xf zookeeper-3.4.6.tar.gz -C /opt/gy
(gy是你新建的文件夹,在前期准备中有 介绍)
(4)安装完成在gy文件夹下查看
修改zookeeper的配置文件
(1) cd /opt/gy/zookeeper-3.4.6/conf
(2) 给zoo_sample.cfg改名(以防改错,我们这里用复制命令)
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
修改信息
dataDir=/var/gy/zk
(1)查看是否有zoo.cfg文件
(2)进行修改(数据路径)
(3)并在末尾追加
server.1=node04:2888:3888
server.2=node05:2888:3888
server.3=node06:2888:3888
把zookeeper分发到其他节点
当gy目录下:cd /opt/gy
scp -r zookeeper-3.4.6/ node03:`pwd`
scp -r zookeeper-3.4.6/ node04:`pwd`
并用ll /opt/gy检查下看分发成功没
修改pwd上方符号
给每台机子创建刚配置文件里的路径
(1)绝对路径,任意目录下均可:mkdir -p /var/gy/zk
cd /var/gy/zk/
对node02来说:
echo 1 > /var/gy/zk/myid
cat /var/gy/zk/myid
对node03来说:
echo 2 > /var/gy/zk/myid
cat /var/gy/zk/myid
对node04来说:
echo 3 > /var/gy/zk/myid
cat /var/gy/zk/myid
分发profile文件
(1)先确定zookeeper-3.4.6的路径(按照下载的一般是/opt/gy/zookeeper-3.4.6其中gy是自己建立的文件名)
(2)在node02中的 /etc/profile里面配置
vi + /etc/profile
export ZOOKEEPER_HOME=/opt/gy/zookeeper-3.4.6
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
第一行是添加、第二行是修改
(2)在node02中,然后在把/etc/profile分发到其他node03、node04(绝对路径,所以在哪个路径下皆可以)
scp /etc/profile node05:/etc
scp /etc/profile node06:/etc
(3)在node02、03、04里source /etc/profie
输入zkCli.s,按Tab可以把名字补全zkCli.sh
接着用zkServer.sh status
查看每个zookeeper节点的状态
注意:如果启动不起来,请把/etc/profile里的 JAVA_HOME改
成绝对路径。然后记得source刷新一下
export JAVA_HOME=/usr/bin/java
export PATH=$PATH:/usr/java/jdk1.7.0_67/bin
source /etc/profie
如下图所示:就是启动失败
修改绝对路径(四台都要改)
由于我们是在node02、node03、node04上装的,所以全部会话,在node01上找不到命令,是正常的
启动namenode的原因:为了使两台namenode间完成数据同步
在01、02、03三台机子上分别把journalnode启动起来
hadoop-daemon.sh start journalnode
用jps检查下进程启起来了没
node01:
node02:
node03:
没启动起来
检查日志:cd /opt/gy/hadoop-2.6.5/logs/
tail -100 hadoop-root-journalnode-node01.log
(相应的日志里去找一下)
常见问题:配置文件括号对应、出现空格等
随意挑一台namenode上执行hdfs namenode –format
另一台namenode不用执行,否则clusterID变了,找不到集群了。
然后,启动刚刚格式化的那台namenode
hadoop-daemon.sh start namenode
我们要给另一台namenode同步一下数据,用以下命令
(1)hdfs namenode -bootstrapStandby
(2)格式化zkfc
全部会话jps查看都有些什么进程,如果和下图一样,恭喜小可爱成功一半啦
node01:
node02:
node03:
node04:
如果那个节点没起来到hadoop目录下去看那个node的日志文件log
静下心来慢慢找错,日志会提示错误哦
hadoop-daemon.sh start journalnode
cd /opt/ldy/hadoop-2.6.5/logs/
tail -100 hadoop-root-journalnode-node03.log
关闭集群:stop-dfs.sh
关闭zookeeper命令:zkServer.sh stop
注意:你下一次启动hdfs集群的时候不需要用hadoop-daemon.sh start journalnode
命令启动journalnode
只要start-dfs.sh就可以了。我们之前启动journalnode是为了同步两个namenode之间的信息。
cp mapred-site.xml.template mapred-site.xml
mapreduce.framework.name
yarn
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.resourcemanager.ha.enabled
true
yarn.resourcemanager.cluster-id
cluster1
yarn.resourcemanager.ha.rm-ids
rm1,rm2
yarn.resourcemanager.hostname.rm1
node03
yarn.resourcemanager.hostname.rm2
node04
yarn.resourcemanager.zk-address
node02:2181,node03:2181,node04:2181
scp mapred-site.xml yarn-site.xml node02:`pwd`
scp mapred-site.xml yarn-site.xml node03:`pwd`
scp mapred-site.xml yarn-site.xml node04:`pwd`
node03和node04之间相互免秘钥(参考5)
用localhost以后一定要exit
PS:node 03与node04都是resourcemanager,所以他们相互免秘钥
完整的启动步骤
启动zookeeper,全部会话zkServer.sh start
在node01上启动hdfs,start-dfs.sh
在node01上启动yarn,start-yarn.sh
在node02、03上分别启动resourcemanager,
yarn-daemon.sh start resourcemanager
全部会话jps,看进程全不全
完整的退出步骤
关闭集群:
node01: stop-dfs.sh
node01: stop-yarn.sh
(停止nodemanager)
node03,node04:yarn-daemon.sh stop resourcemanager
Node02、03、04:zkServer.sh stop
如何看是否完全退出
jps之后只有jps xxx
到如下目录
cd /opt/ldy/hadoop-2.6.5/share/hadoop/mapreduce
在hdfs里建立输入目录和输出目录
hdfs dfs -mkdir -p /data/in
hdfs dfs -mkdir -p /data/out
将要统计数据的文件上传到输入目录并查看
hdfs dfs -put ~/500miles.txt /data/input
hdfs dfs -ls /data/input
运行wordcount(注意:此时的/data/out必须是空目录)
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/in /data/out/result
你成功了吗?
首先观察一下,是否出现如下进程map变化
其次去网页观察一下,有sucess嘛
最后我们再去看一下运行完的程序结果
记住此时的/data/out必须是空目录
补充:1、运行失败查看日志文件,多半是配置错误,回到6检查一遍哦
2、运行较慢可能出现map百分之75,最后100%,这样问题不大, 可以成功等等就好
3、data/out 运行第二次不为空了,创建另一个文件
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /data/in /data/out/result_1
或者删除
在dfs中删除目录:hadoop fs -rm -r /data/out/result
问题小结–个人比较粗心遇到的问题比较多,不过解决后收获较多
jps后namenode总不出来
1、根据日志报错(前面有如何看日志介绍见12、3)
2、日志居然找不到错误,检查一下配置(见6 namenode配置,没有空格的地方不要多空格)
3、修改了node01的配置文件,一定记得传输给其他之前同样配置机子。
node01与node02同步了
1、localhost忘记退出了导致混乱,千万不要犯这种低级错误
出现命令找不到
1、查找自己是否打错,要细心哦
2、查看目录,看一下是否存在
输入易错点
1、免秘钥处 -f前面有空格 -ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
2、pwd上面的符号,在tab上方,不要打成分号
3、输入目录名可以利用tab键自动生成剩余完整的目录名
以上就是整个过程,如果还有什么问题欢迎评论