对于Hadoop的背景介绍,这里就不叙述了,本篇只介绍生产环境中Hadoop集群的搭建。本集群采用HA模式,一共4台服务器,一个名字节点,一个第二名字节点,两个数据节点。4台服务器都处于同一个内网中,使之能够互相通信。
环境:
1. jdk1.8.0_171
2.zookeeper-3.4.6
3.hadoop-2.6.3
一、集群SSH免密登陆设置
请参照:https://www.cnblogs.com/ivan0626/p/4144277.html
二、安装JDK(每个节点都要安装)
2.1 下载jdk
https://www.oracle.com/technetwork/java/javase/downloads/index.html
选择对应jdk版本下载。
2.2 登录Linux,切换到root用户
su root 获取root用户权限,当前工作目录不变(需要root密码)
或者
sudo -i 不需要root密码,直接切换成root(需要当前用户密码)
2.3 建立java安装目录
一般我们将安装目录建在usr目录下:
cd /usr
mkdir java
2.4 安装java
将下载下来的.tar.gz压缩包拷贝到该java目录中,并解压到当前目录:
cp 压缩包路径 /usr/java/
tar -zxvf 压缩包名
2.5 配置环境变量
打开配置文件:vim /etc/profile
添加如下内容:(JAVA_HOME根据实际目录来)
JAVA_HOME=/usr/java/jdk1.8.0_171
CLASSPATH=PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
2.6 使配置文件生效
命令: source /etc/profile
2.7 查看安装情况
命令:java -version
安装成功则会打印如下信息:
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
三、安装Zookeeper(任意3个节点上安装)
Zookeeper是一个分布式的应用程序协调服务,是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。
ZooKeeper是用Java编写的,运行在Java环境上,因此,在部署zk的机器上需要安装Java运行环境。为了正常运行zk,我们需要JRE1.6或者以上的版本。
在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。如果只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能构成一个quorum的大多数。因此,部署2个进程甚至比单机模式更不可靠,因为2个进程其中一个不可用的可能性比一个进程不可用的可能性还大。
3.1 下载zookeeper
https://zookeeper.apache.org/releases.html
选择对应的版本下载。
3.2 安装zookeeper
在安装之前,我们先统一建立一个目录,后面与Hadoop有关的框架我们都安装在这个目录中,方便以后管理。目录名字随便起,这里我们叫probd。
将下载的zookeeper压缩包解压到probd/zookeeper-3.4.6目录中。
cp 压缩包路径 /probd/zookeeper-3.4.6/
tar -zxvf 压缩包名
3.3 配置zookeeper
解压后的zookeeper包中,有一个conf目录,进入这个目录中有一个zoo_sample.cfg文件,这是官方提供的样例配置,我们需要
重新建立一个名叫zoo.cfg的文件(名字是固定的),然后照着zoo_sample.cfg中的内容修改一些配置即可。
#这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳,以毫秒为单位。
tickTime=2000
#LF初始通信时限,集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)
initLimit=10
#集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
syncLimit=5
#顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
dataDir=/probd/zookeeper-3.4.6/data/data
#日志文件目录,Zookeeper保存日志文件的目录
dataLogDir=/probd/zookeeper-3.4.6/data/logs
#这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
clientPort=2181
#这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自己清理功能。
autopurge.purgeInterval=1
#这个参数和上面的autopurge.purgeInterval参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。
autopurge.snapRetainCount=3
#服务器编号=服务器地址 : LF通信端口 : 选举端口
#如:server.N=yyy:A:B
#其中N表示服务器编号,YYY表示服务器的IP地址,A为LF通信端口,表示该服务器与集群中的leader交换的信息的端口。
#B为选举端口,表示选举新leader时服务器间相互通信的端口(当leader挂掉时,其余服务器会相互通信,选择出新的leader)。
#一般来说,集群中每个服务器的A端口都是一样,每个服务器的B端口也是一样。但是当所采用的为伪集群时,IP地址都一样,只能时A端口和B端口不一样。
server.201=probd01:2888:3888
server.202=probd02:2888:3888
server.203=probd03:2888:3888
一般我们只需要修改dataDir、dataLogDir、clientPort和服务器编号及端口这几个即可。(注意别忘了在其它节点上配置该文件,可以用scp命令拷贝到其它节点上去)
然后手动创建上面的dataDir路径和dataLogDir路径,并在dataDir路径下创建一个名叫myid的文件,编辑文件,指明自己的id,对应上面zoo.cfg中"server."后的数字,这里我们在myid文件中只写一个201就可以了,别忘了在其它另外两个节点上同样的步骤分别写入202、203。
OK,关于zookeeper的工作就暂时就做到这些,等把Hadoop安装配置完成后,我们再来启动zookeeper。
四、安装Hadoop(每个节点都要安装)
4.1 下载hadoop
https://hadoop.apache.org/releases.html
选择对于的版本下载。
4.2 安装hadoop
上面我们在安装zookeeper的时候,统一创建了一个目录叫probd,现在我们在里面创建一个名叫hadoop-2.6.3的子目录,然后将下载的hadoop压缩包解压到/probd/hadoop-2.6.3目录中。
cp 压缩包路径 /probd/hadoop-2.6.3
tar -zxvf 压缩包名
4.3 配置hadoop
进入目录: /probd/hadoop-2.6.3/etc/hadoop
(1)修改hadoop-env.sh、mapred-env.sh、yarn-env.sh文件中的jdk的路径,如下:
export JAVA_HOME=/usr/java/jdk1.8.0_171
(2)修改core-site.xml,配置内容如下:
<configuration>
<!-- About cluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://probd</value>
<description>默认文件系统的名称,URI形式。HA方式,这里设置服务名,例如:hdfs://mycluster1,HDFS的客户端访问HDFS需要此参数。</description>
</property>
<!-- About zookeeper -->
<property>
<name>ha.zookeeper.quorum</name>
<value>probd01:2181,probd02:2181,probd03:2181</value>
<description>Ha功能,需要一组zk地址,用逗号分隔。被ZKFailoverController使用于自动失效备援failover。</description>
</property>
<!-- About directory -->
<property>
<name>hadoop.tmp.dir</name>
<value>/probd/hadoop-2.6.3/data/tmp</value>
<description>Hadoop的临时目录,只可以设置一个值;建议设置到一个足够空间的地方,而不是默认的/tmp下服务端参数,修改需重启</description>
</property>
</configuration>
(3)修改hdfs-site.xml,修改配置如下:
<configuration>
<!-- About service -->
<property>
<name>dfs.nameservices</name>
<value>probd</value>
<description>nameservices列表,逗号分隔。我们常用的仅配置一个,启动federation功能需要配置多个</description>
</property>
<!-- About namenode -->
<property>
<name>dfs.ha.namenodes.probd</name>
<value>nn1,nn2</value>
<description>dfs.ha.namenodes.EXAMPLENAMESERVICE,包含一个NN列表。EXAMPLENAMESERVICE是指具体的nameservice名称,通常就是dfs.nameservices中配置的。值是预备配置的NN的ID。</description>
</property>
<property>
<name>dfs.namenode.rpc-address.probd.nn1</name>
<value>probd01:8020</value>
<description>NN的RPC地址和端口</description>
</property>
<property>
<name>dfs.namenode.http-address.probd.nn1</name>
<value>probd01:50070</value>
<description>NN的HTTP地址和端口。0表示任意空闲端口。</description>
</property>
<property>
<name>dfs.namenode.rpc-address.probd.nn2</name>
<value>probd02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.probd.nn2</name>
<value>probd02:50070</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///probd/hadoop-2.6.3/name</value>
<description>本地磁盘目录,NN存储fsimage文件的地方。可以是按逗号分隔的目录列表,fsimage文件会存储在全部目录,冗余安全。这里多个目录设定,最好在多个磁盘,另外,如果其中一个磁盘故障,不会导致系统故障,会跳过坏磁盘。由于使用了HA,建议仅设置一个。如果特别在意安全,可以设置2个</description>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://probd01:8485;probd02:8485;probd03:8485/probd</value>
<description>在多个NN中共享存储目录,用于存放edits文件。这个目录,由active写,由standby读,以保持命名空间数据一致。此目录不需要是dfs.namenode.edits.dir中列出的。在非HA集群中,它不会使用。建议使用qj方式,可以不关注这个选项</description>
</property>
<!-- About journal node -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/probd/hadoop-2.6.3/qjm</value>
<description>journalnode存放edits文件的目录</description>
</property>
<!-- About datanode -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///probd/hadoop-2.6.3/data/dfs/data</value>
<description>本地磁盘目录,HDFS数据存储Block的地方。可以是逗号分隔的目录列表(典型的,每个目录在不同的磁盘)。这些目录被轮流使用,一个块存储在这个目录,下一个块存储在下一个目录,依次循环。每个块在同一个机器上仅存储一份。不存在的目录被忽略。必须创建文件夹,否则被视为不存在。</description>
</property>
<property>
<name>dfs.datanode.handler.count</name>
<value>30</value>
<description>thread count for request</description>
</property>
<property>
<name>dfs.datanode.max.xcievers</name>
<value>4096</value>
</property>
<property>
<name>dfs.datanode.du.reserved</name>
<value>10737418240</value>
<description>10G</description>
</property>
<property>
<name>dfs.datanode.directoryscan.threads</name>
<value>3</value>
<description>
How many threads should the threadpool used to compile reports
for volumes in parallel have.
</description>
</property>
<!-- About sshfence -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>10</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- About client failover -->
<property>
<name>dfs.client.failover.proxy.provider.probd</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- About failover -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
<description>是否开启自动故障转移。建议开启,true</description>
</property>
<!-- About replication -->
<property>
<name>dfs.replication</name>
<value>3</value>
<description>数据块副本数。此值可以在创建文件是设定,客户端可以只有设定,也可以在命令行修改。不同文件可以有不同的副本数。默认值用于未指定时。</description>
</property>
</configuration>
(4)修改mapred-site.xml,由于在配置文件目录下没有该文件,需要修改名称:mv mapred-stie.xml.template mapred-site.xml,修改内容如下:
<!-- 通知框架MR使用YARN -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
(5)修改yarn-site.xml,修改内容如下:
<!-- resourcemanager -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
<description>是否启用HA模式</description>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-probd</value>
<description>集群名称。在HA下,用来确保RM参加集群中的leader选举而不影响其它集群。</description>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
<description>集群中RM的ID列表,用逗号分隔。<description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>probd01</value>
<description>为每个RM-id指定一个主机名。或者可以设置每个RM的服务地址</description>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>probd02</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>probd01:8130</value>
<description>调度器地址:端口</description>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>probd02:8130</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>probd01:8131</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>probd02:8131</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>probd01:8132</value>
<description>RM地址:端口</description>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>probd02:8132</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>probd01:8133</value>
<description>RM管理接口地址:端口</description>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>probd02:8133</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>probd01:8188</value>
<description>RM的网页接口地址:端口</description>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>probd02:8188</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm1</name>
<value>probd01:23142</value>
</property>
<property>
<name>yarn.resourcemanager.ha.admin.address.rm2</name>
<value>probd02:23142</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
<description>故障切换激活;在HA下默认是可用的。</description>
</property>
<!-- About zookeeper -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>probd01:2181,probd02:2181,probd03:2181</value>
<description>RM所使用的zookeeper服务器的主机端口 </description>
</property>
<property>
<name>yarn.resourcemanager.zk-state-store.address</name>
<value>probd01:2181,probd02:2181,probd03:2181</value>
</property>
<property>
<name>yarn.resourcemanager.nodes.exclude-path</name>
<value>/probd/probd-0.3.5/hadoop-2.6.3/etc/hadoop/nodes-exclude</value>
<description>存储拒绝节点列表的文件。如和包含文件冲突,包含文件优先级高</description>
</property>
<!-- About nodemanager -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle,spark_shuffle</value>
<description>请配置为:mapreduce.shuffle,在Yarn上开启MR的必须项 </description>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
<description>对应参考yarn.nodemanager.aux-services</description>
</property>
上面的配置文件中只要涉及到文件路径的,都需要手动创建,否则在启动的时候会报错。
(6)配置slaves文件,如下:
probd01
probd02
probd03
probd04
(7)将Hadoop添加到环境变量,然后更新:source /etc/profile
export HADOOP_HOME=/probd/hadoop-2.6.3
export PATH=$PATH:$HADOOP_HOME/bin
OK,Hadoop的配置就完了(注意每个节点都要配置,配置内容都相同),接下来我们来启动这些框架,在启动之前一定要确保关闭防火墙。
五、启动集群
确保上面的配置完成之后,就可以启动集群了。使用jps命令查看是否启动。另外,注意启动是有顺序的。
5.1 启动Zookeeper
在之前配置的那3台服务器上分别启动zookeeper:
/probd/zookeeper-3.4.6/bin/zkServer.sh start
5.2 启动Journalnode
最先启动journalnode进程的目的就是为了之后存放namenode的元数据奠定基础,所以journalnode一定要在namenode之前启动。
在任意3台服务器上分别启动Journalnode:
/probd/hadoop-2.6.3/sbin/hadoop-daemon.sh start journalnode
5.3 格式化并启动namenode
之前我们在hdfs-site.xml配置中指定了probd01和probd02作为主namenode和备namenode节点,我们只需要格式化主namenode即可,然后需要先启动主namenode,因为只有启动主namenode进程后,才能将其元数据复制到备的namenode上。
在namenode probd01上执行
/probd/hadoop-2.6.3/bin/hdfs namenode -format
/probd/hadoop-2.6.3/bin/hadoop-daemon.sh start namenode
然后在secondarynamenode probd02上执行
/probd/hadoop-2.6.3/bin/hdfs namenode -bootstrapStandby
5.4 格式化zkfc
只在主namenode上格式化zkfc,只是为了连接上zookeeper集群,然后在zookeeper集群上面创建一个znode节点: /hadooop-ha/ns1,所以在哪里格式化zkfc其实不并重要,重要的是在zookeeper集群上创建znode。
这里在probd01上执行:
/probd/hadoop-2.6.3/bin/hdfs zkfc -formatZK
5.5 停掉主namenode进程和所有的journalnode
先停掉probd01上的主namenode进程和所有的journalnode,之后会通过start-dfs.sh脚本一次性重启所有进程。
在probd01上执行:
/probd/hadoop-2.6.3/sbin/hadoop-daemon.sh stop namenode
/probd/hadoop-2.6.3/sbin/hadoop-daemons.sh stop journalnode
5.6 启动HDFS所有进程
在probd01上上执行
/probd/hadoop-2.6.3/sbin/start-dfs.sh
5.7 启动yarn
在probd01上启动yarn:
/probd/hadoop-2.6.3/sbin/start-yarn.sh
在其它服务器分别启动resourcemanager:
/probd/hadoop-2.6.3/sbin/yarn-daemon.sh start resourcemanager
ok,Hadoop集群的搭建到此为止。