hadoop+zookeeper安装

安装软件包

https://download.csdn.net/download/zhangkangren/88152710安装包

软件名软件包
jdkjdk-8u261-linux-x64.tar.gz
hadoophadoop-3.3.0.tar.gz
zookeeperapache-zookeeper-3.8.0-bin.tar.gz

服务器分配

模块名称node10node11node12node13
NameNode**
DataNode****
ResourceManager**
NodeManager****
ZooKeeper***
journalnode***
ZooKeeperFailoverController**

1)NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。

2)DataNode(dn):Datanode是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送他们所存储的块(block)的列表。

3)ResourceManager(rm) :负责全局的资源管理金额任务调度,把整个集群当成计算资源池,只关注分配,不管应用,且不负责容错。

4) NodeManager(NM):是ResourceManager在每台机器上的代理,负责容器管理,并监控它们的资源使用情况,以及向ResourceManager/Scheduler提供资源使用报告。

5)journalnode(jn):两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。

6)ZooKeeperFailoverController(zkfc):监控NN状态,并随时报告状态给ZK。

7)ZooKeeper(zk):是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

安装步骤

一、环境初始化

四台主机都需要配置

#修改主机名

hostnamectl  set-hostname node10
hostnamectl  set-hostname node11
hostnamectl  set-hostname node12
hostnamectl  set-hostname node13

#添加hosts地址解析(四台主机都需要配置)

echo '192.168.100.10 node10' >> /etc/hosts
echo '192.168.100.11 node11' >> /etc/hosts
echo '192.168.100.12 node12' >> /etc/hosts
echo '192.168.100.13 node13' >> /etc/hosts

#关防火墙:

systemctl stop firewalld && systemctl disable firewalld

#关selinux:

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 如果不重启服务器可以执行:
setenforce 0

二、配置JDK环境

四台主机都需要配置

#上传JDK1.8包,解压到/opt下。

tar xf jdk-8u261-linux-x64.tar.gz -C /opt/

#配置环境变量:

vim /etc/profile.d/java.sh

#JAVA_HOME
export JAVA_HOME=/opt/jdk1.8.0_261
export PATH=$PATH:$JAVA_HOME/bin
#应用环境变量
source /etc/profile

三、安装zookeeper集群环境

集群规划

服务器IP主机名myid的值
192.168.100.10node100
192.168.100.11node111
192.168.100.12node122

三台主机都需要配置

#解压zookeeper文件

tar xf apache-zookeeper-3.8.0-bin.tar.gz -C /opt/
cd /opt/apache-zookeeper-3.8.0-bin/conf/

#复制配置文件并修改

cp zoo_sample.cfg zoo.cfg

#修改配置文件 vim zoo.cfg

# 修改集群数据存储目录
dataDir=/opt/apache-zookeeper-3.8.0-bin/data/
# 添加集群主机列表
server.0=node0:2888:3888
server.1=node1:2888:3888
server.2=node2:2888:3888

#配置文件参数说明

        ①tickTime:基本事件单元,这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳;最小 的session过期时间为2倍tickTime

        ②dataDir:存储内存中数据库快照的位置,除非另有说明,否则指向数据库更新的事务日志。注意:应该谨慎的选择日志存放的位置,使用专用的日志存储设备能够大大提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会很大程度上影像系统性能。

        ③client:监听客户端连接的端口。

        ④initLimit:允许follower连接并同步到Leader的初始化连接时间,以tickTime为单位。当初始化连接时间超过该值,则表示连接失败。

        ⑤syncLimit:表示Leader与Follower之间发送消息时,请求和应答时间长度。如果follower在设置时间内不能与leader通信,那么此follower将会被丢弃。

        ⑥server.A=B:C:D   A:其中 A 是一个数字,表示这个是服务器的编号;B:是这个服务器的 ip 地址;C:Zookeeper服务器之间的通信端口;D:Leader选举的端口。   

参考官方文档:ZooKeeper: Because Coordinating Distributed Systems is a Zoo

#创建存储目录

mkdir /opt/apache-zookeeper-3.8.0-bin/data/

#创建myid文件,在上一步dataDir指定的目录下,创建myid文件

#然后在该文件添加上一步server配置的对应A数字。

node0

echo '0' > /opt/apache-zookeeper-3.8.0-bin/data/myid

node1

echo '1' > /opt/apache-zookeeper-3.8.0-bin/data/myid

node2

echo '2' > /opt/apache-zookeeper-3.8.0-bin/data/myid

#设置软连接

ln -s /opt/apache-zookeeper-3.8.0-bin/bin/* /usr/local/bin/

#zookeeper管理命令

zkServer.sh start      #启动命令
zkServer.sh stop       #停止命令
zkServer.sh restart    #重启命令
zkServer.sh status     #查看集群节点状态

# leader领导节点,follower从节点

四、安装hadoop

四台主机都需要配置

#解压hadoop文件

tar xf hadoop-3.3.0.tar.gz -C /opt/
cd /opt/hadoop-3.3.0/etc/hadoop/

#Hadoop各目录说明

文件夹名称作用
bin存放对hadoop相关服务(HDFS,YARN)进行操作的脚本
sbin存放启动或停止hadoop相关服务的脚本
sharehadoop的配置文件目录,存放hadoop的配置文件
etc存放hadoop的依赖jar包和文档,文档可以被删除掉
lib存放hadoop的本地库(对数据进行压缩解压缩功能)

#各个配置文件的作用

配置文件的名称作用
core-site.xml核心配置文件,主要定义了我们文件访问的格式等
hadoop-env.sh主要配置我们的java路径等
hdfs-site.xml主要定义配置我们的hdfs的相关配置
mapred-site.xml主要定义我们的mapreduce相关的一些配置
yarm-site.xml配置我们的resourcemanager资源调度
workers控制我们的从节点在哪里datanode在哪些机器上

#修改第一个配置文件,指定JDK位置

vim hadoop-env.sh

export JAVA_HOME=/opt/jdk1.8.0_261

#修改第二个,指定存储数据的服务器(datanode)

vim workers

node11
node12
node13

#第三个配置文件,主配置文件

vim core-site.xml

<configuration>
    <property>
        <!--指定HDFS的老大(NameNode)的地址,这里使用myha的虚拟地址-->
        <name>fs.defaultFS</name>
        <value>hdfs://myha</value>
    </property>
    
    <property>
        <!--指定hadoop运行时产生文件的存储目录-->
        <name>hadoop.tmp.dir</name>        
        <value>/opt/hadoop-3.3.0/hadtmp</value>
    </property>
    
    <property>
        <!--配置HDFS网页登录使用的静态用户hadoop-->
        <name>hadoop.http.staticuser.user</name>
        <value>hadoop</value>
    </property>
    
    <property>
        <!--指定连接zookeeper集群主机地址和端口号-->
        <name>ha.zookeeper.quorum</name>
        <value>node10:2181,node11:2181,node12:2181</value>
    </property>
    
    <property>
        <!-- hadoop链接zookeeper的超时时长设置,单位ms -->
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>1000</value>
    </property>
</configuration>

fs.defaultFS

值设置成hdfs://myha,其中myha是一个虚拟的主机地址,在hdfs-site.xml配置文件中的dfs.nameservices和dfs.ha.namenodes.myha等参数中使用,与代理很像,使用myha代理两台真实的主机地址。

#第四个配置文件

vim hdfs-site.xml

<configuration>
    <property>
         <!--指定HDFS副本的数量-->     
         <name>dfs.replication</name>
         <value>2</value>
    </property>
    
    <property>
         <!--关闭权限验证,允许用户通过web访问上传文件-->
         <name>dfs.permissions.enabled</name>
         <value>false</value>
    </property>
    
    <property>
       <!-- NameNode的myha虚拟地址 -->
        <name>dfs.nameservices</name>
        <value>myha</value>
    </property>
    
    
    <property>
        <!-- myha下面有两个NameNode,分别是nn1,nn2 -->
        <name>dfs.ha.namenodes.myha</name>
        <value>nn1,nn2</value>
    </property>
    
    <property>
        <!-- nn1的RPC【RPC是远程过程调用(Remote Procedure Call)的缩写形式。】通信地址 -->
        <name>dfs.namenode.rpc-address.myha.nn1</name>
        <value>node10:8082</value>
    </property>
    
    <property>
        <!--nn1的http通信地址 -->
        <name>dfs.namenode.http-address.myha.nn1</name>
        <value>node10:9870</value>
    </property>

    <property>
        <!-- nn2的RPC通信地址 -->
        <name>dfs.namenode.rpc-address.myha.nn2</name>
        <value>node11:8082</value>
    </property>

    <property>
        <!-- nn2的http通信地址 -->
        <name>dfs.namenode.http-address.myha.nn2</name>
        <value>node11:9870</value>
    </property>
    
    <!-- 指定NameNode的edits元数据的共享存储位置。-->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node10:8485;node11:8485;node12:8485/myha</value>
     </property>
    
    <property>
        <!-- 开启NameNode失败自动切换 -->
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    
    <property>
        <!-- 配置失败自动切换实现方式 -->
        <name>dfs.client.failover.proxy.provider.myha</name>
        <value>
            org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
        </value>
    </property>
    
    <property>
        <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>
    
    <property>
        <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
</configuration>

dfs.namenode.shared.edits.dir

JournalNode列表,该url的配置格式:qjournal://host1:port1;host2:port2;host3:port3/journalId,journalId推荐使用nameservice,默认端口号是:8485

NameNode之间共享数据(NFS 、Quorum Journal Node(用得多))

两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。

Hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作。在hadoop1.x时代,只有一个NameNode。如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了。这是hadoop1.x中的单点问题,也是hadoop1.x不可靠的表现。

单点故障

hadoop2.2.0(HA)中HDFS的高可靠指的是可以同时启动2个NameNode。其中一个处于工作状态,另一个处于随时待命状态。这样,当一个NameNode所在的服务器宕机时,可以在数据不丢失的情况下,手工或者自动切换到另一个NameNode提供服务。

这些NameNode之间通过共享数据,保证数据的状态一致。多个NameNode之间共享数据,可以通过Nnetwork File System或者Quorum Journal Node。前者是通过linux共享的文件系统,属于操作系统的配置;后者是hadoop自身的东西,属于软件的配置。

我们这里讲述使用Quorum Journal Node的配置方式,方式是自动方式。

集群启动时,可以同时启动2个NameNode。这些NameNode只有一个是active的,另一个属于standby状态。active状态意味着提供服务,standby状态意味着处于休眠状态,只进行数据同步,时刻准备着提供服务。

在一个典型的HA集群中,每个NameNode是一台独立的服务器。在任一时刻,只有一个NameNode处于active状态,另一个处于standby状态。其中,active状态的NameNode负责所有的客户端操作,standby状态的NameNode处于从属地位,维护着数据状态,随时准备切换。

两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。

 

为了确保快速切换,standby状态的NameNode有必要知道集群中所有数据块的位置。为了做到这点,所有的datanodes必须配置两个NameNode的地址,发送数据块位置信息和心跳给他们两个。

对于HA集群而言,确保同一时刻只有一个NameNode处于active状态是至关重要的。否则,两个NameNode的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,JNs必须确保同一时刻只有一个NameNode可以向自己写数据。

dfs.client.failover.proxy.provider.[nameservice ID]

HDFS客户端用来连接集群中Active状态节点的Java类,ConfiguredFailoverProxyProvider是目前唯一可以指定的类

dfs.ha.fencing.methods

这是个值得好好说一下的配置。当配置了HDFS HA集群时,会有两个NameNode,为了避免两个NN都为Active状态(这种情况称为split-brain scenario),当发生failover时,Standby的节点要执行一系列方法把原来那个Active节点中不健康的NameNode服务给杀掉(这个过程就称为fence)。而下面这个配置就是配置了执行杀死原来Active NameNode服务的方法。这里面配置的所有方法都会被顺序的执行,最后返回结果即为fence过程的结果。如果fence执行成功,就把原来为Standby的NameNode的状态提升为Active。sshfence方法会通过ssh远程调用fuser命令去找到NameNode服务并杀死它。

我们的目标是当发生failover时,不论如何,就算前面的sshfence执行失败(比如服务器上不存在fuser命令),依然把Standby节点的状态提升为Active,所以最后无论如何要配置一个shell(/bin/true),保证不论前面的方法执行的情况如何,最后fence过程返回的结果都为true。dfs.ha.fencing.ssh.private-key-files配置了ssh命令所需要用到的私钥。

#第五个配置文件

vim mapred-site.xml

<configuration>
    <property>
         <!-- 指定mr资源调度框架为yarn方式 -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>

    <property>
        <!-- 指定mapreduce jobhistory任务历史地址 -->
        <name>mapreduce.jobhistory.address</name>
        <value>node10:10020</value>
    </property>

    <property>
        <!-- 任务历史服务器的web地址,通过浏览器访问 -->
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>node10:19888</value>
    </property>
</configuration>

mapreduce.jobhistory.address

jobhistory用于查询每个job运行完以后的历史日志信息,是作为一台单独的服务器运行的。可以在namenode或者datanode上的任意一台启动即可。

日志存储过程jobhistory server来实现web查看作业的历史运行情况,日志存储的位置是在hdfs文件系统中。

当job作业在运行中时,可以直接通过web查看作业的运行状况, 此时的记录保存在${mapreduce.intermediate-done-dir} 路径下。当job作业执行完成后,会将${mapreduce.intermediate-done-dir}目录下的日志文件移动到历史文件夹${mapreduce.jobhistory.done-dir}中。${mapreduce.intermediate-done-dir} 和 ${mapreduce.jobhistory.done-dir} 在mapred-site.xml中配置。

如果没有启动jobhistory进程,就无法查看历史执行的明细信息。

当由于在启动hdfs和Yarn进程之后,jobhistoryserver进程并没有启动,需要手动启动。

#第六个配置文件

vim yarn-site.xml

<configuration>
    <property>
        <!-- 设置计算使用mapreduce_shuffle -->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    
    <!-- 开启RM高可用 -->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!-- 指定RM的cluster id -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yrc</value>
    </property>

    <!-- 指定RM集群的对应节点别名 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <!-- 分别指定RM节点的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>node12</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>node13</value>
    </property>

    <!-- 指定zk集群地址 -->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node10:2181,node11:2181,node12:2181</value>
    </property>

    <property>
        <!-- 是否开启日志聚合 -->
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <property>
        <!-- 日志聚合访问端口 -->
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>86400</value>
    </property>

    <!-- 启用自动恢复 -->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>

    <!-- 制定resourcemanager的状态信息存储在zookeeper集群上 -->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>
            org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
        </value>
    </property>
</configuration>

yarn.nodemanager.aux-services

MapReduce计算模型 我们知道MapReduce计算模型主要由三个阶段构成:Map、shuffle、Reduce。

Map是映射,负责数据的过滤分法,将原始数据转化为键值对;Reduce是合并,将具有相同key值的value进行处理后再输出新的键值对作为最终结果。为了让Reduce可以并行处理Map的结果,必须对Map的输出进行一定的排序与分割,然后再交给对应的Reduce,而这个将Map输出进行进一步整理并交给Reduce的过程就是Shuffle。整个MR的大致过程如下:

 

yarn.log-aggregation-enable

日志聚合的作用就在于可以把来自不同服务器上不同应用程序产生的日志聚合起来,存放在单一的服务器上,方便进行搜索和分析。

#给hadoop应用目录添加环境变量

vim /etc/profile.d/hadoop.sh
#HADOOP_HOME
export HADOOP_HOME=/opt/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
#应用环境变量
source /etc/profile

五、创建用户并设置免密码登录

#四台机子都要做

#创建用户并设置密码
useradd hadoop && echo 'hadoop' | passwd --stdin hadoop

#给hadoop用户赋权
chown -R hadoop:hadoop /opt/hadoop-3.3.0/
chown -R hadoop:hadoop /opt/apache-zookeeper-3.8.0-bin/
#在node10上操作,使用hadoop用户登录
#切换用户
su - hadoop

#创建密钥对
ssh-keygen

将密钥对上传到所有主机
ssh-copy-id -i .ssh/id_rsa.pub node10
ssh-copy-id -i .ssh/id_rsa.pub node11
ssh-copy-id -i .ssh/id_rsa.pub node12
ssh-copy-id -i .ssh/id_rsa.pub node13

六、Hadoop HA集群的初始化

#使用hadoop用户

su - hadoop
1、启动ZooKeeper
# node10 启动zk
/opt/apache-zookeeper-3.8.0-bin/bin/zkServer.sh start
# node11 启动zk
ssh node11 /opt/apache-zookeeper-3.8.0-bin/bin/zkServer.sh start
# node12 启动zk
ssh node11 /opt/apache-zookeeper-3.8.0-bin/bin/zkServer.sh start

#查看状态
2、启动journalnode
# node10 启动journalnode
hadoop-daemon.sh start journalnode
# node11 启动journalnode
ssh node11 hadoop-daemon.sh start journalnode
# node12 启动journalnode
ssh node11 hadoop-daemon.sh start journalnode
3、格式化namenode
# node10上
hadoop namenode -format
# 把在node10节点上生成的元数据复制到另一个namenode(node11)节点上
scp -r /opt/hadoop-3.3.0/hadtmp/hadoopdata/ node11:/opt/hadoop-3.3.0/hadtmp/hadoopdata/
4、格式化zkfc
# node10 上执行格式化zkfc,与zk对接后用于提取NN状态并向zk传输数据
hdfs zkfc -formatZK
5、启动集群
# node10 上执行
start-all.sh
6、启动 mapreduce 任务历史服务器
mr-jobhistory-daemon.sh start historyserver
7、查看各NN节点的状态
hdfs haadmin -getServiceState nn1
8、集群性能测试

在激活状态(active)的NN节点上kill掉NN(查看NN的PID使用jps命令),查看备用节点的(standby)的状态。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值