如何制作一个AWS EMR客户端节点( Client Node / Edge Node / Gateway Node )

1. 为什么需要EMR客户端节点?

对于AWS EMR不提供专职的客户端节点( Edge Node / Gateway Node )一事,作为一名架构师,我持保留意见。个人认为这并不明智,其客观上削弱了EMR的易用性。尽管云计算的“处世哲学”认为:计算与存储应该是分离的,这使得计算资源变成动态可调节的“非永久性”资源,因此有一种思想认为:对于离线的分析型计算而言,可以不必再维持一个“永久”的计算集群,而是在使用时开启,结束时关闭,只要数据被S3这类的存储服务保存下来即可(我们得承认这是很美好一个愿景,但是现实中有太多场景是不适用于这种模式的)。

也许是延续了这样的哲学,EMR的集群配置似乎在极力地凸显这一理念,EMR没有集群管理控制台(我指的是类似于Cloud Manager和Ambari一类的产品),没有专职客户端节点。它似乎在向使用它的用户传达这样一个声音:“我”不需要客户端,也不需要控制台,是你们看待我的方式不对。

从实际的应用需求来看,EMR的这一定位有些过于理想化,对用户也不够友好,只要我们搜索一下就会发现,有很多基于Spark/Hadoop的第三方产品都会在官方博客中教用户如何把部署了他们产品的服务器改造为一个EMR的Edge Node,以便于可以在这台服务器上提交Spark/Hadoop作业。

客户端节点对于绝大多数企业用户的集群是必不可少的,企业用户的数据应用繁多,且在应用的客户端这一侧也往往有不小的负载,多个应用叠加对服务器的性能提出了较高的要求,所以集群不但需要配备客户端节点,而且还往往不止一台。

话讲到这里就可以了,我们步入正题,本文我们将介绍如何创建一个EMR集群的客户端节点,并且会提供一个开箱即用的脚本帮助你一键完成这项工作。在此之前,我们有必要了解一下创建客户端节点的思路。

2. 制作EMR客户端节点几种思路

制作EMR客户端节点一般有这样几种思路:

  1. 最简单暴力的方式是通过镜像克隆一个Master或Worker节点,这一方法是最简单的,但是会有一些不好的地方,首先,很多时候要被改造为客户端的服务器是往往是一台已经存在的第三方服务器,这一方法会直接出局。其次,通过这种hacking的做法创建的客户端是否会介入集群在某些时候参与了Master或Worker才会做的事情是不确定的,需要进行验证。所以最好不要使用这种方式
  2. 网上较为常见的是这样一种做法,就是拷贝Master节点上相关组件的安装程序和配置文件到客户端节点,这一方式也是比较简单易行的,但是却有一个小bug:那就是通过这方式获得的客户端,所有工具的命令行(如hdfs,hive, spark-shell等等)都不会添加到PATH变量中,也不会通过alternative注册快捷方式,这就变得非常麻烦了。
  3. 为了修补方法2的漏洞,实际上我们可以这样做:不要拷贝组件的安装文件,而是通过yum安装它们,安装完成后再从Master节点拷贝配置文件,这样就可以既通过正常安装获得或有命令行的快捷方式,同时又完成了客户端的配置,可以说是两全其美的方案,本文我们使用的正是这一方案。

3. 客户端安装脚本介绍

接下就介绍一下我们提供的这个客户端安装脚本吧,其在Github上的地址是:https://github.com/bluishglc/emr-edgenode-maker.git

检出后需要先给shell文件make-emr-edge-node.sh添加可执行属性:

chmod a+x make-emr-edge-node.sh

然后可以通过help选项查看使用方式:

sudo ./make-emr-edge-node.sh help

==================  [ MAKE EMR EDGE NODE SCRIPTS ] USAGE  ==================

# 说明:初始化(只需执行一次), 安装基础软件包,emr基础app, 配置emr repo, 创建hadoop用户, 创建必要文件夹
./make-emr-edge-node.sh init [PEM_FILE_PATH] [MASTER_NODE_IP]

# 说明:制作hadoop客户端
./make-emr-edge-node.sh make-hadoop-client [PEM_FILE_PATH] [MASTER_NODE_IP]

# 说明:制作spark客户端
./make-emr-edge-node.sh make-spark-client [PEM_FILE_PATH] [MASTER_NODE_IP]

# 说明:制作hive客户端
./make-emr-edge-node.sh make-hive-client [PEM_FILE_PATH] [MASTER_NODE_IP]

# 说明:制作hbase客户端
./make-emr-edge-node.sh make-hbase-client [PEM_FILE_PATH] [MASTER_NODE_IP]

# 说明:制作oozie客户端
./make-emr-edge-node.sh make-oozie-client [PEM_FILE_PATH] [MASTER_NODE_IP]

# 说明:制作hudi客户端
./make-emr-edge-node.sh make-hudi-client

# 说明:制作sqoop客户端
./make-emr-edge-node.sh make-sqoop-client

关于脚本的使用方式,如下几点需要注意:

  1. 由于脚本中大量操作需要使用root权限,所以必须以root用户或sudo方式运行脚本,否则脚本会给出错误提示
  2. 命令行中只涉及两个参数:
  • [PEM_FILE_PATH] :你的AWS账号的PEM文件,执行脚本需要使用该秘钥文件登入Master节点拷贝配置文件;
  • [MASTER_NODE_IP]:你的Master节点IP或域名
  1. 在执行make-*-client操作前,需要先执行init操作(仅一次即可)

下面是对脚本各个操作的详细解读。

4. 必要的初始化工作

在一个干净的新实例上安装EMR各种组件的客户端之前,我们需要先完成如下必备的初始化操作:

  1. 从Master节点拷贝emr-apps.repo文件,以便可以在本地通过yum安装emr的各类组件
  2. 安装emr的基础组件:emrfs emr-ddb emr-goodies emr-kinesis emr-s3-select emr-scripts,最好不要使用emr-*来指代这些安装包,因为这会安装一些不需要的,但是会以服务形式运行的包,例如emr-notebook
  3. 创建hadoop用户。这一操作还是很有必要的,原因在于EMR集群会在所有节点上创建这一账户,同时在HDFS上也会为其创建home目录,以hadoop用户执行各种客户端不会出现权限问题,同时能让当前的节点最大化地“像是”集群中的一员。
  4. 创建一些有可能会用到的文件夹,如/mnt/s3等
  5. 安装OpenJDK,同时配置JAVA_HOME变量

以上所有操作都封装在了init函数中,只须执行:

./make-emr-edge-node.sh init [PEM_FILE_PATH] [MASTER_NODE_IP]

即可完成上述初始化工作。

5. 安装客户端

每个客户端的安装都是三步曲:安装->同步配置文件->创建日志文件夹并分配权限。注意,在安装各种客户端时,安装程序会自动创建各种用户,并不需要我们在脚本中创建诸如hdfs,yarn一类的用户。

我们以典型的spark客户端的安装为例来讲解一下,负责这项工作的函数实现如下:

makeSparkClient() {
  pemFile="$1"
  masterNode="$2"
  yum -y install spark-core spark-python spark-datanucleus
  rsync -avz --delete -e "ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=10 -i $pemFile" hadoop@$masterNode:'/etc/spark/conf/*' /etc/spark/conf
  echo "spark.hadoop.yarn.timeline-service.enabled false" | tee -a /etc/spark/conf/spark-defaults.conf
  mkdir -p /var/log/spark/user
  chmod 777 -R /var/log/spark/user
}

第4行是安装spark相关的软件包,第5行使用rsync命令从Master节点同步/etc/spark/conf下的文件到本地对应位置上。第7、8两行是在创建日志文件夹并赋予可写权限,因为命令行启动过程中和启动后须要向指定文件夹中写日志,如果文件夹不存在或没有文件写权限,命令行就会报错。赋予完全的写权限是为了让任何用户都可以执行命令行。

关于创建日志文件夹并赋予写权限一事,不同组件的安装包做法会不太一样,例如hadoop的安装包会自动完成这项工作,但spark和hbase就不会,需要在脚本中完成这些操作。如果你要添加脚本中不存在的新客户端时,需要在安装组件时留意日志文件和权限问题,根据情况在脚本中补全相关操作。

此外,由于Hadoop/Spark的各服务之间存在一定的依赖关系,虽然理论上这种依赖关系不会作用的客户端上,但在安装时最好还是注意一下安装顺序,通常hadoop-client总应该是第一个被安装的组件。

关于作者:耿立超,架构师,14年IT系统开发和架构经验,对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验,热衷函数式编程。目前负责企业数据中台的架构设计和开发工作,对Hadoop/Spark 生态系统有深入和广泛的了解,参与过Hadoop商业发行版的开发,曾带领团队建设过数个完备的企业数据平台,个人技术博客:https://laurence.blog.csdn.net/ 作者著有《大数据平台架构与原型实现:数据中台建设实战》一书,该书已在京东和当当上线:

京东购书链接:https://item.jd.com/12677623.html
当当购书链接:http://product.dangdang.com/28974965.html

扫描图中二维码了解详情↓↓

在这里插入图片描述

bluishglc CSDN认证博客专家 CSDN博客专家
架构师,CSDN博客专家,14年IT系统开发和架构经验,对大数据、企业级应用架构、SaaS、分布式存储和领域驱动设计有丰富的实践经验。对Hadoop/Spark 生态系统有深入和广泛的研究,参与过Hadoop商业发行版的开发,目前负责企业数据中台的架构设计和开发工作,热衷函数式编程,著有《大数据平台架构与原型实现:数据中台建设实战》https://item.jd.com/12677623.html 一书。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页