Smartdata 3.4.x之前版本支持JindoOssCommitter,Smartdata 3.4.x及后续版本, 针对OSS Bucket开启多版本功能多情况,增加支持JindoOssDirectCommitter。

背景信息

Job Committer是MapReduce和Spark等分布式计算框架的一个基础组件,用来解决分布式任务写数据的一致性问题。

Jindo Job Committer是阿里云E-MapReduce针对OSS场景开发的高效Job Committer,基于OSS的Multipart Upload接口,支持OSS Filesystem层的定制化。使用Jindo Job Committer时,Task数据直接写到最终目录中,在完成Job Commit前,过程数据对外不可见,彻底避免了Rename操作,同时保证数据的一致性。

注意
  • OSS拷贝数据的性能,针对不同的用户或Bucket会有差异,可能与OSS带宽以及是否开启某些高级特性等因素有关,具体问题可以咨询OSS的技术支持。
  • 在所有任务都完成后,MapReduce Application Master或Spark Driver执行最终的Job Commit操作时,会有一个短暂的时间窗口。时间窗口的大小和文件数量线性相关,可以通过增大fs.oss.committer.threads以提高并发处理的速度。
  • Hive和Presto等没有使用Hadoop的Job Committer。
  • E-MapReduce集群中已默认打开Jindo Oss Committer的参数。

在MapReduce中使用JindoOssCommitter

  1. 进入YARN服务的mapred-site页签。
    1. 登录阿里云E-MapReduce控制台
    2. 在顶部菜单栏处,根据实际情况选择地域和资源组
    3. 单击上方的集群管理页签。
    4. 集群管理页面,单击相应集群所在行的详情
    5. 在左侧导航栏中,选择集群服务 > YARN
    6. 单击配置页签。
    7. 服务配置区域,单击mapred-site页签。
  2. 针对Hadoop不同版本,在YARN服务中配置以下参数。
    • Hadoop 2.x版本

      在YARN服务的mapred-site页签,设置mapreduce.outputcommitter.classcom.aliyun.emr.fs.oss.commit.JindoOssCommitter

    • Hadoop 3.x版本

      在YARN服务的mapred-site页签,设置mapreduce.outputcommitter.factory.scheme.osscom.aliyun.emr.fs.oss.commit.JindoOssCommitterFactory

  3. 保存配置。
    1. 单击右上角的保存
    2. 确认修改对话框中,输入执行原因,开启自动更新配置
    3. 单击确定
  4. 进入SmartData服务的smartdata-site页面。
    1. 在左侧导航栏中,选择集群服务 > SmartData
    2. 单击配置页签。
    3. 服务配置区域,单击smartdata-site页签。
  5. 在SmartData服务的smartdata-site页签,设置fs.oss.committer.magic.enabledtrue
  6. 保存配置。
    1. 单击右上角的保存
    2. 确认修改对话框中,输入执行原因,开启自动更新配置
    3. 单击确定
说明 在设置mapreduce.outputcommitter.classcom.aliyun.emr.fs.oss.commit.JindoOssCommitter后,可以通过开关fs.oss.committer.magic.enabled便捷地控制所使用的Job Committer。当打开时,MapReduce任务会使用无需Rename操作的Jindo Oss Magic Committer,当关闭时,JindoOssCommitter和FileOutputCommitter行为一样。

在Spark中使用JindoOssCommitter

  1. 进入Spark服务的spark-defaults页面。
    1. 在左侧导航栏单击集群服务 > Spark
    2. 单击配置页签。
    3. 服务配置区域,单击spark-defaults页签。
  2. 在Spark服务的spark-defaults页面,配置以下参数。
    参数 描述
    spark.sql.sources.outputCommitterClass com.aliyun.emr.fs.oss.commit.JindoOssCommitter

    写入数据至Spark DataSource表的Job Committer。

    spark.sql.parquet.output.committer.class com.aliyun.emr.fs.oss.commit.JindoOssCommitter

    写入数据至Spark Parquet格式的DataSource表的Job Committer。

    spark.sql.hive.outputCommitterClass com.aliyun.emr.fs.oss.commit.JindoOssCommitter

    写入数据至Hive表的Job Committer。

  3. 保存配置。
    1. 单击右上角的保存
    2. 确认修改对话框中,输入执行原因,开启自动更新配置
    3. 单击确定
  4. 进入SmartData服务的smartdata-site页签。
    1. 在左侧导航栏单击集群服务 > SmartData
    2. 单击配置页签。
    3. 服务配置区域,单击smartdata-site页签。
  5. 在SmartData服务的smartdata-site页签,设置fs.oss.committer.magic.enabledtrue
    说明 您可以通过开关fs.oss.committer.magic.enabled便捷地控制所使用的Job Committer。当打开时,Spark任务会使用无需Rename操作的Jindo Oss Magic Committer,当关闭时,JindoOssCommitter和FileOutputCommitter行为一样。
  6. 保存配置。
    1. 单击右上角的保存
    2. 确认修改对话框中,输入执行原因,开启自动更新配置
    3. 单击确定

优化JindoOssCommitter性能

当MapReduce或Spark任务写大量文件的时候,您可以调整MapReduce Application Master或Spark Driver中并发执行Commit相关任务的线程数量,以提升Job Commit性能。在数据湖场景下,可以通过开启 OSS 的多版本功能进行数据保护,防止数据勿删等情况的发生。

  1. 进入SmartData服务的smartdata-site页面。
    1. 在左侧导航栏中,选择集群服务 > SmartData
    2. 单击配置页签。
    3. 服务配置区域,单击smartdata-site页签。
  2. 在SmartData服务的smartdata-site页面,设置fs.oss.committer.threads8
    默认值为8。
  3. 保存配置。
    1. 单击右上角的保存
    2. 确认修改对话框中,输入执行原因,开启自动更新配置
    3. 单击确定

优化Jindo Oss Magic Committer性能

在数据湖场景下,您可以通过开启OSS的多版本功能来保护数据,防止数据勿删等情况。在OSS Bucket开启多版本的情况下,如果在相同目录下频繁执行创建和删除操作,会降低目录List性能。因此,在SmartData 3.4.0版本优化了Jindo Oss Magic Committer性能,对于临时目录和文件,会连同历史版本一起删除,避免冗余的临时目录影响List性能。使用Jindo Oss Magic Committer时,默认开启临时目录历史版本清理功能。

如果需要关闭自动清理功能,您可以在作业中设置fs.jfs.cache.oss.delete-marker.dirs为空字符,或者在SmartData服务的smartdata-site页面,修改fs.jfs.cache.oss.delete-marker.dirs temporary,.staging,.hive-staging,__magic

使用JindoOssDirectCommitter

对于开启多版本的Bucket,可以使用JindoOssDirectCommitter,避免产生临时文件,直接输出到目标目录。您可以修改Committer的配置为com.aliyun.emr.fs.oss.commit.direct.JindoOssDirectCommitter,以使用JindoOssDirectCommitter。

根据您的需求修改对应的配置,以开启JindoOssDirectCommitter功能。
  • 如果是YARN服务,您可以在mapred-site页面,修改mapreduce.outputcommitter.classcom.aliyun.emr.fs.oss.commit.direct.JindoOssDirectCommitter
  • 如果是Spark服务,您可以在spark-default页面,修改如下参数。
    参数 描述
    mapreduce.outputcommitter.class 修改为com.aliyun.emr.fs.oss.commit.direct.JindoOssDirectCommitter
    spark.sql.parquet.output.committer.class 修改为com.aliyun.emr.fs.oss.commit.direct.JindoOssDirectCommitter
    spark.sql.hive.outputCommitterClass 修改为com.aliyun.emr.fs.oss.commit.direct.JindoOssDirectCommitter
    spark.sql.sources.outputCommitterClass 修改为com.aliyun.emr.fs.oss.commit.direct.JindoOssDirectCommitter