使用 AWS Cloudformation 在 Amazon EMR 中一分钟配置 JuiceFS

2021-05-10
魏昌昊, 苏锐

这是一篇使用 JuiceFS 作为 Amazon EMR 存储后端的快速入门文章,JuiceFS 是一个专门为在云端工作而设计的 POSIX 兼容的共享文件系统并且兼容 HDFS。JuiceFS 与自建的 HDFS 相比,可以节省 50% ~ 70% 的成本,同时达到与自建 HDFS接近的性能。

为什么在 Amazon EMR 中使用 JuiceFS?

在 Hadoop 集群中使用 HDFS 是存储计算耦合架构,集群中的每个节点都同时承担计算和存储的职责。在实际业务场景中,数据量的增长通常远远快于计算需求的增长,但是在 Hadoop 存储计算耦合的架构下,扩容必须要求存储和计算同时扩容,自然会带来计算资源利用率的低下。随着存储规模的增大,HDFS 的负载压力越来越高,但又不支持横向扩展,给运维带来很高的复杂度,NameNode 重启、Full GC 等问题会给整个集群带来数十分钟到数小时的不可用,影响业务健康度。

如果将 Hadoop 存储由 HDFS 换成 Amazon S3,在兼容性、一致性、性能、权限管理等方面要一一解决差异。兼容性方面,用户如果想用 EMR 没有内建的计算引擎,可能要自己解决驱动适配的问题;性能方面的下降可能要扩大集群规模;权限管理方式的变化可能要重建整个 ACL 体系。

在 HDFS 和 Amazon S3 之间是否有一个两全其美的方案呢?JuiceFS 正是这样一个低成本弹性伸缩的全托管 HDFS 服务。可以为客户带来和 HDFS 一样的兼容性、一致性和接近的性能,和 Amazon S3 一样的全托管、弹性伸缩、低成本。

什么是 JuiceFS?

JuiceFS 是面向云原生环境设计的分布式文件系统,完全兼容 POSIX 和 HDFS,适用于大数据、机器学习训练、Kubernetes 共享存储、海量数据归档管理场景。支持全球所有公有云服务商,并提供全托管服务,客户无需投入任何运维力量,即刻拥有一个弹性伸缩,并可扩展至 100PB 容量的文件系统。

在下面的这张架构图中可以看出,JuiceFS 已经支持将各种公有云对象存储作为后端数据持久服务,同时也支持了开源对象存储,如 Ceph、MinIO、Swift 等。在 Linux 和 macOS 上提供 FUSE 客户端,在 Windows 系统上也提供原生客户端,都可以将 JuiceFS 的文件系统挂载到系统中,使用体验和本地盘一模一样。在 Hadoop 环境中提供 Java SDK,使用体验和 HDFS 一样。JuiceFS 的元数据服务在所有公有云上都部署了全托管服务,客户不用自己维护任何服务,学习和使用门槛极低。

性能测试

综合性能

TPC-DS 由事务性能管理委员会(TPC)发布,该委员会是目前最知名的数据管理系统评测基准标准化组织。TPC-DS 采用星型、雪花型等多维数据模式。它包含 7 张事实表,17 张纬度表,平均每张表含有 18 列。其工作负载包含 99 个 SQL 查询,覆盖 SQL99 和 2003 的核心部分以及 OLAP。这个测试集包含对大数据集的统计、报表生成、联机查询、数据挖掘等复杂应用,测试用的数据和值是有倾斜的,与真实数据一致。可以说 TPC-DS 是与真实场景非常接近的一个测试集,也是难度较大的一个测试集。

测试环境

  • ningxia (cn-northwest-1) region
  • 1 Master m5.2xlarge 8 vCore, 32 GiB memory, 128 GB EBS storage
  • 3 Core m5d.4xlarge 16 vCore, 64 GiB memory, 600 SSD GB storage
  • emr-6.1.0 Hive 3.1.2, Spark 3.0.0, Tez 0.9.2
  • Juicefs-hadoop-1.0-beta.jar
  • Juicefs专业试用版
  • 使用 500GB TPC-DS 数据集 测试。

JuiceFS 参数

  • juicefs.cache-dir=/mnt*/jfs
  • juicefs.cache-size=10240M
  • juicefs.cache-full-block=false

Hive 测试的结果

由于完整的测试时间比较长,我们选取了部分测试集作为参考。每个测试脚本均执行2次并取两次的平均值作为测试结果。测试耗时时间越短表面结果越好。其中左图为每条测试脚本所花的绝对时间。右图为以 S3 为基准的相对时间。

Hive on Parquet 测试总时间开销:

  • JuiceFS 685.34秒
  • HDFS 615.31秒
  • S3 1887.99秒

JuiceFS 比 S3 速度提升 175%,比 HDFS 慢 11%。

Hive on ORC 测试总时间开销:

  • JuiceFS 789.58秒
  • HDFS 695.25秒
  • S3 1796.34秒

JuiceFS 比 S3 速度提升 127%,比 HDFS 慢 13%。

写入性能

我们通过 Spark 来做数据写入测试,写入 143.2 GB 文本(未分区)格式的数据,具体的 SQL 语句如下:

CREATE TABLE catalog_sales2 AS SELECT * FROM catalog_sales;

Juicedata 与亚马逊云科技联合开发的解决方案通过 AWS CloudFormation 模板可以在 Amazon EMR 中自动配置好可用的 JuiceFS 环境,并且提供一个 TPC-DS Benchmark 测试程序供使用。上述测试结果均使用该解决方案搭建环境。

如何利用 AWS CloudFormation 在 Amazon EMR 中快速使用 JuiceFS

Github 源代码

https://github.com/aws-samples/amazon-emr-with-juicefs/

架构图

注意

  • EMR 集群需要连接到 JuiceFS 元数据服务。它需要一个 NAT 网关来访问公共互联网。
  • EMR 集群的每个节点都需要安装 JuiceFS Hadoop 扩展 JAR 包,才能使用 JuiceFS 作为存储后端。
  • JuiceFS 只存储元数据,原始数据仍然存储在您的账户 S3 中。

部署指南

先决条件

  • 注册 JuiceFS 账户
  • 在 JuiceFS 控制台上创建一个卷。选择你的 AWS 账户区域,并创建一个新卷。请在 “高级选项” 中将 “压缩” 项改为 Uncompressed

注意:JuiceFS 文件系统默认启用 lz4 算法对数据进行压缩。在大数据分析场景中经常使用 ORC 或者 Parquet 等列存文件格式,查询过程中往往只需要读取文件中的一部分,如果启用压缩算法,则必须读取完整 block 解压后才能获得需要的部分,这样会造成读放大。关闭压缩后,则可以直接读取部分数据

  • 从 JuiceFS 控制台获取访问令牌和桶名。

启动 AWS CloudFormation Stack

  • 填写配置项

参数说明

参数名解释
EMRClusterNameEMR 集群名称
MasterInstanceType主节点实例类型
CoreInstanceType核心节点类型
NumberOfCoreInstances核心节点数量
JuiceFSAccessTokenJuiceFS 访问令牌
JuiceFSVolumeNameJuiceFS 存储卷名称
JuiceFSCacheDir本地缓存目录,可以指定多个文件夹,用冒号 : 分隔,也可以使用通配符(比如 * )
JuiceFSCacheSize磁盘缓存容量,单位 MB。如果配置多个目录,这是所有缓存目录的空间总和
JuiceFSCacheFullBlock是否缓存连续读数据,在磁盘空间有限或者磁盘性能低下的时候,设置为 false

启动 CloudFormation Stack 完成部署后可以在 EMR 服务中检查你的集群。

进入硬件选项卡。

找到你的 Master 节点。

通过 AWS Systems Manager Session Manager 会话管理器连接到主节点。

登录到 Master 节点。

接下来验证集群环境。

$ sudo su hadoop
# JFS_VOL 是一个预制的环境变量,指向您所在的JuiceFS存储卷
$ hadoop fs -ls jfs://${JFS_VOL}/     # 别忘了最后一个“斜线”
$ hadoop fs -mkdir jfs://${JFS_VOL}/hello-world
$ hadoop fs -ls jfs://${JFS_VOL}/

运行 TPC-DS 基准测试

  • 通过 AWS Systems Manager Session Manager 会话管理器登录到集群主节点,然后将当前用户改为 hadoop。
$ sudo su hadoop
  • 解压 benchmark-sample.zip。
$ cd && unzip benchmark-sample.zip
  • 运行 TPC-DS 测试。
$ cd benchmark-sample
$ screen -L

# ./emr-benchmark.py 为 benchmark 测试程序
# 它会生成 TPC-DS 基准的测试数据,并执行测试集(从 q1.sql 到 q10.sql)
# 测试会包含一下部分:
# 1. 生成 TXT 测试数据
# 2. 将 TXT 数据转成 Parquet 格式
# 3. 将 TXT 数据转成 Orc 格式
# 4. 执行 Sql 测试用例并统计 Parquet 和 Orc 格式的耗时

# 支持的参数
# --engine                 计算引擎选择 hive 或 spark
# --show-plot-only         只在控制台中显示柱状图
# --cleanup, --no-cleanup  是否在每次测试时清除 benchmark 数据,默认:否
# --gendata, --no-dendata  是否在每次测试时生成数据,默认:是
# --restore                从已有的数据中恢复数据库,此选项需要在 --gendata 打开后才生效
# --scale                  数据集大小(例如:100 代表 100GB 数据)
# --jfs                    打开 uiceFS benchmark 测试
# --s3                     打开 S3 benchmark 测试
# --hdfs                   打开 HDFS benchmark 测试

# 请确保机型有足够的空间存储测试数据,例如:500GB 推荐 Core Node 使用 m5d.4xlarge 或以上
# 关于机型存储空间选择请参考 https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-storage.html
$ ./emr-benchmark.py --scale 500 --engine hive --jfs --hdfs --s3 --no-cleanup --gendata
Enter your S3 bucket name for benchmark. Will create it if it doesn\'t exist: (请输入用来存放s3基准测试的桶名,若不存在则会创建一个新的) xxxx

$ cat tpcds-setup-500-duration.2021-01-01_00-00-00.res # 测试结果
$ cat hive-parquet-500-benchmark.2021-01-01_00-00-00.res # 测试结果
$ cat hive-orc-500-benchmark.2021-01-01_00-00-00.res # 测试结果

# 删除数据
$ hadoop fs -rm -r -f jfs://$JFS_VOL/tmp
$ hadoop fs -rm -r -f s3://<your-s3-bucketname-for-benchmark>/tmp
$ hadoop fs -rm -r -f "hdfs://$(hostname)/tmp/tpcds*"
  • 注意: AWS Systems Manager Session Manager 会话管理器可能会超时导致终端连接断开,建议使用 screen -L 命令讲会话保持在后台 screen 的日志会保存在当前目录下的 screenlog.0
  • 注意:若测试机器一共超过 10vcpu,需要开通 JuiceFS 专业版试用,例如:您有可能会遇到以下错误 juicefs[1234] : register error: Too many connections
  • 样例输出
  • 删除 Stack

结语

通过测试验证可以看到 JuiceFS 确实是弹性伸缩的全托管 HDFS 服务。可以为客户带来和 HDFS 一样的兼容性、一致性和接近的性能,和 Amazon S3 一样的全托管、弹性伸缩、低成本。

本文原载于 https://aws.amazon.com/cn/blogs/china/use-aws-cloudformation-to-configure-juicefs-in-amazon-emr-in-one-minute/