一、系统架构
我们假设只有三台服务器,并且要在三台服务器上做高可用。
服务 | 服务器1 | 服务器2 | 服务器3 |
---|---|---|---|
NameNode | √ | Δ | |
DataNode | √ | √ | √ |
JournalNode | √ | √ | √ |
ResourceManager | √ | ||
NodeManager | √ | √ | √ |
Zookeeper | √ | √ | √ |
ZKFC | √ | √ | √ |
HMaster | √ | Δ | |
HRegionServer | √ | √ | √ |
二、环境配置
我们需要把系统要安装之前的东西配置一下。
2.1、主机命名
我们分别把三台服务器命名为hadoop1, hadoop2, hadoop3。并在hosts中加上ip到主机名的映射。
192.168.13.81 hadoop1
192.168.13.82 hadoop2
192.168.13.83 hadoop3
2.2、Java环境
我们的java环境如下
[root@hadoop1 user]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
2.3、免密登录
三台机子生成自己的私钥,并且发到自己和其余两台的服务器上
ssh-keygen -t rsa
ssh-copy-id ip
三、软件下载
我们按照如下方式选择版本
- Hadoop 选择2.8.5版本
- Zookeeper 选择了3.4.10版本
- HBase 选择了 2.2.0版本,Hbase官网可以查询你需要的版本
四、Hadoop配置
我们选择一个目录进行整个hadoop的安装,假设它是/home/user
4.1、hadoop-env.sh
export JAVA_HOME=/usr
4.2、core-site.xml
这个ns可以理解我们定义的一个变量,你也可以叫其他的
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/user/dir_hadoop2</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>io.file.buffer.size</name>
<value>16384</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
</configuration>
4.3、hdfs-site.xml
<configuration>
<!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!-- ns下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1, nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop1:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop1:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop2:9000</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop2:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/ns</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/user/journal_hadoop2</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行,脑裂时通过ssh登录杀掉old-active,并将standby切换为active -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!--设置副本数为2 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
4.4、mapred-site.xml
需要注意的是 如果内存太小了,MP任务可能会一直报错
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!--map任务内存大小,默认1G-->
<property>
<name>mapreduce.map.memory.mb</name>
<value>1024</value>
</property>
<!--reduce任务内存大小,默认1G-->
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>1024</value>
</property>
<!--MR AppMaster运行需要内存,默认1536M-->
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>460</value>
</property>
<!--MR AppMaster运行的JVM进程内存,默认-Xmx1024m-->
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx368m</value>
</property>
</configuration>
4.5、 yarn-site.xml
需要注意的是 如果内存太小了,MP任务可能会一直报错
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop3</value>
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!--RM中分配容器的内存最小值,默认1G-->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!--RM中分配容器的内存最大值,默认8G-->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>2048</value>
</property>
<!--可用物理内存大小,默认8G-->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>2048</value>
</property>
<!--虚拟内存检查是否开始-->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
4.6、slaves
配置的地方在etc/hadoop/slaves
hadoop1
hadoop2
hadoop3
4.7、zookeeper
首先重命名zoo_sample.cfg文件为zoo.cfg,然后对它进行修改,修改后的样子大约是这样的
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/home/user/zoodata
dataLogDir=/home/user/zoodatalog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
#quorumListenOnAllIPs=true
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
但是如果使用的是公网IP的时候,注意把本机配置为0.0.0.0。假设我们现在在hadoop1节点上,且使用的是公网IP,则应该如下配置
#末尾添加
server.1=0.0.0.0:2888:3888
server.2=165.227.133.86:2888:3888
server.3=159.65.120.185:2888:3888
然后我们手动创建zoodata和zoodatalog文件夹,并在每台zoo服务器的文件夹里面创建一个文件,以此输入1、2、3。
这个1,2,3对应的是上面server.1=hadoop1:2888:3888
中的1、2、3
你可以vim创建,或者使用echo 1 > myid
五、HBase配置
HBase的软件是一个单独的文件夹
5.1、hbase-env.sh
第二个配置是并行GC的配置,数字根据你的线程数设置
export JAVA_HOME=/usr
export HBASE_OPTS="$HBASE_OPTS -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=20"
export HBASE_MANAGES_ZK=true
5.2、 hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs:///ns/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/user/zoodata</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master</name>
<value>hdfs://hadoop1:60000</value>
</property>
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop1,hadoop2,hadoop3</value>
</property>
</configuration>
完成配置后,记得把core-site.xml
和hdfs -site.xml
的软链接链到这个目录下面,否则无法识别ns。
5.3、conf/regionservers
hadoop1
hadoop2
hadoop3
六、复制
把除了myid以外其它东西复制到另外两台服务器。可以直接使用scp复制
七、服务启动
7.1、Zookeeper
在三台服务器
zkServer.sh start
启动之后检查启动是否正常
[root@hadoop1 user]# zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/user/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
如果不正常,检查一下防火墙有没有问题。防火墙一定要关闭。
7.2、HDFS
- 在hadoop1执行
hadoop-daemons.sh start journalnode
- 在hadoop1上格式化HDFS
hdfs namenode -format
。格式化后会在根据core-site.xml中的hadoop.tmp.dir
配置生成个文件,在这里是存在 /home/user/dir_hadoop2 的目录下。然后将这个文件用scp拷贝到你备用namenode服务器的/home/user/dir_hadoop2 目录下。 - 在hadoop1上格式化ZK
hdfs zkfc -formatZK
- 在hadoop1上
hdfs zkfc -formatZK
- 在hadoop1上启动HDFS
start-dfs.sh
。 - 在hadoop3上启动Yarn
start-yarn.sh
。 - 在hadoop1上启动HBase
hbase-2.2.0/bin/start-hbase.sh
八、验证服务
[root@hadoop1 user]# jps
2464 NodeManager
16417 HQuorumPeer
20065 Jps
32066 NameNode
32180 DataNode
18470 HMaster
18589 HRegionServer
32383 JournalNode
运行一下hadoop提供的demo中的WordCount程序:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount input out