- 存储
- 分布式文件系统
- 缓存
- 大数据
【免费下载链接】alluxio
Alluxio, data orchestration for analytics and machine learning in the cloud
本文是一份面向云原生数据工程师的实操指南,围绕当前仓库中 docs/en/cloud/AWS-EMR.md 的核心流程,完整讲解如何在 AWS EMR 集群上通过 bootstrap 脚本安装、配置并启动 Alluxio,将其作为 S3、GCS、Azure Blob Store 甚至本地 HDFS 之上的数据编排层,并演示用 Presto/Hive 基于 AWS Glue 元数据服务创建与查询表。阅读本文后,你将掌握aws emr create-cluster的完整参数组合、alluxio-emr.sh引导脚本的全部选项语义,以及集群内部验证与调优的具体方法。
Overview:为什么要在 EMR 上运行 Alluxio
AWS EMR(Elastic MapReduce)提供按需创建计算集群的能力,用于承载各类分析工作负载,并统一托管 Hadoop 生态多个服务的部署,同时通过 bootstrap action 与配置分类(classification)向这些服务注入定制项。
在 EMR 之上叠加 Alluxio 的价值在于:在 EMRFS 已经提供的 S3 访问能力之上,Alluxio 还能带来缓存带来的性能收益,并且让计算负载可以同时访问本地机房存储或其他云厂商的对象存储(如 GCS、Azure Blob Store),实现真正的数据编排(data orchestration)。也就是说,Alluxio 充当了 EMR 计算集群与异构底层存储之间的统一命名空间。
该场景的落地依赖仓库中两个真实文件:
- 引导脚本 integration/emr/alluxio-emr.sh:负责下载安装 Alluxio、注入配置、暴露 client jar 给 Spark/Presto/Hive/Tez/Hadoop,并启动 Alluxio 集群;
- 配置模板 integration/emr/alluxio-emr.json:通过 EMR 的 configurations 参数,预先设置 Hive、Presto 连接 AWS Glue 元数据服务所需的分类配置。
Prerequisites:部署前需要准备的环境
根据原文档,开始之前需要具备以下条件:
- 一个具备 AWS 账户访问权限的账号;
- 带有默认 EMR 角色的 IAM 账户(EMR 服务运行时所需的默认角色,见下文 Basic Setup 中的
create-default-roles); - 用于 SSH 登录 EC2 实例的密钥对(Key Pair);
- 一个 S3 Bucket,它同时承担两个角色:Alluxio 的根底层文件系统(root UFS),以及存放 bootstrap 脚本的位置;
- 配置好 AWS access key id 和 secret access key 的 AWS CLI。
大多数前置条件都可以通过 AWS 官方 EMR Getting Started 文档完成。如果不想用 S3 作为根 UFS,也可以将根 UFS 配置为 HDFS 或任何其他受支持的底层存储(仓库脚本对hdfs://根路径有专门处理,详见下文 Customization 的-v选项)。
关于机型选型,原文档给出如下建议:
- Alluxio Master:推荐
r5.4xlarge或r5.8xlarge; - Alluxio Worker:推荐
r5d.4xlarge或r5d.8xlarge,这类机型自带 SSD,可配合 bootstrap 脚本的-n参数将 NVMe 磁盘配置为 Alluxio 的存储层(tier 0)。
Basic Setup:从零拉起一个带 Alluxio 的 EMR 集群
1. 创建 EMR 所需的默认 IAM 角色
打开终端,使用 AWS CLI 在账户中创建 EMR 服务所需的标准 IAM 角色:
$ aws emr create-default-roles该命令会创建 EMR 运行所依赖的默认服务角色与实例角色,是后续create-cluster能够成功执行的前提。
2. 使用 bootstrap action 执行 create-cluster 命令
aws emr create-cluster需要传多个标志位才能成功执行,各标志含义如下:
--release-label:要安装的 EMR 版本。当前仓库对应的 Alluxio 版本为2.10.0-SNAPSHOT(见仓库根 pom.xml 与 integration/emr/alluxio-emr.sh 中的ALLUXIO_VERSION),原文档示例中与之配套的兼容 EMR 版本为emr-5.25.0。--instance-count:为集群配置的节点数量。--instance-type:节点实例类型。注意账户在每个 region 可启动的实例数量有限制,需在 EC2 控制台检查实例配额;适合起步的实例类型是r4.4xlarge。--applications:指定Name=Spark Name=Presto Name=Hive引导安装这三个附加服务。--name:EMR 集群名称。--bootstrap-actions:Path:bootstrap 脚本的 S3 路径,需放在公开可读的 bucket 中,形如s3://alluxio-public/emr/<版本号>/alluxio-emr.sh;Args:传给 bootstrap 脚本的参数,其中:- 第一个参数是必填的根 UFS URI。该 S3 URI 指定 Alluxio 文件系统的根挂载点,格式为
s3://bucket-name/mount-point,mount point 应是一个文件夹; - 用
-d标志指定公开可访问的 Alluxio 发行包 tarball 地址,例如https://downloads.alluxio.io/downloads/files/<版本号>/alluxio-<版本号>-bin.tar.gz; - 还可以通过
-p传入以分隔符连接的多组key=value形式的 Alluxio 属性,例如alluxio.user.file.writetype.default=CACHE_THROUGH让 Alluxio 同步写入底层存储系统。关于写入类型的更多说明,可参考 docs/en/overview/Architecture.md 中 Data Flow Write 一节。
- 第一个参数是必填的根 UFS URI。该 S3 URI 指定 Alluxio 文件系统的根挂载点,格式为
--configurations:配置 JSON 文件的路径,同样托管在公开可读的 S3 bucket(如https://s3.amazonaws.com/alluxio-public/emr/<版本号>/alluxio-emr.json);也可以先下载该 JSON 文件,再提供本地路径,如file:///path/to/alluxio-emr.json。仓库中对应的真实模板即 integration/emr/alluxio-emr.json。--ec2-attributes:EC2 相关设置,最重要的是用于连接集群的密钥对名称(KeyName)。
下面是一份完整的示例命令(格式针对bash解释器设计):
$ aws emr create-cluster \ --release-label emr-5.25.0 \ --instance-count 3 \ --instance-type r4.4xlarge \ --applications Name=Spark Name=Presto Name=Hive \ --name try-alluxio \ --bootstrap-actions \ Path=s3://alluxio-public/emr/<版本号>/alluxio-emr.sh,\ Args=[s3://myBucketName/mountPointFolder,\ -d,"https://downloads.alluxio.io/downloads/files/<版本号>/alluxio-<版本号>-bin.tar.gz",\ -p,"alluxio.user.block.size.bytes.default=122M|alluxio.user.file.writetype.default=CACHE_THROUGH",\ -s,"|"] \ --configurations https://alluxio-public.s3.amazonaws.com/emr/<版本号>/alluxio-emr.json \ --ec2-attributes KeyName=myKeyPairName其中:
s3://myBucketName/mountPointFolder需要替换为你的 AWS 账户可读写的 S3 URI;myKeyPairName需要替换为你自己的 EC2 密钥对名称。
值得说明的是,示例命令中没有指定安全组,因此 EMR 会自动为集群创建安全组,但该自动创建的安全组默认不允许入站 SSH(详见下一步)。
3. SSH 登录 EMR 集群的 master 节点
登录 EMR 控制台。当集群进入Waiting状态后,点击集群详情获取Master public DNS(如果可用),或点击Hardware标签页查看 master 与 worker 的详细信息:
点击 master 实例组即可看到其公网 DNS:
使用前面create-cluster命令中提供的密钥对 SSH 登录 master 实例,用户名使用hadoop:
$ ssh -i /path/to/keypair.pem hadoop@<masterPublicDns>需要注意:如果此前没有在create-cluster中指定安全组,EMR 自动创建的安全组不会配置入站 SSH 规则。为了让上述 SSH 命令可用,需要在 EC2 控制台编辑ElasticMapReduce-master安全组,为端口 22 添加入站规则,来源设为0.0.0.0/0。
4. 验证 Alluxio 是否正常运行
进入 master 实例后,运行以下命令执行一系列基本读写测试,确认 Alluxio 能正常读写文件:
$ sudo runuser -l alluxio -c "/opt/alluxio/bin/alluxio runTests"这里的runTests命令在仓库中由 shell/src/main/java/alluxio/cli/TestRunner.java 实现,它会基于BasicOperations等测试套件,对不同文件路径组合、readType/writeType组合执行实际的文件读写与校验(参见该文件runTests()与new BasicOperations(filePath, readType, writeType, fsContext, workerAddress)的调用),是确认集群数据面健康的快捷手段。
5. 集群初始化细节:脚本到底做了什么
使用该 bootstrap 脚本后,默认行为如下:
- Alluxio 默认安装在
/opt/alluxio/; - Hive 和 Presto 已预先配置好连接 Alluxio;
- 集群默认使用 AWS Glue 作为 Presto 与 Hive 的元数据库,这允许你在多次运行 Alluxio 集群之间保留表定义;
- 默认情况下,Alluxio worker 会分配实例最大可用内存的三分之一。
这些行为都可以在 integration/emr/alluxio-emr.sh 中找到源码级印证:
ALLUXIO_HOME="/opt/alluxio"(第 18 行)与emr_install_alluxio()的安装逻辑(第 137-166 行)对应“安装在 /opt/alluxio”;get_default_mem_size()(第 93-98 行)以mem_div=3计算系统内存的 1/3,随后configure_alluxio_worker_storage_properties()(第 322-342 行)将其写入alluxio.worker.tieredstore.level0.dirs.quota,对应“worker 分配 1/3 内存”;- 脚本还自动生成了
alluxio.master.journal.type=UFS、alluxio.master.mount.table.root.ufs=<root_ufs_uri>、alluxio.master.security.impersonation.hive/presto/yarn.users=*、alluxio.security.authorization.permission.enabled=false等一组通用属性(见configure_alluxio_general_properties(),第 348-368 行),这些属性键均可在 core/common/src/main/java/alluxio/conf/PropertyKey.java 中找到定义(如MASTER_JOURNAL_TYPE、MASTER_MOUNT_TABLE_ROOT_UFS、USER_FILE_WRITE_TYPE_DEFAULT等)。
此外,脚本的expose_alluxio_client_jar()(第 282-292 行)会把alluxio-client.jar软链到 Spark、Presto、Tez、Hadoop 各自的 jar 目录,这正是“Hive/Presto 已配置好连接 Alluxio”的底层机制;而 integration/emr/alluxio-emr.json 则通过hive-site分类指定com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory,通过presto-connector-hive分类指定hive.metastore=glue,对应“默认使用 AWS Glue 作为元数据库”。
Creating a Table:在 Alluxio 上建表并用 Presto/Hive 查询
使用 EMR + Alluxio 最简单的实践路径,是在 Alluxio 上创建一张表,并用 Presto/Hive 查询它。整体流程如下。
1. SSH 登录 master 节点
从你的终端,使用create-cluster命令中提供的密钥对 SSH 登录 master 实例:
$ ssh -i /path/to/keypair.pem hadoop@<masterPublicDns>注意我们以hadoop用户身份连接。后续所有命令都假设在实例内部执行。
2. 在 Alluxio 中创建目录作为表的外部位置
在 Alluxio 中创建/testTable目录,并将hadoop用户设为目录属主。注意以下命令是以alluxio用户身份执行的:
$ sudo runuser -l alluxio -c "/opt/alluxio/bin/alluxio fs mkdir /testTable" $ sudo runuser -l alluxio -c "/opt/alluxio/bin/alluxio fs chown hadoop:hadoop /testTable"3. 在 AWS Glue 中创建新数据库
打开 Hive CLI:
$ hive创建数据库,然后可以在 Glue 控制台确认数据库已创建:
CREATE DATABASE glue;使用刚创建的数据库并定义一张表:
USE glue; create external table test1 (userid INT, age INT, gender CHAR(1), occupation STRING, zipcode STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LOCATION 'alluxio:///testTable';注意这里的关键设计:表的LOCATION指向alluxio:///testTable,即表数据实际落在 Alluxio 命名空间下,底层对应之前配置的 S3 根 UFS。外部表(external table)意味着删除表不会删除 Alluxio 中的数据文件,便于数据与元数据解耦。
退出 Hive CLI:
$ exit;4. 创建 Presto 所需的 /tmp 目录
与前面类似,在 Alluxio 中创建/tmp目录,并将其权限设为777:
$ sudo runuser -l alluxio -c "/opt/alluxio/bin/alluxio fs mkdir /tmp" $ sudo runuser -l alluxio -c "/opt/alluxio/bin/alluxio fs chmod 777 /tmp"Presto 执行中间结果会用到/tmp,权限必须放开,否则查询可能因无法写入临时目录而失败。
5. 使用 Presto 与表交互
打开 Presto CLI,指定hive作为 catalog:
$ presto-cli --catalog hive使用之前创建的数据库并插入数据:
USE glue; INSERT INTO test1 VALUES (1, 24, 'F', 'Developer', '12345');用 SELECT 读回表中全部数据:
SELECT * FROM test1;如果一切配置正确,你会看到插入的那行数据被成功读回。整个读写链路为:Presto → Hive connector(Alluxio client)→ Alluxio Worker(缓存/内存层)→ S3 根 UFS,写入类型默认继承 bootstrap 脚本设置的ASYNC_THROUGH(异步写穿),在提升写入吞吐的同时保证数据最终持久化到底层存储。
Customization:bootstrap 脚本与集群调优
Alluxio 属性的调优可以在多个位置完成。根据需要对哪个服务调优,EMR 提供了不同的修改服务设置/环境变量的途径。仓库脚本 integration/emr/alluxio-emr.sh 中print_help()函数(第 410-496 行)完整保留了脚本的用法说明,这里原样整理如下。
Bootstrap 脚本的完整用法
Usage: alluxio-emr.sh <root-ufs-uri> [-b <backup_uri>] [-c] [-d <alluxio_download_uri>] [-f <file_uri>] [-i <journal_backup_uri>] [-l <sync_list>] [-n <storage percentage>] [-p <delimited_properties>] [-s <delimiter>] [-v <hdfs_version>] alluxio-emr.sh is a script which can be used to bootstrap an AWS EMR cluster with Alluxio. It can download and install Alluxio as well as add properties specified as arguments to the script. By default, if the environment this script executes in does not already contain an Alluxio install at ${ALLUXIO_HOME} then it will download, untar, and configure the environment at ${ALLUXIO_HOME}. If an install already exists at ${ALLUXIO_HOME}, nothing will be installed over it, even if -d is specified. If a different Alluxio version is desired, see the -d option.各参数语义如下表:
| 参数 | 含义 |
|---|---|
<root-ufs-uri> | (必填)Alluxio 命名空间中根 UFS 的 URI。如果传入字符串"LOCAL",则使用 EMR 自带的 HDFS 根作为根 UFS。 |
-b <backup_uri> | 一个s3://URI,EMR 集群关闭时 Alluxio master 会向其写入备份。备份与上传必须在 60 秒内完成;若超时,可能上传不完整的 journal。该选项不推荐用于生产或关键业务场景(这些场景依赖备份在宕机后恢复集群状态)。脚本对应实现是register_backup_on_shutdown()(第 109-131 行),它会在 EMR 的 shutdown-actions 目录下注册alluxio-backup.sh,先执行alluxio fsadmin backup --local再用aws s3 cp上传。 |
-c | 只安装 alluxio client jars(用于纯客户端接入场景)。 |
-d <alluxio_download_uri> | 指向 Alluxio tarball 的s3://或http(s)://URI。脚本会下载并解压 tarball,若${ALLUXIO_HOME}处尚不存在安装则安装 Alluxio。对应实现见emr_install_alluxio()(第 137-166 行)。 |
-f <file_uri> | 任意远程文件的s3://或http(s)://URI,可多次指定。每个指定文件都会被下载并以同名存储到${ALLUXIO_HOME}/conf/。对应实现见download_user_files()(第 262-279 行)。 |
-i <journal_backup_uri> | 之前某次 Alluxio journal 备份的s3://或http(s)://URI。若提供,备份会被下载,Alluxio 启动时 master 会读取并恢复该备份。脚本中通过alluxio-start.sh -a master -i <backup>传入(第 708-717 行)。 |
-l <sync_list> | 包含分隔符连接的 Alluxio 路径列表。将为这些路径启用主动同步(active sync),UFS 元数据会周期性地与 Alluxio 命名空间同步。默认分隔符是分号;;如需不同分隔符,使用-s参数。脚本会逐个执行alluxio fs startSync(第 727-732 行)。 |
-n <storage percentage> | 自动为 Alluxio worker 配置 NVMe 存储作为 tier 0(而非 MEM)。指定时脚本会尝试定位已挂载的 NVMe 存储位置并配置给 Alluxio。参数是一个 1 到 100 之间的整数,表示每块磁盘分配给 Alluxio 的百分比。对应实现见configure_nvme()(第 205-253 行),它扫描挂载在/mnt*的 NVMe 设备,并写入alluxio.worker.tieredstore.level0.alias=SSD、level0.dirs.path、level0.dirs.quota等属性。 |
-p <delimited_properties> | 一个包含分隔符连接的属性集,会被追加到${ALLUXIO_HOME}/conf/alluxio-site.properties文件。默认分隔符是分号;;如需不同分隔符,使用-s参数。对应实现见set_custom_alluxio_properties()(第 298-316 行)与set_alluxio_property()(第 74-88 行),后者会先检查属性是否已存在:存在则sed替换,不存在则追加。 |
-s <delimiter> | 单个字符,指定-p属性集与-l同步列表中使用的分隔符。 |
-v <hdfs_version> | 用作根 UFS 的 HDFS 版本号。当根 UFS 是 HDFS 时必填(脚本第 580-583 行会校验:根为hdfs://且未提供-v时直接报错退出)。 |
Alluxio 服务:三种配置注入方式
对 Alluxio 服务的配置修改可以通过 bootstrap 脚本以几种不同方式完成:
-p标志:允许传入一组分隔的 key-value 属性,应用到所有 Alluxio 节点。适合临时覆盖少量属性;-f标志 +alluxio-site.properties:通过-f传入一个名为alluxio-site.properties的自定义文件。bootstrap 会确保覆盖用户提供的配置,同时保留未被覆盖的默认值。注意脚本在注入自定义属性前会先写入# BEGIN AUTO-GENERATED PROPERTIES/# END AUTO-GENERATED PROPERTIES标记块(第 654-660 行),自动生成属性与用户属性分区清晰,便于排查;- 安装旧版本:bootstrap 还允许通过指定下载 URL(仅支持 HTTP 或 S3)安装旧版本的 Alluxio(>= 2.0)。如果没有通过
-d指定且${ALLUXIO_HOME}不存在,脚本会使用内置的ALLUXIO_DOWNLOAD_URL(当前仓库版本为2.10.0-SNAPSHOT对应的下载地址)。
当根 UFS 为 HDFS 时,脚本还会通过configure_alluxio_hdfs_root_mount()(第 375-399 行)额外设置alluxio.master.mount.table.root.option.alluxio.underfs.version,并优先使用通过-f下载到${ALLUXIO_HOME}/conf/下的core-site.xml与hdfs-site.xml覆盖 EMR 默认的/etc/hadoop/conf配置。
Alluxio client:按服务区分属性注入位置
通用的客户端侧属性也可以像上面那样通过 bootstrap 脚本编辑,这主要面向原生客户端(CLI)。而对于 Presto/Hive 这类具体服务的属性修改,应在 EMR JSON 配置文件的对应分类(section)中进行,即core-site.xml或hive.catalog等分类。仓库的 integration/emr/alluxio-emr.json 就是这种做法的范例:它通过hive-site、presto-connector-hive、hadoop-env三个分类分别注入 Glue metastore 工厂类、Presto 的 Glue/S3 文件系统设置,以及将alluxio-client.jar前置到HADOOP_CLASSPATH。
另外需要留意的是,脚本对 Presto 的接入做了版本适配(第 665-701 行):对于 EMR 5.28/5.29(PrestoDB 0.227-0.231)会启用 Alluxio 自带的hive-alluxioconnector;对于 EMR 5.30+ 或 6.x(PrestoDB >= 0.232)则直接复用 PrestoDB 内置的hive-hadoop2connector,并在/etc/presto/conf/catalog/catalog_alluxio.properties中写入hive.metastore=alluxio与hive.metastore.alluxio.master.address=<master>:19998,让 Presto 直连 Alluxio master 的 19998 端口。
小结与进一步阅读
至此,你已经走通了“创建 IAM 角色 →create-cluster携带 bootstrap action 与 configurations → SSH 验证 → Alluxio 上建表 → Presto/Hive 查询 → 按需调优”的完整链路。核心要点回顾:
- 根 UFS 是第一参数:
alluxio-emr.sh的第一个必填参数决定 Alluxio 命名空间的根挂载,可为 S3 URI 或LOCAL(回退到 EMR HDFS),HDFS 根时需配合-v指定版本; - 配置注入分三条路:
-p注入属性、-f注入alluxio-site.properties等配置文件、--configurations注入服务级分类配置; - 默认即联通的生态:脚本自动把 client jar 暴露给 Spark/Presto/Tez/Hadoop,EMR JSON 配置把 Hive/Presto 指向 AWS Glue 元数据服务,集群起来后即可直接建表查询。
想要深入理解文中涉及的机制,可以在本仓库中继续阅读:
- 引导脚本完整实现:integration/emr/alluxio-emr.sh;
- EMR 配置分类模板:integration/emr/alluxio-emr.json;
runTests测试运行器:shell/src/main/java/alluxio/cli/TestRunner.java;- 写入类型(
CACHE_THROUGH/ASYNC_THROUGH/MUST_CACHE)语义:docs/en/overview/Architecture.md; - 相关配置键定义:core/common/src/main/java/alluxio/conf/PropertyKey.java。
前提说明:本文示例命令中的 EMR 版本(
emr-5.25.0)与 Alluxio 版本号来自当前仓库及原文档的快照,实际使用时请以你所安装的 Alluxio 发行版配套的 EMR 版本和下载 URL 为准。
- 存储
- 分布式文件系统
- 缓存
- 大数据
【免费下载链接】alluxio
Alluxio, data orchestration for analytics and machine learning in the cloud
相关推荐
Alluxio与Presto集成完整指南:5步实现查询性能翻倍 🚀
Alluxio与Presto集成完整指南:5步实现查询性能翻倍 🚀 Alluxio作为云原生数据编排平台,与Presto分布式SQL查询引擎的深度集成能够显著
存储分布式文件系统缓存大数据Alluxio与Spark/Presto集成:加速结构化数据分析的最佳实践
Alluxio与Spark/Presto集成:加速结构化数据分析的最佳实践 引言:数据湖分析的性能困境与解决方案 你是否正面临这些挑战?Spark查询云存储时因
存储分布式文件系统缓存大数据Presto Hive Connector 完全指南:Hive 数仓数据接入、Metastore 缓存与 S3/Azure/Alluxio 集成实战
Presto Hive Connector 完全指南:Hive 数仓数据接入、Metastore 缓存与 S3/Azure/Alluxio 集成实战 导读 本文
大数据数据库后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考