(需要注意的是本博主因为配置的问题,以下所有的master切换成root模式下)
官网的参考地址
一、前期准备工作
1、虚拟机的安装和red hat linux的安装(rhel-server-7.0-x86_64-dvd.iso),读者可自行安装。设置一个管理的账号(master),密码(hadoop)
hadoop的版本是(2.6.5)
配置的节点
2、静态ip的设置

[master@node1 ~]$ [master@node1 ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eno16777736 

注意:ifcfg-eno16777736可能不一样,下面为修改的地方

HWADDR=00:0C:29:70:0B:67
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=256a7907-3258-423e-baeb-7192109726e8
ONBOOT=yes
IPADDR=192.168.146.51
NETMASK=255.255.255.0
GATEWAY=192.168.146.2
DNS1=1.2.4.8

3、关于yum的问题一直没有解决
4、使用winscp工具将hadoop、jdk、Scala等工具包放进虚拟机中
5、配置jdk和hadoop见参考链接

[master@node2 jdk1.8.0_60]$ sudo ln -sf /home/master/soft/jdk1.8.0_60 /opt/jdk1.8
[master@node2 hadoop-2.6.5]$ sudo ln -sf /home/master/soft/hadoop-2.6.5 /opt/hadoop-2.6.5
export JAVA_HOME=/opt/jdk1.8
export HADOOP_HOME=/opt/hadoop-2.6.5
export PATH=$PATH:$JAVA_HOME/bin:$PATH:HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

此处注意:如果在集群上有两个hadoop,则不应该配置环境
6、关闭防火墙

[master@node1 soft]$ sudo systemctl stop firewalld
[master@node1 soft]$ sudo systemctl disable firewalld
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'

此处添加两个常用的命令

  • 修改文件所有者:
    chown -R master:master hadoop
    master:为文件的所有者,hadoo为修改的文件
netstat -ap|grep 8080

二、hadoop文件的配置
1、修改hdfs.xml文件

<property>
  <name>dfs.nameservices</name>
  <value>shursulei</value>
</property>
<property>
  <name>dfs.ha.namenodes.shursulei</name>
  <value>nn1,nn2</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.shursulei.nn1</name>
  <value>node1:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.shursulei.nn2</name>
  <value>node2:8020</value>
</property>
<property>
  <name>dfs.namenode.http-address.shursulei.nn1</name>
  <value>node1:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.shursulei.nn2</name>
  <value>node2:50070</value>
</property>
<property>
  <name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node2:8485;node3:8485;node4:8485/shursulei</value>
</property>
</configuration>
<property>
  <name>dfs.client.failover.proxy.provider.shursulei</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>/root/.ssh/id_rsa</value>
</property>
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/opt/jn/data</value>
</property>
 <property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

2、配置core-site.xml文件

  • namenode的入口
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://shursulei</value>
</property>
 <property>
   <name>ha.zookeeper.quorum</name>
   <value>node1:2181,node2:2181,node3:2181</value>
 </property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/hadoop-2.6.5temp</value>
</property>

3、配置hadoop-env.sh文件

  添加如下的环境变量
export JAVA_HOME=/opt/jdk1.8

4、配置slaves文件

node2
node3
node4

把hadoop的配置文件复制到其他机器上去

/home/master/soft/hadoop-2.6.5/etc/hadoop
[master@node1 hadoop]$ sudo scp ./* master@node4:/home/master/soft/hadoop-2.6.5/etc/hadoop


三、zookeeper的安装和配置(补充上面的配置)
(只需要在node1和node2和node3上 配置)

  • 使用的版本是3.4.10(必须是稳定版本)
  • 解压和设置软链
[master@node1 soft]$ tar -zxvf zookeeper-3.4.10.tar.gz 
[master@node1 zookeeper-3.4.10]$ sudo ln -sf /home/master/soft/zookeeper-3.4.10 /home/zk
  • 配置文件
在/home/zk/conf的目录下修改文件zoo.cfg
[master@node1 conf]$ ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[master@node1 conf]$ cp zoo_sample.cfg zoo.cfg
[master@node1 conf]$ ls
configuration.xsl  log4j.properties  zoo.cfg  zoo_sample.cfg
[master@node1 conf]$ vi zoo.cfg 
修改的内容:dataDir=/opt/zookpeer
     server.1=node1:2888:3888
     server.2=node2:2888:3888
     server.3=node3:2888:3888

参考链接:zookpeer的配置

  • 配置集群
手动创建文件夹/opt/zookper和文件 myid
[root@node1 opt]# mkdir /opt/zookpeer
[root@node1 opt]# ls
hadoop-2.6.5  hadoop-2.6.5temp  jdk1.8  zookpeer
[root@node1 opt]# vi myid
[root@node1 opt]# cat myid
1
myid的文件内容为:1(每台内容不一样:node1写1;node2写2;node3写3..)
myid需要放在/opt/zookpeer对应的目录下
  • 将zookpeer的文件拷贝到其他的机器中(只需配置node1、node2、node3)
[root@node1 soft]$ sudo scp -r zookeeper-3.4.10 root@node2:/home/master/soft
同时在其他的环境中配置软链
sudo ln -sf /home/master/soft/zookeeper-3.4.10 /home/zk
上面的myid也需要配置
  • 配置环境变量
[root@node1 soft]$ cd /home/zk/bin
[root@node1 bin]$ pwd
/home/zk/bin
*此处把hadoop的配置同时去掉*
export JAVA_HOME=/opt/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:/home/zk/bin
注意:环境变量有问题没有配置成功
[master@node2 bin]$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/master/soft/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... ./zkServer.sh: line 149: /opt/zookper/zookeeper_serv
FAILED TO WRITE PID

此处启动不了的原因是权限问题
[root@node2 ~]# cd /home/master/soft/
[root@node2 soft]# ls
hadoop-2.6.5         jdk1.8.0_60                zookeeper-3.4.10
hadoop-2.6.5.tar.gz  jdk-8u60-linux-x64.tar.gz
[root@node2 soft]# chmod a+wxr zookeeper-3.4.10/
[master@node3 bin]$ ./zkServer.sh start
必须在root的模式下
[参考链接](http://blog.csdn.net/wangyang1354/article/details/50733805)

四、开始走起
1、 在node2和node3、node4上启动如下命令

[root@node2 sbin]# ./hadoop-daemon.sh start journalnode

2、在任意一台机器上执行格式化命令

[root@node1 bin]# ./hdfs namenode -format

这里写图片描述
查看日志文件:

[root@node1 logs]# tail -n50 hadoop-master-journalnode-node1.log

3、查看元数据文件(初始化)

/opt/hadoop-2.6.5temp/dfs/name/current

[root@node1 current]# ls
fsimage_0000000000000000000  fsimage_0000000000000000000.md5  seen_txid  VERSION

4、启动namenode(在node1上启动)

[root@node1 sbin]# ./hadoop-daemon.sh start namenode

查看是否启动成功

[root@node1 logs]# tail n50 hadoop-master-namenode-node1.log 
tail: cannot open ‘n50’ for reading: No such file or directory
==> hadoop-master-namenode-node1.log <==
2017-05-01 09:28:25,163 INFO org.apache.hadoop.hdfs.StateChange: STATE* Network topology has 0 racks and 0 datanodes
2017-05-01 09:28:25,164 INFO org.apache.hadoop.hdfs.StateChange: STATE* UnderReplicatedBlocks has 0 blocks
2017-05-01 09:28:25,538 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: NameNode RPC up at: node1/192.168.146.51:8020
2017-05-01 09:28:25,539 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Starting services required for standby state
2017-05-01 09:28:25,504 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting
2017-05-01 09:28:25,511 INFO org.apache.hadoop.ipc.Server: IPC Server listener on 8020: starting
2017-05-01 09:28:25,589 INFO org.apache.hadoop.hdfs.server.namenode.ha.EditLogTailer: Will roll logs on active node at node2/192.168.146.52:8020 every 120 seconds.
2017-05-01 09:28:25,653 INFO org.apache.hadoop.hdfs.server.namenode.ha.StandbyCheckpointer: Starting standby checkpoint thread...
Checkpointing active NN at http://node2:50070
Serving checkpoints at http://node1:50070

5、在没有格式化的namenode上面进行(node2)
将node1上的元数据拷贝到node2上面

[root@node2 bin]# ./hdfs namenode -bootstrapStandby

解释的内容
把刚刚格式化之后的元数据拷贝到另一个namenode上
a、启动刚刚格式化的namenode
b、在没有格式化的namenode上执行:hdfs namenode -bootstrapStandby
c、启动第二个namenode
d、格式化zkfc
这里写图片描述
6、首先停止所有的服务

[root@node1 sbin]# ./stop-dfs.sh
 一次性全部启动
[root@node1 sbin]$ ./start-dfs.sh

此处jps下没有ZKFC
这里写图片描述
解决办法:

[root@node1 bin]$ ./hdfs zkfc -formatZK
[root@node1 sbin]$ ./start-dfs.sh

这里写图片描述

此处对ZKFC的 重新的声明

总结:

启动zookeeper:[root@node1 sbin]# zkServer.sh start
启动namenode:[root@node1 sbin]# ./hadoop-daemon.sh start namenode
启动Journalode:[root@node2 sbin]# ./hadoop-daemon.sh start journalnode
启动[root@node1 sbin]$ ./start-dfs.sh
要学会看logs解决问题

Hadoop集群异常:两个NameNode全部为StandBy状态
日志显示的错误:

Operation category JOURNAL is not supported in state standby

解决方法(未解决):

http://hadoop.apache.org/docs/r2.6.5/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
http://f.dataguru.cn/thread-586724-1-1.html
http://blog.sina.com.cn/s/blog_a07df5fd0102w4f8.html
http://www.tuicool.com/articles/ZbQJZv
http://blog.csdn.net/s646575997/article/details/51176371
http://www.open-open.com/lib/view/open1436855630959.html
http://www.tuicool.com/articles/ZbQJZv

上面已经解决,问题原因是namenode格式化的问题,需要把一台机器上格式化的内容拷贝到另一台上面去,统一格式化的内容,及统一格式化的id和block
五、测试
1、上传文件

在/opt/hadoop-2.6.5/bin文件下
创建文件夹:[root@node1 bin]# ./hdfs dfs -mkdir -p /usr/file
上传:[root@node1 bin]# ./hdfs dfs -put /home/master/soft /usr/file

六、后期的启动顺序是
先启动zookpeer
后启动hadoop,start-dfs.sh

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐