Hadoop多节点集群的构建



1、集群部署介绍

1.1 Hadoop简介

   HadoopApache软件基金会旗下的一个开源分布式计算平台。以Hadoop分布式文件系统HDFS(Hadoop Distributed Filesystem)和MapReduceGoogle MapReduce的开源实现)为核心Hadoop为用户提供了系统底层细节透明的分布式基础架构。

   对于Hadoop的集群来讲,可以分成两大类角色:MasterSalve。一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件系统的访问操作;集群中的DataNode管理存储的数据。MapReduce框架是由一个单独运行在主节点上的JobTracker和运行在每个从节点的TaskTracker共同组成的。主节点负责调度构成一个作业的所有任 务,这些任务分布在不同的从节点上。主节点监控它们的执行情况,并且重新执行之前的失败任务;从节点仅负责由主节点指派的任务。当一个Job被提交时,JobTracker接收到提交作业和配置信息之后,就会将配置信息等分发给从节点,同时调度任务并监控TaskTracker的执行。

  从上面的介绍可以看出,HDFSMapReduce共同组成了Hadoop分布式系统体系结构的核心。HDFS在集群上实现分布式文件系统MapReduce在集群上实现了分布式计算任务处理HDFSMapReduce任务处理过程中提供了文件操作和存储等支持,MapReduceHDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop分布式集群的主要任务。

1.2 环境说明

    Hadoop集群中包括3个节点:1Master2Salve,节点之间局域网连接,可以相互ping通,节点IP地址分布如下:

IPHostname
10.139.8.39master
10.139.8.40slave1
10.139.8.41slave2

    Master机器主要配置NameNodeJobTracker的角色,负责总管分布式数据和分解任务的执行;2Salve机器配置DataNode TaskTracker的角色,负责分布式数据存储以及任务的执行。在hadoop2中可以有多个namenode节点,以配置hadoop的高可用性。每一个namenode都有相同的职能。其中一个是active状态的,另一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可靠性(HA)


在这里,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,JournalNode集群或者NFS进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享。

这就需要使用ZooKeeper集群进行选择了。HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。

1.3 环境配置

1)修改当前机器名称

假定我们发现我们的机器的主机名不是我们想要的。

1)在CentOS下修改机器名称

修改文件/etc/sysconfig/network里的值即可,修改成功后用hostname命令查看当前主机名是否设置成功。


2)配置hosts文件

   "/etc/hosts"这个文件是用来配置主机将用的DNS服务器信息,是记载LAN内接续的各主机的对应[HostName  IP]用的。当用户在进行网络连接时,首先查找该文件,寻找对应主机名对应的IP地址。


保存修改后,重启系统。


2.2 配置Master无密码登录所有Salve

1)SSH无密码原理

Master(NameNode | JobTracker)作为客户端,要实现无密码公钥认证,连接到服务器Salve(DataNode | Tasktracker)上时,需要在Master上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到所有的Slave上。当Master通过SSH连接Salve时,Salve就会生成一个随机数并用Master的公钥对随机数进行加密,并发送给Master。Master收到加密数之后再用私钥解密,并将解密数回传给Slave,Slave确认解密数无误之后就允许Master进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。

2)Master机器上设置无密码登录

a. Master节点利用ssh-keygen命令生成一个无密码密钥对。

在Master节点上执行以下命令:

ssh-keygen –t rsa

运行后询问其保存路径时直接回车采用默认路径。生成的密钥对:id_rsa(私钥)和id_rsa.pub(公钥),默认存储在"/home/用户名/.ssh"目录下。  

查看"/home/用户名/"下是否有".ssh"文件夹,且".ssh"文件下是否有两个刚生产的无密码密钥对。


b. 接着在Master节点上做如下配置,把id_rsa.pub追加到授权的key里面去。

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

查看下authorized_keys的权限,如果权限不对则利用如下命令设置该文件的权限:

chmod 600 authorized_keys

c. 用root用户登录修改SSH配置文件"/etc/ssh/sshd_config"的下列内容。

检查下面几行前面”#”注释是否取消掉:

RSAAuthentication yes # 启用 RSA 认证

PubkeyAuthentication yes # 启用公钥私钥配对认证方式

AuthorizedKeysFile  %h/.ssh/authorized_keys # 公钥文件路径 

设置完之后记得 重启SSH服务 ,才能使刚才设置有效。

下面就是重复上面的步骤把剩余的两台(Slave1Slave2)Slave服务器进行配置。这样,我们就完成了"配置Master无密码登录所有的Slave服务器"。

接下来配置所有Slave无密码登录Master,其和Master无密码登录所有Slave原理一样,就是把Slave的公钥追加到Master的".ssh"文件夹下的"authorized_keys"中,记得是追加(>>

3、Java环境安装

所有的机器上都要安装JDK,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装JDK以及配置环境变量,需要以"root"的身份进行。

3.1 安装JDK

首先用root身份登录"Master.Hadoop"后在"/usr"下创建"java"文件夹,再将"jdk-8u91-linux-x64.tar.gz"复制到"/usr/java"文件夹中,然后解压即可。查看"/usr/java"下面会发现多了一个名为"jdk1.8.0_91"文件夹,说明我们的JDK安装结束,进入下一个"配置环境变量"环节。

3.2 配置环境变量

(1)编辑"/etc/profile"文件

    编辑"/etc/profile"文件,在后面添加Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"内容如下:


(2)使配置生效

保存并退出,执行下面命令使其配置立即生效。

source /etc/profile

3.3 验证安装成功

配置完毕并生效后,用下面命令判断是否成功。

java -version


从上图中得知,我们确定JDK已经安装成功。

3.4 安装剩余机器

这时用普通用户hadoop通过scp命令格式把"/usr/java/"文件复制到其他Slave上面,剩下的事儿就是在其余的Slave服务器上按照上图的步骤配置环境变量和测试是否安装成功,这里以Slave1.Master为例:

scp -r /usr/java seed@Slave1.Master:/usr/ 

4、Hadoop集群安装

所有的机器上都要安装hadoop,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装和配置hadoop需要以"root"的身份进行。

4.1 安装hadoop

所有的机器上都要安装hadoop,现在就先在Master服务器安装,然后其他服务器按照步骤重复进行即可。安装和配置hadoop需要以"root"的身份进行。

4.1 安装hadoop

首先用root用户登录"Master"机器,将下载的"hadoop-2.6.4.tar.gz"复制到/usr目录下。然后进入"/usr"目录下,用下面命令把"hadoop-2.6.4.tar.gz"进行解压,并将其重命名为"hadoop",把该文件夹的读权限分配给普通用户hadoop,然后删除"hadoop-1.0.0.tar.gz"安装包。

cd /usr

tar –xzvf hadoop-2.6.4.tar.gz

mv hadoop-2.6.4 hadoop

chown –R hadoop:hadoop hadoop #将文件夹"hadoop"读权限分配给hadoop普通用户

rm -rf hadoop-2.6.4.tar.gz

把Hadoop的安装路径添加到"/etc/profile"中,修改"/etc/profile"文件,将以下语句添加到末尾,并使其生效(. /etc/profile):


4.2 配置hadoop

   本文部署的hadoop2.4中NameNode节点不再是只有一个,可以有多个(目前只支持2个)。每一个都有相同的职能。
    一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可靠(HA)。
    在这里,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,JournalNode集群或者NFS进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享。
    这就需要使用ZooKeeper集群进行选择了。HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。

(1)配置hadoop-env.sh

该"hadoop-env.sh"文件位于"/usr/hadoop/etc/hadoop"目录下。

在文件中修改下面内容:


(2)安装配置zookeeper

下载最新的zooper软件:http://www.apache.org/dyn/closer.cgi/zookeeper/,并将下载后的zookeeper-3.4.8.tar.gz解压到/usr/hadoop/app下,把zookeeper的安装路径添加到"/etc/profile"中,修改"/etc/profile"文件,将以下语句添加到末尾,并使其生效(. /etc/profile):


在/usr/hadoop/app/zookeeper/conf下新建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=/usr/hadoop/app/zookeeper/zkdata
datalogDir=/usr/hadoop/app/zookeeper/zkdatalog
# the port at which the clients will connect
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
# 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
在/usr/hadoop/app/zookeeper下新建zkdata与zkdatalog两个文件夹, 进入zkdata目录,创建一个myid的文件,里面写入一个数字,比如我这个是server1,那么就写一个 1,server2对应myid文件就写入2,server3对应myid文件就写个3,注意,每台机器都不一样!

(3)配置core-site.xml文件

修改Hadoop核心配置文件core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>

<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/tmp</value>
</property>

<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>

<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>

(4)配置hdfs-site.xml文件

修改Hadoop中HDFS的配置

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>

<property> 
<name>dfs.nameservices</name>
<value>ns</value>
</property>

<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property> 

<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>master:9000</value>
</property>

<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>master:50070</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>slave1:9000</value>
</property>

<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>slave1:50070</value>
</property>

<property>
<name>dfs.client.failover.proxy.provider.ns</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>/usr/hadoop/tmp/journal</value>
</property>
<!--指定支持高可用自动切换机制-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/hadoop/dfs/name</value>
</property>

<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/hadoop/dfs/data</value>
</property>

<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/ns</value>
</property>
<!-- 
     <property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>

(5)配置mapred-site.xml文件

修改Hadoop中MapReduce的配置文件

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<final>true</final>
</property>

<property>
<name>mapreduce.jobtracker.http.address</name>
<value>master:50030</value>
</property>

<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>

<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>http://master:9001</value>
</property>
</configuration>

(6)配置yarn-site.xml文件

修改Hadoop中yarn的配置文件

<?xml version="1.0"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->
<configuration>

<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>

<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>

<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>

<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>

<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>

<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
</configuration>

(7)配置slaves文件(Master主机特有

slave1
slave2

现在在Master机器上的Hadoop配置就结束了,剩下的就是配置Slave机器上的Hadoop。

最简单的方法是将 Master上配置好的hadoop所在文件夹"/usr/hadoop"复制到所有的Slave的"/usr"目录下(实际上Slave机器上的slavers文件是不必要的, 复制了也没问题)。用下面命令格式进行。

scp -r /usr/hadoop root@slave1:/usr/

scp -r /usr/hadoop root@slave2:/usr/


三、启动过程

1、启动Zookeeper集群


分别在master、slave1、slave2上执行

zkServer.sh start

然后执行:

zkServer.sh status


查看是否启动,确保启动后执行后面的步骤
三个节点都启动后,执行

zkCli.sh

然后执行

ls /
查看Zookeeper集群中是否有HA节点

2、格式化Zookeeper集群,目的是在Zookeeper集群上建立HA的相应节点
master上执行,注意,最好手动敲入命令。

hdfs zkfc –formatZK
格式化后验证,执行

zkCli.sh
再执行

ls /
会出现下图中红色部分



则表示格式化成功

ls /hadoop-ha

会出现我们配置的HA集群名称

3、启动Journal集群

分别在master,slave1,slave2上执行

hadoop-daemon.sh start journalnode

4、格式化集群上的一个NameNode

在master上执行:

hdfs namenode -format

5、启动集群中步骤4中的NameNode

启动master上的NameNode

hadoop-daemon.sh start namenode

6、把NameNode的数据同步到另一个NameNode上

把NameNode的数据同步到slave1上,在slave1上执行:

hdfs namenode –bootstrapStandby

7、启动另个一NameNode

在slave1上执行

hadoop-daemon.sh start namenode

8、启动所有的DataNode
hadoop-daemons.sh start datanode

9、启动Yarn

start-yarn.sh
11、启动ZKFC

分别在master与slave1上执行

hadoop-daemon.sh start zkfc



至此配置结束。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值