Hadoop集群搭建

1、Hadoop完全分布式集群

在安装之前你需要做三件事:

第一件:你的虚拟机的ip修改好,你的网络可以ping通顺,你的 域名和ip要配置好(/etc/hosts)。
第二件:你需要安装好java8以上的环境。

第三件:你需要安装好hadoop。

2、远程拷贝介绍


方式一:scp

scp -r hadoop100:/opt/module/hadoop-2.9.2 hadoop101:/opt/module

这里是把hadoop100机器上的hadoop拷贝到hadoop101上

hadoop100对应的是192.168.206.67机器

hadoop101对应的是192.168.206.68机器

注意:上面的代码可以放在源机器100上执行,也可以放在目标机器101上执行

方式二:rsync

rsync -av  hadoop100:/opt/module/hadoop-2.9.2  /opt/module

这里是把hadoop100机器上的hadoop拷贝到目标机器上,后面不能为远程地址,只能是目标机器的地址

hadoop100对应的是192.168.206.67机器

/opt/module为目标机器的路径

注意:上面的代码只能放在目标机器上执行

rsync是完全拷贝,包括时间都一样。该方式拷贝的速度比scp快,我们一般使用这种方式进行拷贝。

3、集群规划

HDFS

NN:NameNode(一个) DN:DataNode(最少三个) 2NN :Secondary NameNode (一个)

YARN

RM:Resource Manager(一个) NM:Node Manager(最少三个)

DN管理当前节点的存储,NM管理CPU和内存,DN和NM往往是混搭在一起的,所以这两者一共需要三台机器

所以,这里最少需要6台虚拟机,但是我们这里只有三台虚拟机。因此,我们采用让NN,2NN,RM分别和一个DN与NM的混搭机器放在一起

如下图


对于HDFS来说:机器1是主机,同时第1,2,3台机器都是从机,也就是说第一台机器即是主机又是从机

对于YARN来说:机器3是主机,同时第1,2,3台机器都是从机,也就是说第三台机器即是主机又是从机

这里第一台对应我们的192.168.206.67,也就是hadoop100。

这里第二台对应我们的192.168.206.68,也就是hadoop101。

这里第三台对应我们的192.168.206.69,也就是hadoop102。

4、配置文件

主要配置文件包含: core-site.xml , hdfs-site.xml ,mapred-site.xml , yarn-site.xml 。

env配置文件:hadoop-env.sh , mapped-env.sh , yarn-env.sh,这几个env只修改JAVA_HOME的路径


这里可以在一台机器上进行修改配置文件,然后分发复制到其余的两台机器。上面说过env配置文件只需要加上JAVA_HOME就行了,这里主要展示修改core-site.xml , hdfs-site.xml ,mapred-site.xml , yarn-site.xml 这四个配置文件。

(1)core-site.xml :指定NN的地址,这里我们的NN在第一台机器上
<configuration>
    <!-- 指定HDFS中NameNode的地址,由于我们修改了hosts文件,这里的hadoop100表示的就是我们本机ip:192.168.206.67 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop100:9000</value> <!--这里我们的NameNode节点就在第一台机器hadoop100上-->
    </property>
    <!-- 指定Hadoop运行时产生文件的存储目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/module/hadoop-2.9.2/data/tmp</value>
    </property>
</configuration>

(2)hdfs-site.xml: 指定2NN的位置和DN副本的数量

<configuration>
    <!-- 指定HDFS副本的数量 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>   <!--这里DN的数量为3,所以我们设置为3-->
    </property>
    <!-- 指定Hadoop辅助名称节点2NN主机配置 -->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop101:50090</value>  <!--这里我们的2NN放在了第二台机器,也就是hadoop101上-->
    </property>
</configuration>

(3)mapred-site.xml: 指定MapReduce的运行位置,这里是运行在YARN上

<!-- 指定MR运行在Yarn上 -->
<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

(4)yarn-site.xml : 指定YARN的ResourceManager的地址,这里是在机器3上,也就是hadoop102上

<configuration>
<!-- Reducer获取数据的方式 -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
<!-- 指定YARN的ResourceManager的地址 ,这里在hadoop102上-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop102</value>
    </property>
</configuration>

到此,配置文件就搞定了。

5、启动集群


1,格式化NameNode,这里我们的NameNode在100这台机器上,所以我们需要在100上进行格式化,注意这里只能格式化一次,如果多次格式化会出现问题的,可以在logs日志文件中查看对应的日志。

注意:格式化只能在首次启动之前进行格式化,多次格式化namenode可能会出现datanode无法启动的问题,每次格式化时,namenode会更新clusterID,但是datanode只会在首次格式化时确定,因此就造成不一致现象。所以当多次格式化的时候需要删除/opt/module/hadoop-2.9.2/data/tmp/dfs文件夹中的data文件,或者替换clusterID,我一般是直接删除data文件夹。

[root@hadoop100 hadoop-2.9.2]# hdfs namenode -format

2.启动NameNode, 这里同样需要在100机器上进行操作

[root@hadoop100 hadoop-2.9.2]# hadoop-daemon.sh start namenode

3.启动DataNode,三台机器上都有DN,所以每一台机器都要执行下面的命令,启动datanode节点

[root@hadoop100 hadoop-2.9.2]# hadoop-daemon.sh start datanode

4.启动Secondary NameNode(2NN),这里是在101这台机器上

[root@hadoop100 hadoop-2.9.2]# hadoop-daemon.sh start secondarynamenode

到这里就启动完成了。

6、检查是否启动

检查是否启动成功:这里是访问100这台机器,也就是192.168.206.67:50070,点击Datanodes


因为三台机器上都有datanode,如果显示的是3台机器,则表示配置成功,如下图所示。


7、免密登录

由于启动hadoop集群非常麻烦,所以我们想到通过脚本的方式来启动,其实hadoop官方有对应的脚本,但是需要我们配置一些东西,从官方的配置文件我们可以知道hadoop依赖java和ssh,但是我们上面只使用到了java环境,并没有使用到ssh相关的内容,这里我们需要配置一下ssh,用于启动hadoop集群。

SSH免密登录原理
ssh是一个安全外壳协议,用来保证远程通信的安全,它是基于非对称式加密的,所以要想实现免密登录,需要先在本机器中生成密钥对,然后把其中的一个公钥发到要通信的机器上,就能实现单向的免密通信了。如下图所示:



SSH免密登录配置

例如这里要实现100和101的通信
1:生成密钥对

ssh-keygen -t rsa

三个都回车,什么都不要输入!!!

默认生成的文件在root下的.ssh文件夹

生成的键值对是通过base64加密的。想要免密通信则需要把已经生成的公钥发送给需要通信的远程主机。

ssh-copy-id hadoop101

在第一次发送密钥的时候需要输入密码。


发送过去之后,可以在101中生成一个.ssh文件夹,里面包含两个文件。

这里的authorized_keys 和100中的id_rsa.pub一样。

到此就完成了免密登录的内容,注意:这个免密登录是单向的,只能从100登录到101,如果想要从101登录到100,还要把上诉内容在101上重复操作一遍。两台机器都操作一遍之后就可以实现双方的免密登录了。

上面的在100中进行测试可以发现,不用输入密码,可以直接切换到101机器上,如果需要退出登录的机器,使用exit命令退出。

此时通过ssh hadoop100并不能直接连到本机,因为本机器中没有自己的已经确认的公钥,所以需要发送给自己一份


注意:Hadoop集群的要求是集群中的机器都能互相访问,如下图所示:


所以需要对每个节点都要配置三次:本机对本机、本机对另外两台机器

注意:上面我们通过手动启动的时候没有配置,NM和DN,但是如果通过群起脚本启动集群,则需要说明

8、群起脚本

在 /opt/module/hadoop-2.9.2/etc/hadoop下的文件在中查找slaves,并在其中配置从机的位置(这里三台都是从机)

[root@hadoop100 hadoop]# vim slaves

删除里面的localhost,添加从机。


1. 启动HDFS

修改完成之后通过启动start-dfs.sh即可群起集群的hdfs,注意:修改完成后需要把修改的配置文件在三台机器上同步,无论修改什么配置都应该如此。

scp -r hadoop100:/opt/module/hadoop-2.9.2/etc/hadoop/  hadoop101:/opt/module/hadoop-2.9.2/etc/

scp -r hadoop100:/opt/module/hadoop-2.9.2/etc/hadoop/  hadoop102:/opt/module/hadoop-2.9.2/etc/

启动的结果如下:


可以看到这里100启动了如下:


101启动了如下:


102启动了如下:


2. 启动YARN

对比上面的集群规划可知,其中102种的RM并没有启动,这里需要在102机器上启动yarn(因为yarn的主节点resourcemanager安装在102上)。启动的结果如下:

这里是102机器:


101机器:


100机器:


3. 总结

下面是分别启动HDFS和YARN时,集群中节点的启动情况,如果无法启动,检查服务器的防火墙是否关闭

启动的情况如下表所示:


Hadoop100Hadoop101Hadoop102
HDFSNameNode ,DataNodeSecondaryNameNode,DataNodeDataNode
YARNNodeManagerNodeManagerResourceManager,NodeManager

此时可以访问 hadoop100:50070 和 hadoop102:8088来查看集群的状态,如下图所示:


yarn的情况如下:


注意都是三个节点,如果没有三个节点,则把对应的关闭,重新启动一下。

9、启动和关闭指令

  1. 各个服务组件逐一启动/停止

(1)分别启动/停止HDFS组件

hadoop-daemon.sh start | stop namenode | datanode |secondarynamenode

(2)启动/停止YARN

yarn-daemon.sh start |stop resourcemanager | nodemanager

  1. 各个模块分开启动/停止(配置ssh是前提)常用

(1)整体启动/停止HDFS

start-dfs.sh | stop-dfs.sh

(2)整体启动/停止YARN

start-yarn.sh | stop-yarn.sh

10、测试

1. 上传文件

把hadoop中将自己创建的文件夹上传文件到hdfs

cd /opt/module/hadoop-2.9.2

hadoop fs -put wcinput /

之后可以去http://hdaoop101:50070中的Utilities中查询,注意这个wcinput是自己创建的目录,其中有个wc.input文件,该文件中有一些单词,用于后续的计算。

2. 在线计算

下面是使用在线计算的指令:

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput /output

其中 wordcount表示计数功能 , /wcinput 表示我们刚刚上传到hdfs中的目录 ,/output表示我们在hdfs中的输出目录,要求这个目录在hdfs中事先不存在。

11、常用工具

配置之前需要停止hdfs和yarn, 在100中执行stop-dfs.sh, 102中执行stop-yarn.sh 。

(1):历史服务器配置

历史服务器可以帮助我们查看历史记录,在出错的时候非常有用。在100机器中中配置 mapred-site.xml,在之前的基础上加入历史服务器,这里把102作为历史服务器。注意在配置完成之后需要同步到集群中其他的机器

<configuration>
        <!--指定mapreduce运行在yarn上-->
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <!-- 历史服务器端地址 -->
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>hadoop102:10020</value>
        </property>
        <!-- 历史服务器web端地址 -->
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>hadoop102:19888</value>
        </property>
</configuration>

注意:这里我们的历史服务器在102上,在启动集群之后还要在102上启动历史服务器

mr-jobhistory-daemon.sh start historyserver

启动完成如下图,可以发现多了个JobHistoryServer ,在关闭集群的时候也要关闭这个历史服务器, 只需要把上述命令的start换成stop就可以了。


(2):日志聚集

这里同样在100机器中中配置 yarn-site.xml,配置完成之后分发到集群中的其他机器。

<configuration>
        <!-- Reducer获取数据的方式 -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <!-- 指定YARN的ResourceManager的地址 -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop102</value>
        </property>
        <!-- 日志聚集功能使能 -->
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
        <!-- 日志保留时间设置7天 -->
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>604800</value>
        </property>
</configuration>

注意:在配置完成之后一定要同步到集群中的其他服务器,这里其余两台机器中都要同步一下。

(3):集群时间同步
时间同步的方式,在集群中找一个机器作为时间服务器,所有的机器都与这台机器进行定时同步,要么时间全对,要么时间全错,比如,每隔十分钟同步一下时间。(NTP服务)

第一步:安装ntp服务(集群中的服务器都要安装)

1.首先查看系统中是否有ntp服务和nptdata服务

[root@hadoop100 ~]# rpm -qa|grep ntp

如果没有ntp服务,则需要先安装ntp服务,yum install -y ntp ,因为ntp依赖ntpdata,因此只需安装ntp就会默认安装ntp和nptdata。

[root@hadoop100 ~]# rpm -qa|grep ntp

此时查看可以看到新增了ntp和ntpdata

2.查看ntp服务是否开启

service ntpd status

如果是开启的,我们需要先关闭 service ntpd stop

3.输入chkconfig ntpd off ,关闭ntpd

输入chkconfig --list ntpd ,查看是否全部为关闭状态

第二步:修改ntp配置文件

1.时间服务机器配置 (这里是在100上)

[root @hadoop100]# vi /etc/ntp.conf

a)修改1(授权192.168.1.0-192.168.1.255网段上的所有机器可以从这台机器上查询和同步时间)

# restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为 :
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
也就是把注释放开

b)修改2(集群在局域网中,不使用其他互联网上的时间)

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst  
 修改为:
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
也就是注释掉

c)添加3(当该节点丢失网络连接,依然可以采用本地时间作为时间服务器为集群中其他节点提供时间同步)

server 127.127.1.0
fudge 127.127.1.0 stratum 10

d)修改/etc/sysconfig/ntpd 文件

[root @hadoop100]# vim /etc/sysconfig/ntpd

增加内容如下(让硬件时间与系统时间一起同步)

SYNC_HWCLOCK=yes

e)重新启动ntpd服务

首先查看ntpd的状态:service ntpd status

如果为关闭状态,则使用 service ntpd start 重新启动。

f)设置ntpd服务开机启动

[ root @hadoop100]# chkconfig ntpd on

2. 其他机器配置(需root权限,时间同步在100上,所以我们需要在集群中的101和102中配置定时任务)

(1)在其他机器(101和102,这里以101为例)配置10分钟与时间服务器同步一次

[root @hadoop101]# crontab -e

编写定时任务如下(表示每十分钟从机器100上同步一次):

*/10 * * * * /usr/sbin/ntpdate hadoop100

(2)修改任意机器时间

date -s "2017-9-11 11:11:11"

(3)十分钟后查看机器是否与时间服务器同步

[root @hadoop101]# date

说明:测试的时候可以将10分钟调整为1分钟,节省时间。

到此hadoop的完全分布式集群就搭建完成了。 END

全部评论