企业大数据处理:Spark、Druid、Flume与Kafka应用实践
上QQ阅读APP看书,第一时间看更新

1.2 集群环境准备

1.2.1 Zookeeper集群部署

Zookeeper是大数据系统中常用的分布式框架,主要用于公共配置管理、集群资源一致性管理、状态管理、部分分布式系统Leader选举等,下面通过完全分布式搭建方式进行介绍。

1.集群规划

由于Zookeeper采用FastLeaderElection算法选举Leader,集群中过半的机器正常运行才能够成功选举Leader,为保证集群正常运行,集群部署的节点数为奇数个,最少节点个数为3,生产环境建议部署5个以上的奇数个节点,因为3个实例其中只要有一个实例不可用,整个Zookeeper集群将无法成功选举,仍然不可以提供服务。

2.部署过程

本例将以三个节点的部署为例,分别在192.168.1.1、192.168.1.2、192.168.1.3三台服务器部署一个Zookeeper实例。详细部署过程如下:

(1)下载安装包并解压

        wget http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

解压到/data/soft目录下:

        tar -zxvf http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
        -C /data/soft

(2)创建软连接

创建软连接便于以后升级版本,方便统一管理。

       ls-s /data/soft/zookeeper-3.4.6./usr/local/zookeeper

(3)设置环境变量

        vim /etc/profile
        export ZOOKEEPER_HOME=/usr/local/zookeeper
        export PATH=$PATH: $JAVA_HOME/bin:$M2_HOM/bin:$SCALA_HOME/bin
                         : $ZOOKEEPER_HOME/bin

刷新环境变量使其生效:Source/etc/profile

(4)配置

进入到Zookeeper安装目录:cd /usr/local/zookeeper

拷贝一份conf目录下的配置文件,重命名为zoo.cfg:cp ./conf/zoo_sample.cfg ./conf/zoo.cfg

编辑配置文件设置关键参数:

        tickTime=2000
        initLimit=5
        syncLimit=3
        dataDir=/data/zookeeper/data
        dataLogDir=/usr/local/zookeeper/logs
        clientPort=2181
        server.1=192.168.1.1:2888:3888
        server.2=192.168.1.2:2888:3888
        server.3=192.168.1.3:2888:3888

关键参数说明:

tickTime:Zookeeper中的基础参考时间,所有与时间相关的设置都为tickTime时间的整数倍,单位是毫秒。

initLimit:Zookeeper Leader与Follower初始连接时,Follower需要从Leader同步最新数据,该值表示Follower同步数据的最大超时时间,一般为整数,表示是tickTime的整数倍时间。

syncLimit:Leader和Follower之间心跳检测的最大超时时间,超过这个时间则认为Follower已经下线。该参数值为整数,表示是tickTime的整数倍时间。

dataDir:Zookeeper持久化数据目录,建议与安装路径不在同一个路径下。

dataLogDir:日志文件目录。

clientPort:监听客户端连接的端口号,默认值为2181。

server.X=A:B:C。其中X是一个数字,表示这是第几号server; A是该server所在的IP地址;B配置该server和集群中的leader交换消息所使用的端口;C配置选举leader时所使用的端口。

(5)创建myid文件

在配置参数dataDir对应的路径下新建myid文件,写入单独的一个数字,表示集群中该实例的编号,该值在集群中是唯一值,不可以重复,数字必须和zoo.cfg配置文件中的server.X中的X一一对应。

(6)启动Zookeeper

        bin/zkServer.sh start

(7)验证安装是否成功

bin/zkServer.sh status(一个leader,两个follower)

或者在Zookeeper安装的任何一个节点执行客户端连接命令:

        bin/zkCli.sh -server 192.168.1.1:2181

1.2.2 Hadoop部署

1. Hadoop简介

Apache Hadoop是由著名的Apache基金会开源的分布式存储计算系统,能够在廉价的硬件上轻松实现高可靠、高扩展、高性能、高容错等特性。通过增加机器即可直线增加集群的存储和计算能力。Hadoop在大规模分布式系统中起着重要的作用,目前已经形成一套完整的Hadoop生态系统,并且在不断发展扩大。随着Hadoop生态系统的不断发展,Hadoop已应用到互联网、大数据交通、智能医疗、气象监测、金融服务、人工智能等众多领域。

HDFS(Hadoop Distributed File System, Hadoop分布式文件系统):通过对文件分块多备份分布式存储的方式保证数据具有高效的容错能力,并且有效提高数据的吞吐量。

MapReduce:应用于规模分布式计算的编程模型,该模型包含Map和Reduce两种编程原语。Map阶段常用于接入数据源,数据划分、过滤、整理等操作。Reduce阶段常用于接收Map阶段的数据,聚合计算,持久化结果数据。

YARN:作业调度和集群资源管理框架。目前已经有很多开源项目部署到YARN上运行,将YARN作为统一的作业调度和资源管理框架,如Spark、HBase、Tez等。

2. Hadoop集群部署

本节主要介绍Hadoop2.6.4版本的Hadoop集群部署。

1.集群规划

为保证集群的高可用能力,NameNode和ResourceManager都采用HA部署方式,各组件详细分布情况如表1-1所示。

表1-1 Hadoop集群规划

2.部署过程

(1)SSH免密码登录

使用root用户登录进入到.ssh目录下

        cd ~/.ssh

执行ssh-keygen -t rsa生成公钥和私钥。系统会一直提示信息,一直按回车就可以。生成私钥文件id_rsa,公钥文件id_rsa.pub,认证文件authorized_keys。

将公钥文件内容追加到认证文件中

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

在免密码登录的机器之间互相拷贝公钥然后追加到认证文件中,即可完成SSH免密码登录配置。

(2)创建hadoop用户和组

        groupadd hadoop
        useradd -m -g hadoophadoop

(3)下载安装包并解压

先安装hadoop01,然后将配置好的安装包拷贝到其他节点。

        wget http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.6.5/hadoop-2.6.5.tar.gz

解压到指定目录/data/soft/下

        tar -zxvf hadoop-2.6.5.tar.gz-C /data/soft/

(4)创建软连接并修改属主为hadoop

创建软连接便于以后升级版本,方便统一管理。

        ln -s /data/soft/ hadoop-2.6.5 /usr/local/hadoop
        chown -R hadoop:hadoop /usr/local/hadoop

(5)设置环境变量

        vim /etc/profile
        export HADOOP_HOME=/usr/local/hadoop
        export PATH=$PATH: $JAVA_HOME/bin:$M2_HOM/bin:$SCALA_HOME/bin
                          : $ZOOKEEPER_HOME/bin:$ HADOOP_HOME/bin

刷新环境变量使其生效

        source /etc/profile

(6)设置配置文件

a)HDFS相关的配置文件core-site.xml和hdfs-site.xml。

core-site.xml配置信息如下:

        <configuration>
            <! -- 指定hdfs的nameservice为ns1 -->
            <property>
                <name>fs.defaultFS</name>
                <value>hdfs://ns1</value>
            </property>
            <! -- 指定hadoop临时目录 -->
            <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hadoop/tmp</value>
            </property>
            <! -- 指定zookeeper地址 -->
            <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop01:2181, hadoop02:2181, hadoop03:2181</value>
            </property>
        </configuration>

hdfs-site.xml配置信息如下:

        <configuration>
            <! --指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
            <property>
                <name>dfs.nameservices</name>
                <value>ns1</value>
            </property>
            <! -- ns1下面有两个NameNode,分别是nn1, nn2 -->
            <property>
                <name>dfs.ha.namenodes.ns1</name>
                <value>nn1, nn2</value>
            </property>
            <! -- nn1的RPC通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.ns1.nn1</name>
            <value>hadoop01:9000</value>
        </property>
        <! -- nn1的http通信地址 -->
        <property>
            <name>dfs.namenode.http-address.ns1.nn1</name>
            <value>hadoop01:50070</value>
        </property>
        <! -- nn2的RPC通信地址 -->
        <property>
            <name>dfs.namenode.rpc-address.ns1.nn2</name>
            <value>hadoop02:9000</value>
        </property>
        <! -- nn2的http通信地址 -->
        <property>
            <name>dfs.namenode.http-address.ns1.nn2</name>
            <value>hadoop02:50070</value>
        </property>
        <! -- 指定NameNode的元数据在JournalNode上的存放位置 -->
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>
                qjournal://hadoop01:8485; hadoop02:8485; hadoop03:8485/ns1
            </value>
        </property>
        <! -- 指定JournalNode在本地磁盘存放数据的位置 -->
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/usr/local/hadoop/journal</value>
        </property>
        <! -- 开启NameNode失败自动切换 -->
        <property>
            <name>dfs.ha.automatic-failover.enabled</name>
            <value>true</value>
        </property>
        <! -- 配置失败自动切换实现方式 -->
        <property>
            <name>dfs.client.failover.proxy.provider.ns1</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha
                    .ConfiguredFailoverProxyProvider
            </value>
        </property>
        <! -- 配置隔离机制 -->
        <property>
            <name>dfs.ha.fencing.methods</name>
            <value>sshfence</value>
        </property>
        <! -- 使用隔离机制时需要ssh免登陆 -->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/root/.ssh/id_rsa</value>
            </property>
            <! --导致DN停止工作的坏硬盘最大数,默认0就是只要有1个硬盘坏了,DN就会shutdown -->
            <property>
                <name>dfs.datanode.failed.volumes.tolerated</name>
                <value>2</value>
            </property>
            <! --Block块副本数为3 -->
            <property>
                <name>dfs.replication</name>
                <value>3</value>
            </property>
            <! -- fsimage和edit文件存储路径-->
            <property>
                <name>dfs.namenode.name.dir</name>
                <value>/data/hadoop/data1/dfs/name</value>
            </property>
            <! -- 数据存储物理路径,可以配置多块盘 -->
            <property>
                <name>dfs.datanode.data.dir</name>
                <value>/data/hadoop/data1/dfs/data, /data/hadoop/data2/dfs/data </value>
            </property>
            <! -- block块大小512M-->
            <property>
                <name>dfs.block.size</name>
                <value>536870912</value>
            </property>
        </configuration>

向slaves文件添加datanode/nodemanager节点的hostname:

        hadoop01
        hadoop02
        hadoop03

b)YARN相关配置文件。

yarn-site.xml配置信息如下:

        <configuration>
            <! -- 开启ResourceManager HA -->
            <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
            </property>
            <! -- 开启ResourceManager失败自动切换 -->
            <property>
                <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
                <value>true</value>
            </property>
            <! --RM失败后正在运行的任务在RM恢复之后重新启动 -->
            <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
            </property>
            <! -- 运行ResourceManager的两个节点 -->
            <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1, rm2</value>
            </property>
            <! -- 当应用程序未指定队列名时,指定用户名作为应用程序所在的队列名 -->
            <property>
                <name>yarn.scheduler.fair.user-as-default-queue</name>
                <value>true</value>
            </property>
            <! -- RM状态信息存储方式 -->
            <property>
                <name>yarn.resourcemanager.store.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery
                    .ZKRMStateStore
                </value>
            </property>
            <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>yarn-ha</value>
            </property>
            <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>rm1</value>
            </property>
            <! -- RM1 HTTP Web访问地址 -->
            <property>
                <name>yarn.resourcemanager.webapp.address.rm1</name>
                <value>${yarn.resourcemanager.hostname.rm1}:8088</value>
            </property>
            <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>rm2</value>
            </property>
            <! -- RM2 HTTP Web访问地址 -->
            <property>
                <name>yarn.resourcemanager.webapp.address.rm2</name>
                <value>${yarn.resourcemanager.hostname.rm2}:8088</value>
            </property>
            <! -- NodeManger节点可使用的总内存大小 -->
            <property>
                <name>yarn.nodemanager.resource.memory-mb</name>
                <value>81920</value>
            </property>
            <! -- NodeManger节点可使用的总vcore数量 -->
            <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>10</value>
            </property>
            <! -- Zookeeper链接地址,为了容错应配置多个-->
            <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>hadoop01:2181, hadoop02:2181, hadoop03:2181</value>
            </property>
            <! -- NM本地任务运行日志存储路径-->
            <property>
                <name>yarn.nodemanager.log-dirs</name>
                <value>file:///data/hadoop/data1/yarn/log
                        ,file:///data/hadoop/data2/yarn/log
                </value>
            </property>
            <! -- ApplicationMaster占用的内存大小-->
            <property>
                <name>yarn.app.mapreduce.am.resource.mb</name>
                <value>2048</value>
            </property>
            <! --单个任务可申请的最少物理内存量-->
            <property>
                <name>yarn.scheduler.minimum-allocation-mb</name>
                <value>1024</value>
            </property>
            <! --单个任务可申请的最多物理内存量-->
            <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>8192</value>
            </property>
            <! --单个任务可申请的最少vcore量-->
            <property>
                <name>yarn.scheduler.minimum-allocation-vcores</name>
                <value>1</value>
            </property>
            <! --单个任务可申请的最多vcore量-->
            <property>
                <name>yarn.scheduler.maximum-allocation-vcores</name>
                <value>10</value>
            </property>
            <! --开启日志聚合到HDFS-->
            <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
            </property>
            <! --聚合日志保存时长,单位秒-->
            <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>259200</value>
            </property>
            <! --聚合日志HDFS存储路径-->
            <property>
                <name>yarn.nodemanager.remote-app-log-dir</name>
                <value>/data/hadoop/yarn-logs</value>
            </property>
            <! -- 使用公平调度器-->
            <property>
                <name>yarn.resourcemanager.scheduler.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair
                    .FairSchedule
                </value>
            </property>
            <! -- 使用公平调度器配置文件路径 -->
            <property>
                <name>yarn.scheduler.fair.allocation.file</name>
                <value>/usr/local/hadoop/etc/hadoop/fair-scheduler.xml</value>
            </property>
        </configuration>

mapred-site.xml配置信息如下:

        <configuration>
            <! --History Server配置 -->
            <property>
                <name>mapreduce.jobhistory.address</name>
                <value>hadoop01:10020</value>
            </property>
            <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>hadoop01:19888</value>
            </property>
            <property>
                <name>mapreduce.jobhistory.joblist.cache.size</name>
                <value>200000</value>
            </property>
            <! --MapReduce作业运行在Yarn上 -->
            <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
            </property>
            <property>
                <name>mapreduce.map.memory.mb</name>
                <value>1024</value>
            </property>
            <property>
                <name>mapreduce.reduce.memory.mb</name>
                <value>8192</value>
            </property>
            <property>
                <name>mapreduce.map.java.opts</name>
                <value>-Xmx1700m -Xms900m</value>
            </property>
            <property>
                <name>mapreduce.reduce.java.opts</name>
                <value>-Xmx7168m -Xms3000m</value>
            </property>
            <property>
                <name>mapreduce.client.submit.file.replication</name>
                <value>20</value>
            </property>
            <! --
                默认情况下是user.name,即每个用户独自一个pool; group.name,即一个linux group
                一个pool, mapred.job.queue.name,即一个queue一个pool。
            -->
            <property>
                <name>mapred.fairscheduler.poolnameproperty</name>
                <value>group.name</value>
            </property>
        </configuration>

fair-scheduler.xml公平调度策略配置信息如下(按组分配不同的内存和vcore资源):

        <allocations>
            <pool name="group1">
            <maxResources>50000 mb,10 vcores</maxResources>
            <maxRunningApps>10</maxRunningApps>
            <weight>1.0</weight>
            <schedulingPolicy>fair</schedulingPolicy>
            </pool>
            <pool name="group1">
            <maxResources>80000 mb, 20 vcores</maxResources>
            <maxRunningApps>20</maxRunningApps>
            <weight>1.0</weight>
            <schedulingPolicy>fair</schedulingPolicy>
            </pool>
            <userMaxAppsDefault>99</userMaxAppsDefault>
            <queuePlacementPolicy>
            <rule name="primaryGroup" create="false" />
            <rule name="secondaryGroupExistingQueue" create="false" />
            <rule name="reject"/>
            </queuePlacementPolicy>
        </allocations>

将配置好的hadoop拷贝到其他节点:

        scp -r /data/soft/hadoop-2.6.5 hadoo02: /data/soft/
        scp -r/data/soft/hadoop-2.6.5 hadoo03: /data/soft/

(7)集群启动

从root用户切换到hadoop用户:

        su - hadoop

启动journalnode(在hadoop01上启动所有journalnode):

        cd /usr/local/hadoop
        sbin/hadoop-daemons.sh start journalnode

jps验证,后台进程增加JournalNode进程。

格式化HDFS:

在hadoop01上执行命令:hadoop namenode -format

格式化后会根据在core-site.xml中的hadoop.tmp.dir配置生成一个文件,拷贝该文件到另外一个NameNode节点hadoop02的/usr/local/hadoop/tmp目录下:

        scp -r /usr/local/hadoop/tmp/ hadoop02:/usr/local/hadoop/

格式化ZK(在hadoop01上执行即可):

        hdfs zkfc -formatZK

启动HDFS(在hadoop01上执行):

        sbin/start-dfs.sh

启动YARN(在hadoop01上执行):

        sbin/start-yarn.sh

Hadoop部署完成后在各个节点中使用jps命令查看各组件进程是否运行正常。如果发现有问题则查看日志进行排查。

(8)可以通过浏览器访问查看

http://192.168.1.1:50070

页面显示:NameNode 'hadoop01:9000' (active)

http://192.168.1.2:50070

页面显示:NameNode 'hadoop02:9000' (standby)

http://192.168.1.1:8088