当前位置: 代码迷 >> 综合 >> 基于Spark的交互式大数据预处理系统设计与实现(四) 集群搭建
  详细解决方案

基于Spark的交互式大数据预处理系统设计与实现(四) 集群搭建

热度:37   发布时间:2023-10-19 11:12:51.0

第4章 集群搭建

 集群搭建概述

在大数据背景下,像传统技术那样启用单台计算节点去存储运算显然不行。在可预见的未来,单台计算机的运算力及相关硬件条件发展速度已经远远被数据增长速度甩在身后,不得不承认摩尔定律在计算机硬件条件上现已不再适用。于是计算机引入了多核设计,多线程设计,既然在单个节点运算上无法胜任,那就以量取胜吧。同样的,随着分布式技术的提出,计算机集群的运用随之而生。面对如此海量的数据,将其离散存储在多个计算机节点上,分散存储也即意味着可分散计算处理数据。

此处的分布式集群作为非去中心化集群,故而有一个中心处理节点,其作为服务集群leader对外执行服务,而用户并不知道自己的请求是被一个集群处理的,即集群分布式模型对于用户来说是透明的。并且基于数据安全性与访问效率的考虑,集群本身集成了数据分块存储与备份,多个数据块分散在不同节点上进而提供了数据的并行访问[]。Google实现了其分布式文件系统GFS,而后HDFS作为GFS的开源实现在业界大放异彩。然而凡事没有完美,在HDFS的优良特性下同样有着缺憾,尤其在其单NameNode限制,仅有一个命名空间,在海量的数据请求下将会受限于单台机器(NameNode)的运算力,并且在极端条件下存储大量的小文件将会造成文件树的异常庞大而维护困难(引入了har文件,此外HDFS文件块大小须根据实际情况合理配置),进而一定程度上限制了存储能力的横向扩展,同样的若NameNode宕机将造成整个集群文件系统的瘫痪;故而在此引入了Zookeeper集群来搭建HA(High Availability)集群,如HDFS、Spark的HA机制,同样的Kafka的消息传递在本系统中亦需要依赖于Zookeeper集群。虽说在理论上HDFS可运行在具有Java虚拟机的所有平台上,但作为一个开发者肯定是希望自己的程序运行在稳定没有各种环境配置问题的系统之上不是吗;故而在此选择CentOS作为基础运行依托,借助CentOS的优良特性可以很好的满足本系统需求[]。基本的存储运行平台有了,本系统的主角(Spark)集群搭建自然而然。

除了上述HDFS、Zookeeper、Spark等几个主要集群软件安装配置外,基本软件如Java8、Mysql、SecureCRT、Kafka等工具的安装同样必不可少。下文将列出主要的几个软件集群的安装配置,环境的准确搭建运行是本系统的前提、基础。

  CentOS系统基本运行平台集群搭建

在此采用CentOS6.7及VMware虚拟机搭建本地虚拟机集群。因本地资源有限,整个集群由三台CentOS节点构成,并且各个节点采用精简化安装(未安装图形界面及相关普适软件服务)。

集群资源分配情况及相关环境配置如下:节点1(hostname:chdp01,下同)分配2G运行内存,节点2(chdp02)、节点3(chdp03)皆分配1G运行内存,三个节点统一分配20G磁盘内存。集群采用NAT虚拟网络配置,在此虚拟机使用VMNet8网卡,为了保证Win10宿主机能够与集群通信,需要将集群网段与宿主机设置在同一网段;为了能让集群节点与外网通信,需设置各节点Dns为虚拟机Vmware网关。在此需要注意的是:由于在集群搭建过程中不太可能一个个节点去慢慢按步骤安装,为了提高效率在此先安装好一个节点并做好相关基础配置后直接克隆该虚拟机节点,克隆得到的新节点需要在虚拟机上为其创建新的虚拟网卡而后设置新的Ip。

集群初建完成后为了有更好的使用体验,我们一般会使用终端仿真程序连接到集群,在此采用secureCRT。由于secureCRT使用的是SSH的22端口,故而需要预先在集群开启该端口或直接关闭防火墙(在此关闭了防火墙)。集群搭建完成后整个集群就相当于组成了一个局域网。为在后续集群操作中快速方便的安装软件或服务,为之搭建了基于局域网的Yum源仓库,该仓库包含Centos配备的常用软件仓库。Yum源搭建可以基于Ftp服务或Http服务,本系统Yum源采用的是基于Http进行搭建并且服务器节点为chdp01。为了更方便的在集群节点间通信,还可以在各节点间配置免密登录,另外配置DNS映射会有更好的使用体验。

在集群搭建的过程中会由于不同的环境遇到各种不同的问题,上述也仅是几个主要软件的安装配置;为了更好的运用Centos集群进行后续的开发,还可以安装使用Expect工具,SSH文件传输工具,自行编写Shell脚本进行集群任务批量处理等。总之Linux家族的活跃为我们提供了许多的工具服务,由此获得更好的开发运用体验。

  Zookeeper集群搭建

在此安装Zookeeper主要是因为后续Kafka消息传递及HA机制搭建的需要。基于上述原因本系统在三台节点上安装了Zookeeper并由此构成一个Zookeeper集群,本系统使用版本为3.4.6。

在上传基本Zookeeper压缩包解压后配置zookeeper.cfg(拷贝自模板文件后自命名)文件,主要修改zk(Zookeeper,以下简称zk)文件存放目录、端口(默认2181)、zk节点地址等。和上述centOs安装一样,在一个节点上做好相关配置后将整个软件目录发送到其他节点即可。考虑到实际节点较多(如100台)的情况下不可能一台一台的将文件发送过去,在此为批量发送文件到所有节点编写了一个批量发送文件shell脚本程序。代码如下:

#copy file to datanodesNodes=2NO=0//process every node one by onefor ((i=0;i<Nodes;i++))dolet NO=102+i//main process node is chdp01, address:192.168.33.101,other node: 192.168.33.k(k=101+N)echo "transmit file to 192.168.33.$NO:$1"//transmit file or directory to dist nodescp -r $1 192.168.33.$NO:$2done

此外为了更方便的启动Zookeeper集群编写了批量启动脚本,代码如下:

NO=1TOTAL=3for (( NO=1 ; NO<=TOTAL ;NO=NO+1))doecho "       starting zkServer on chdp0$NO..."ssh chdp0$NO "source /etc/profile ; /usr/SOFT/zookeeper-3.4.6/bin/zkServer.sh start"done#sleep 3 seconds for a exact statussleep(3000)for (( NO=1 ; NO<=TOTAL ;NO=NO+1))doecho "             checking status on chdp0$NO..."ssh chdp0$NO "source /etc/profile ; /usr/SOFT/zookeeper-3.4.6/bin/zkServer.sh status"done

在linux开发中不免需要开发定制自己需要的脚本,在本系统开发中亦是如此。就如上述zk批量启动脚本在此将其命名为zks-start.sh,而后利用chmod命令赋予其文件执行权限。所有自主开发的脚本放到同一目录下方便管理,此外亦可将存放自制脚本的目录加入系统路径下,如此就可以像运用系统命令一样的去执行自己开发的脚本命令了。

 Hadoop集群搭建

HDFS作为一个分布式文件存储系统,顾名思义还是基于集群的搭建。由于Hadoop需要基于Java虚拟机运行,故而Jdk环境是必须的,本系统采用的是Jdk1.8,hadoop2.6。Hadoop的安装里包含了对Hdfs的安装。由于本系统后期可能会用到Spark On Yarn进行资源调度以及Mapreduce的学习实验,故而把Yarn也一并配置。

将Hadoop2.6安装包上传到集群主节点(chdp01)解压缩后进行以下一系列环境配置:

  1. 配置修改hadoop-env.sh文件引入JAVA_HOME路径。
  2. 修改core-site.xml文件设置NameNode节点地址及hadoop运行时临时文件存储目录。
  3. hdfs-site.xml中配置namenode与datanode文件存放目录、hdfs文件存储副本数、hdfs文件块大小、secondarynamenode节点地址等。本系统将文件冗余存储份数设为默认值3,hdfs文件块为128MB(hadoop2.x默认为128MB),secondnamenode与namenode配置在同一节点(chdp01,生产环境不会这样配置)。
  4. yarn-site.xml中设置主节点地址。
  5. slaves文件中列出每个datanode的地址,此处作为hdfs启动时查找datanode节点的依据配置文件。
  6. mapred-site.xml中设置mapreduce与yarn调度。

经过上述操作,一个基本的HDFS集群及yarn调度就已经配置好了。需要注意的是在上述第3个步骤中:namenode配置的文件目录作为HDFS集群metadata元数据存储位置,datanode配置的文件目录为hdfs数据存储位置,两处均须要配置在一个安全的目录中(如不能放在/tmp文件夹下);此外在本系统中secondarynamenode作为HDFS集群数据备份与操作同步的重要角色,实际上出于数据安全性考虑是不建议与namenode放在同一节点的;hdfs文件备份数与文件块大小都应该根据实际运用场景需求去配置,对重要的数据做多个备份以提高数据安全性,对不重要的数据场景设置少一些甚至不做重复存储备份以节约存储空间资源。完成基本的安装配置后可以使用start-dfs.sh脚本来启动hdfs集群,亦可以使用start-all.sh来启动HDFS及Yarn集群服务。

Spark集群搭建

Spark在此同样是集群安装配置,需要注意的是Spark版本需要与Hadoop版本相匹配。有了基本依托环境之后再将Spark2.1上传到集群解压缩对spark-env.sh作如下配置,如master设置,端口设置,JAVA_HOME引入等。部分主要配置代码如下:

export JAVA_HOME=/usr/SOFT/jdk1.8export SPARK_MASTER_IP=chdp01#export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=chdp01,chdp02,chdp03 -Dspark.deploy.zookeeper.dir=/spark"export SPARK_MASTER_PORT=7077

需要注意的是在配置高可用Spark集群情况下需要将SPARK_MASTER_IP配置注释掉,并将上面描述代码SPARK_DAEMON_JAVA_OPTS行去除注释(本系统在后续开发试验环境中虽然配置了但并未开启Spark高可用,故而是上述配置代码),同样的在Spark安装中亦需要在slaves文件中设置Spark子节点(worker)。此处Java版本最好为1.8及以上(本系统安装的是java8,这个版本新增的lambda表达式在函数式编程里虽不及scala的原生态,但还是提供了许多其他的可用之处)。完成上述基本配置后可以使用start-all.sh来开启Spark服务,需要注意的是由于Spark程序需要上传到hdfs系统中执行,故而在将spark任务提交到集群中运行时需要预先开启HDFS集群服务。集群任务提交示例脚本如下:

/usr/SOFT/spark2.1/bin/spark-submit//set adress and port(default) of master--master spark://chdp01:7077//set executor memory in every worker node--executor-memory 512mb//set needed number of cpu in this cluster--total-executor-cores 3//spark task entrance class and address of running jar--class common.SparkTool  /root/mySpark.jar此外还可以运用sparkshell命令行进行实时交互操作,执行脚本如下:/usr/SOFT/spark2.1/bin/spark-shell--master spark://chdp01:7077--executor-memory 512g--total-executor-cores 2

具体解释释见代码注释,需要注意的是在执行Sparkshell的节点上需要有Spark Client程序或直接安装有Spark。

  相关解决方案