虽然之前已经搭建过一次了,不过本次依然遇到了不少问题。主要还是环境。所以此处在次记录一回吧。


机器规划


主机名         IP              安装的软件              运行的进程

hadoop01  192.168.8.143         jdk、hadoop              NameNode、DFSZKFailoverController(zkfc)

hadoop02  192.168.8.144         jdk、hadoop        ResourceManager 

hadoop03  192.168.8.145         jdk、hadoop、mysql、sqoop       ResourceManager、NameNode、DFSZKFailoverController(zkfc)

hadoop04  192.168.8.146         jdk、hadoop、zookeeper   DataNode、NodeManager、JournalNode、QuorumPeerMain

hadoop05  192.168.8.147         jdk、hadoop、zookeeper、hive    DataNode、NodeManager、JournalNode、QuorumPeerMain

hadoop06  192.168.8.148         jdk、hadoop、zookeeper   DataNode、NodeManager、JournalNode、QuorumPeerMain



1.安装虚拟机centos7并进行配置

1.1配置hostname

,三个都得改了

#>vi /etc/sysconfig/network

        添加或修改:

                NETWORKING=yes

                HOSTNAME=xxx

#>vi /etc/hosts(下面两个不用改了。入过坑了)

        修改 127.0.0.1这行中的 localhost.localdomain为 xxx

        修改 ::1这行中的localhost.localdomain 为xxx

#>vi /etc/hostname

1.2配置免密登录

1.2.1首先配置 hadoop01到hadoop02~6的免密登录

在hadoop01上产生一对公匙

ssh-keygen -t rsa

回车三次全默认

将公钥拷贝到其他节点,包括自己

ssh-copy-id hadoopxx这个要输入yes 然后在输入密码

 

ssh-copy-id hadoop01

ssh-copy-id hadoop02

ssh-copy-id hadoop03

ssh-copy-id hadoop04

ssh-copy-id hadoop05

ssh-copy-id hadoop06

1.2.2 配置hadoops02到hadoops4~6的免密登录

ssh-keygen -t rsa

回车三次全默认

将公钥拷贝到其他节点,

ssh-copy-id hadoop04

ssh-copy-id hadoop05

ssh-copy-id hadoop06

ssh-copy-id hadoop03 配置hadoop02到hadoop03的免密登录(rm之间,貌似不用)

1.2.3 配置hadoops03到hadoops4~6的免密登录

ssh-keygen -t rsa

回车三次全默认

将公钥拷贝到其他节点,

ssh-copy-id hadoop04

ssh-copy-id hadoop05

ssh-copy-id hadoop06

ssh-copy-id hadoop02 配置hadoop03到hadoop02的免密登录(rm之间,貌似不用)

ssh-copy-id hadoop01 配置hadoop03到hadoop01的免密登录(namenode之间)


2.JDK安装

卸载原有jdk

rpm -qa | grep java 查看下

 

java-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64

python-javapackages-3.4.1-5.el7.noarch

tzdata-java-2014b-1.el7.noarch

javapackages-tools-3.4.1-5.el7.noarch

java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64

 

卸载命令

rpm -e --nodeps java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64

rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64

这两个就可以了,其他的不用了。

3.hadoop安装配置

首先在hadoop01上面安装配置hadoop 我放在了 /home/soft下面

3.1解压

tar  -zxvf hadoop-2.7.6.tar.gz


3.2配置HDFS

将hadoop添加到环境变量中

vim /etc/profile

export HADOOP_HOME= /home/soft/hadoop-2.7.6

export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

最后在source /etc/profile 自己记得就好,还有其它机器一样

3.2.1修改hadoo-env.sh

        export JAVA_HOME=/usr/java/jdk1.7.0_55

3.2.2修改core-site.xml

<configuration>

<!-- 指定hdfs的nameservice为ns1 -->

<property>

  <name>fs.defaultFS</name>

  <value>hdfs://ns1</value>

</property>

<!-- 指定hadoop临时目录 -->

<property>

  <name>hadoop.tmp.dir</name>

  <value>/home/hadoop-2.7.6/tmp</value>

</property>

<!-- 指定zookeeper地址 -->

<property>

  <name>ha.zookeeper.quorum</name>

  <value>hadoop04:2181,hadoop05:2181,hadoop06:2181</value>

</property>

</configuration>                      

3.2.3修改hdfs-site.xml

<configuration>

<property>

  <name>dfs.nameservices</name>

  <value>ns1</value>

</property>

<property>

  <name>dfs.ha.namenodes.ns1</name>

  <value>nn1,nn2</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.ns1.nn1</name>

  <value>hadoop01:9000</value>

</property>

<property>

  <name>dfs.namenode.http-address.ns1.nn1</name>

  <value>hadoop01:50070</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.ns1.nn2</name>

  <value>hadoop03:9000</value>

</property>

<property>

  <name>dfs.namenode.http-address.ns1.nn2</name>

  <value>hadoop03:50070</value>

</property>

<property>

  <name>dfs.namenode.shared.edits.dir</name>

  <value>qjournal://hadoop04:8485;hadoop05:8485;hadoop06:8485/ns1</value>

</property>

<property>

  <name>dfs.journalnode.edits.dir</name>

  <value>/home/hadoop-2.7.6/journal</value>

</property>

<property>

  <name>dfs.ha.automatic-failover.enabled</name>

  <value>true</value>

</property>

<property>

  <name>dfs.client.failover.proxy.provider.ns1</name>

  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<property>

  <name>dfs.ha.fencing.methods</name>

  <value>

sshfence

shell(/bin/true)

  </value>

</property>

<property>

  <name>dfs.ha.fencing.ssh.private-key-files</name>

  <value>/home/hadoop-2.7.6/.ssh/id_rsa</value>

</property>

<property>

  <name>dfs.ha.fencing.ssh.connect-timeout</name>

  <value>30000</value>

</property>

</configuration>                

3.2.4修改mapred-site.xml

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>      

  

3.2.5修改yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->

<property>

  <name>yarn.resourcemanager.ha.enabled</name>

  <value>true</value>

</property>

<property>

  <name>yarn.resourcemanager.cluster-id</name>

  <value>yrc</value>

</property>

<property>

  <name>yarn.resourcemanager.ha.rm-ids</name>

  <value>rm1,rm2</value>

</property>

<property>

  <name>yarn.resourcemanager.hostname.rm1</name>

  <value>hadoop02</value>

</property>

<property>

  <name>yarn.resourcemanager.hostname.rm2</name>

  <value>hadoop03</value>

</property>

<property>

  <name>yarn.resourcemanager.zk-address</name>

  <value>hadoop04:2181,hadoop05:2181,hadoop06:2181</value>

</property>

<property>

  <name>yarn.nodemanager.aux-services</name>

  <value>mapreduce_shuffle</value>

</property>

</configuration>                 


3.2.6修改slaves

slaves是指定子节点的位置,因为要在hadoop01上启动HDFS、在hadoop02与hadoop03启动yarn,

所以hadoop01与hadoop03上的slaves文件指定的是datanode的位置,

hadoop02与hadoop03上的slaves文件指定的是nodemanager的位置

        (幸好,datanode与nodemanager放在了一起,不然真不知道这个slaves怎么配了)

hadoop04

hadoop05

hadoop06

        

         配置完成进行拷贝吧

4.zookeeper安装配置

我放在了/home/soft下面

在hadoop04上面先安装派之zookeeper

1.解压  tar -zxvf zookeeper-3.4.12.tar.gz

    2.修改配置

cd  /home/soft/zookeeper-3.4.12/conf/

cp zoo_sample.cfg zoo.cfg

vim zoo.cfg

修改:dataDir=/home/soft/zookeeper-3.4.12/tmp

在最后添加:

server.1=hadoop04:2888:3888

server.2=hadoop05:2888:3888

server.3=hadoop06:2888:3888

保存退出


        tickTime=2000

initLimit=10

syncLimit=5

dataDir=/home/soft/zookeeper-3.4.12/data

dataLogDir=/home/soft/zookeeper-3.4.12/log

quorumListenOnAllIPs=true

clientPort=2181

server.1=hadoop04:2888:3888

server.2=hadoop05:2888:3888

server.3=hadoop06:2888:3888

然后在zookeeper下创建一个data文件夹

mkdir /home/soft/zookeeper-3.4.12/data

然后在zookeeper下创建一个log文件夹

mkdir /home/soft/zookeeper-3.4.12/log



再创建一个空文件

touch /home/soft/zookeeper-3.4.12/tmp/myid

最后向该文件写入ID

echo 1  >  /home/soft/zookeeper-3.4.12/tmp/myid

3.将配置好的zookeeper拷贝到5跟6上面(记得创建文件夹)

scp -r /home/soft/zookeeper-3.4.12/ hadoop05:/home/soft/

scp -r /home/soft/zookeeper-3.4.12/ hadoop06:/home/soft/

4.修改hadoop05跟hadoop06的/home/soft/zookeeper-3.4.12/tmp/myid

echo 2 > /home/soft/zookeeper-3.4.12/tmp/myid

echo 3 > /home/soft/zookeeper-3.4.12/tmp/myid

5.启动集群

5.1启动zookeeper集群

切换到zookeeper的bin下  ./zkServer.sh start

查看 ./zkServer.sh status

5.2启动hadoop相关进程

1.启动journalnode(分别在在hadoop04、hadoop05、hadoop06上执行)

切换到hadoop的目录下

./sbin/hadoop-daemon.sh start journalnode

#运行jps命令检验,hadoop04、hadoop05、hadoop06上多了JournalNode进程

然后就遇到问题了,配置文件中的中文注释乱码了,造成启动错误,只能全删了

2.格式化HDFS(在hadoops1上执行即可)

hdfs namenode -format#格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/home/hadoop-2.7.6/tmp,然后将/home/hadoop-2.7.6/tmp拷贝到hadoop03的/home/hadoop-2.7.6/下。

scp -r /home/soft/hadoop-2.7.6/tmp/ root@hadoop03:/home/soft/hadoop-2.7.6/

3.格式化ZK(在hadoop01上即可)

hdfs zkfc –formatZK

4.启动HDFS(在hadoops1上即可)

sbin/start-dfs.sh

5.启动YARN

(#####注意#####:是在hadoop02上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)

        sbin/start-yarn.sh

在hadoop03上启动resourceManager

./sbin/yarn-daemon.sh start resourcemanager

重点:问题
一,zookeeper启动集群启动失败(不光这一个现象,还有就是rm连不上zookeeper等等,这个改完会解决一大部分)

    表象就是怎么弄zookeeper都联通不了,查过很多,host啥的也都改了,就是不行。最后发现是虚拟机网卡配置问题,上一次配置没出过这个问题,

no route to host

心中一万个MMP。该网卡配置,/etc/sysconfig/network-scripts/ifcfg-ens33

设置固定ip。

BOOTPROTO="static"
DNS1="114.114.114.114"
IPADDR=192.168.8.146
GATEWAY=192.168.8.2
NETMASK=255.255.255.0


没有就添加,这个玩意路由

GATEWAY=192.168.8.2

记得看看你宿主机vm的虚拟网卡有没有正常配置,否则有可能在你主机上不能访问。


二、zookeeper启动集群启动还是有问题,访问不到。这个玩意不知道是不是因为上面的原因,但是bind的ip地址是127.0.0.1,对之前修改的hosts文件修改撤销一部分,localhost.localdomain为 xxx这个玩意恢复到之前的样子。


三、防火墙配置,这个也挺恶心的

反正我是以下几个命令都执行了就好了。

systemctl stop firewalld.service(关闭centos7的原来的防火墙)

systemctl disable firewalld.service(禁用原来的防火墙)
systemctl restart iptables.service(启用iptables)

systemctl enable iptables.service(设置iptables开机启动)

service iptables stop(停止iptables)


自己为了方便弄的几个脚本,都在hadoop01上执行。

几个shell脚本,挺垃圾的仅供参考

注意:1.最好全都用source ./xxx.sh 执行脚本要不然脚本里的source 命令不管用

    2.copy的时候可能也不好用,有些命令还是要手敲一遍,win跟linux编码的问题。

    3.如果你用nodepad++ 那在顶部菜单编辑-》档案格式转换-》转为unix格式

    这样才好用,不然会报错,也是win跟linux的编码问题。

sh.1   cp_jdk.sh(装jdk用的,省的自己一个一个装了)

list="hadoop02 hadoop03 hadoop04 hadoop05 hadoop06"
for i in $list;do
scp /home/soft/jdk-7u45-linux-x64.tar.gz root@$i:/home/soft/
echo "$i jdk copy done !"
ssh root@$i > /dev/null 2>&1 << eeooff
rpm -e --nodeps java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64
rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64
cd /home/soft
tar -xzvf jdk-7u45-linux-x64.tar.gz
head -n -2 /etc/profile > tmp_profile
mv tmp_profile /etc/profile
rm -r tmp_profile
echo "export JAVA_HOME=/home/soft/jdk1.7.0_45" >>/etc/profile
echo -e 'export CLASSPATH=.:\$JAVA_HOME/jre/lib/rt.jar:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar'>>/etc/profile
echo -e 'export PATH=\$PATH:\$JAVA_HOME/bin'>>/etc/profile
echo -e 'unset i'>>/etc/profile
echo -e 'unset -f pathmunge'>>/etc/profile
source /etc/profile
eeooff
#ssh root@$i "source /etc/profile"
echo "$i"+"jdk env done !"
done

sh.2 cp_hadoop.sh (拷贝hadoop用的,hadoop的HADOOP_HOME环境变量配置自己解决吧,这个脚本方便弄错了之后省的在去删初始化的namenode。直接重新copy一遍,啥记录都没了)

list="hadoop01 hadoop02 hadoop03 hadoop04 hadoop05 hadoop06"
for i in $list;do
ssh root@$i > /dev/null 2>&1 << eeooff
rm -rf /home/hadoop-2.7.6/
source /etc/profile
eeooff
#ssh root@$i "source /etc/profile"
echo "$i hadoop env done !"
scp -r /home/soft/hadoop-2.7.6/ root@$i:/home/
echo "$i hadoop copy done !"
done

sh.3 cp_zookeeper.sh(安装拷贝zookeeper的)

list="hadoop04 hadoop05 hadoop06"
for i in $list;do
ssh root@$i > /dev/null 2>&1 << eeooff
rm -rf /home/soft/zookeeper-3.4.12
eeooff
scp -r /home/soft/zookeeper-3.4.12/ root@$i:/home/soft
echo "$i zookeeper copy done !"
done
ssh root@hadoop04 > /dev/null 2>&1 << eeooff
echo  "1" >> /home/soft/zookeeper-3.4.12/data/myid
eeooff
echo "04 zookeeper env done !"
ssh root@hadoop05 > /dev/null 2>&1 << eeooff
echo  "2" >>  /home/soft/zookeeper-3.4.12/data/myid
eeooff
echo "05 zookeeper env done !"
ssh root@hadoop06 > /dev/null 2>&1 << eeooff
echo  "3" >>  /home/soft/zookeeper-3.4.12/data/myid
eeooff
echo "06 zookeeper env done !"
#dataLogDir=/home/soft/zookeeper-3.4.12/log

sh.4 config_start_ha_zoo.sh(初始化并且启动hadoop跟zookeeper,就是第一次用)

ssh root@hadoop04 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh start
eeooff
ssh root@hadoop05 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh start
eeooff
ssh root@hadoop06 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh start
eeooff
echo "zkServer.sh start end" >> /home/log/config_ha_zoo.log
ssh root@hadoop04 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode
eeooff
ssh root@hadoop05 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode
eeooff
ssh root@hadoop06 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode
eeooff
echo "start journalnode end" >> /home/log/config_ha_zoo.log
/home/hadoop-2.7.6/bin/hdfs  namenode -format
echo "namenode -format end" >> /home/log/config_ha_zoo.log
scp -r /home/hadoop-2.7.6/tmp/ root@hadoop03:/home/hadoop-2.7.6/
echo "namenode2 tmp copy end" >> /home/log/config_ha_zoo.log
/home/hadoop-2.7.6/bin/hdfs zkfc -formatZK
echo "hdfs  zkfc –formatZK end" >> /home/log/config_ha_zoo.log
/home/hadoop-2.7.6/sbin/start-dfs.sh
echo "hdfs  start end" >> /home/log/config_ha_zoo.log
ssh root@hadoop02 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/start-yarn.sh
eeooff
echo "yarn start end" >> /home/log/config_ha_zoo.log
ssh root@hadoop03 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/yarn-daemon.sh start resourcemanager
eeooff
echo "rm2 start end" >> /home/log/config_ha_zoo.log

sh.5 start_ha_zoo.sh(纯用来启动整个集群环境的。毕竟是虚拟机会关机)


list="hadoop01 hadoop02 hadoop03 hadoop04 hadoop05 hadoop06"
for i in $list;do
ssh root@$i > /dev/null 2>&1 << eeooff
service iptables stop
eeooff
done
echo "iptables stop "
ssh root@hadoop04 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh start
eeooff
ssh root@hadoop05 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh start
eeooff
ssh root@hadoop06 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh start
eeooff
echo "zookeeper start"
#ssh root@hadoop04 > /dev/null 2>&1 << eeooff
#source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode
#eeooff
#ssh root@hadoop05 > /dev/null 2>&1 << eeooff
#source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode
#eeooff
#ssh root@hadoop06 > /dev/null 2>&1 << eeooff
#source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh start journalnode
#eeooff
#echo "journalnode start"
/home/hadoop-2.7.6/sbin/start-dfs.sh
echo "dfs start"
ssh root@hadoop02 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/start-yarn.sh
eeooff
echo "yarn start"
ssh root@hadoop03 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/yarn-daemon.sh start resourcemanager
eeooff
echo "hadoop03 rm start"

sh.6 stop_ha_zoo.sh(关停整个环境的,有时候需要只启动某几个程序看看问题。得先关掉整个环境)



ssh root@hadoop03 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/yarn-daemon.sh stop resourcemanager
eeooff
ssh root@hadoop02 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/stop-yarn.sh
eeooff
echo "stop-yarn end "
/home/hadoop-2.7.6/sbin/stop-dfs.sh
echo "stop-dfs end "
ssh root@hadoop04 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh stop journalnode
eeooff
echo "hadoop04 stop journalnode end "
ssh root@hadoop05 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh stop journalnode
eeooff
echo "hadoop05 stop journalnode end "
ssh root@hadoop06 > /dev/null 2>&1 << eeooff
source /home/hadoop-2.7.6/sbin/hadoop-daemon.sh stop journalnode
eeooff
echo "hadoop06 stop journalnode end "
ssh root@hadoop04 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh stop
eeooff
echo "hadoop04 stop zkServer end "
ssh root@hadoop05 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh stop
eeooff
echo "hadoop05 stop zkServer end "
ssh root@hadoop06 > /dev/null 2>&1 << eeooff
source /home/soft/zookeeper-3.4.12/bin/zkServer.sh stop
eeooff
echo "hadoop06 stop zkServer end "




乐享:知识积累,快乐无限。