最近更新时间:2023.05.17 15:07:35
首次发布时间:2022.10.21 16:47:29
Proton 是火山引擎 E-MapReduce(EMR)团队推出的,针对存算分离场景提供的加速引擎,其深度优化的 TOS 访问能力和 JobCommitter 功能,可极大地提升作业的执行效率。
Hadoop 大数据组件(包括 Hive、Spark、Yarn、HBase、 Presto/Trino 等)总体上是基于 HDFS 标准 API,来访问底层的分布式文件系统的。事实上,自建 HDFS 集群相比火山引擎对象存储服务(TOS)有一些明显的不足:
HDFS 集群对存储资源使用多,对计算资源使用少。用户一般会将计算组件和 HDFS 组件混合部署在同一批节点上,达到充分复用存储和计算资源的目的,但这会使集群的存储能力和计算能力深度耦合。
举例来说,某业务拥有1PB的数据,而一周才跑一次离线计算,采用自建 Hadoop 混部意味着用户需要为这1PB数据支付昂贵的计算资源费用。采用存算分离模式,用户只需支付1PB数据的存储费用和少量计算资源费用即可,大大减少成本开支。
用户需要为 HDFS 集群提前预留空闲存储空间(例如预留30%左右的闲置空间供未来使用),而火山引擎 TOS 是按需付费,用户不需要为预留存储资源付费。
开源版本的 HDFS 冷数据存储(HDFS Erasure Coding)能力,使用和维护门槛较高,维护冷数据到自建 HDFS 集群对运维人员的挑战较大。而火山引擎对象存储服务的冷数据存储能力经历公司内外部场景磨炼,相对成熟。根据 TOS 定价文档可以看出,冷归档存储容量费用(即冷数据存储)相比标准存储容量费用单价低很多。因此,对于低频访问的大体量冷数据,用户可借助云上 TOS 冷数据存储能力大幅降低存储成本。
TOS 对象存储服务在给 Hadoop 大数据用户带来诸多便利和成本优化的同时,同样存在一些挑战:
TOS 对象存储的 Rename (包括目录和文件)比较耗时。
TOS 对象存储的 List 操作相对 HDFS 比较耗时。
火山引擎 EMR 内置的 Proton 服务比较好地解决了上述问题,使得用户可以很方便地将 Hadoop 大数据生态平滑地从自建 HDFS 集群迁移到云上 TOS 对象存储服务。下面将为您介绍 Proton 的几个核心功能:
在火山引擎 EMR 产品上,用户创建集群之后,默认无需配置,即可直接访问 TOS 对象存储服务。
针对大数据分析场景,深度定制优化 TOS 访问。在离线场景下,采用 Proton 存算分离的读写性能基本上可以做到和自建 HDFS 性能持平。
Proton 提供了深度优化的 Job Commiter 功能。使得常见分析引擎(Hive、Spark、Presto/Trino) 导入 TOS 对象存储服务的性能相比开源方案提升1倍。
当前最新版本为 1.2.2,关于更多版本信息,请查看:Proton 发行版本
Proton 目前支持 Hadoop MR、Hive、Spark、Flink 四种引擎类型,关于每种引擎如何配置,请参考链接文档:
Hadoop: Hadoop 使用 Proton 文档
Hive: Hive 使用 Proton 文档
Spark: Spark 使用 Proton 文档
Flink: Flink 使用 Proton 文档
Proton 提供了丰富的参数方便用户进行自主调优。对于 EMR 集群,用户可以在 EMR 集群控制台 > 集群详情 > HDFS 服务参数中进行配置,配置文件为 core-site.xml
。如果是用户自建集群,可以在 core-site.xml
进行自主配置。
参数名 | 参数值 | 说明 |
---|---|---|
fs.tos.http.maxConnections | 1024 | TOS Client 连接池的最大连接数,默认1024。 |
fs.tos.http.idleConnectionTimeMills | 60000 | TOS Client 连接池中空闲 HTTP 最长连接时间,默认60000 (单位:毫秒) |
fs.tos.http.connectTimeoutMills | 10000 | TOS Client 建立连接超时时间,默认10000(单位:毫秒)。 |
fs.tos.http.readTimeoutMills | 30000 | TOS Client 读超时时间,默认30000(单位:毫秒) |
fs.tos.http.writeTimeoutMills | 30000 | TOS Client 写超时时间,默认30000(单位:毫秒) |
fs.tos.http.enableVerifySSL | true | TOS Client 是否开启 SSL 证书检验,默认为 true |
fs.tos.http.dnsCacheTimeMinutes | 0 | TOS Client DNS 缓存有效期,小于等于 0 表示关闭 DNS 缓存,默认为0 |
fs.tos.request.max.retry.times | 20 | 访问出错重试次数,包括限流,默认值20,如果数据量大,且带宽较小,请保持一个较大的参数值。 |
fs.tos.client.disable.cache | false | 是否禁用 tos client cache,默认为 false,如果需要确保每一次发起 tos 的访问,都使用完全全新的 client,可配置成 true,禁用 cache |
fs.tos.multipart.size | 5242880 | MPU 分片大小,默认 5242880 (单位:字节),即5MB。 |
fs.tos.multipart.threshold | 10485760 | 文件上传时,当文件大小大于该阈值时,才会走 MPU,否则走 PUT,默认10485760 (单位:字节),即 10MB。 |
fs.tos.multipart.copy-threshold | 5242880 | 文件重命名时,当文件大小大于该阈值时,才会走 UploadPartCopy 接口,否则就走 CopyObject 接口。默认 5242880 (单位:字节),即5MB。 |
fs.tos.task.thread-pool-size | 当前机器 CPU 数量 | 要求正整数,表示用于执行 task(如并发 copy 文件)的线程池线程数量。 |
fs.tos.multipart.thread-pool-size | 当前机器 CPU 数量 | 要求正整数,表示用于异步上传 TOS 数据分片的线程池线程数量。 |
fs.tos.list.batch-size | 1000 | 要求正整数,表示每次调用 TOS Client list object 的最大个数,默认1000。 |
fs.job.committer.summary.report.directory | 无 | 当设置有值时,会将 Job Committer commit job 时每个环节的日志写到指定的目录下,用于分析定位问题。样例:tos://test-bucket/report-dir。 |
fs.job.committer.threads | 当前机器 CPU 数量 | 要求正整数,表示用于指定 commit 任务的线程池大小。 |