虽然之前已经搭建过一次了,不过本次依然遇到了不少问题。主要还是环境。所以此处在次记录一回吧。
机器规划
主机名 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 "
乐享:知识积累,快乐无限。