历史版本的SmartData(3.0.x~3.5.x)服务存在已知缺陷可能会造成缓存数据出现损坏,导致读取数据内容发生异常。本文为您介绍缺陷影响,缺陷方案以及缺陷修复流程。

缺陷影响

  • 缺陷影响的组件:打开SmartData数据缓存功能的所有组件。
    注意 如果集群部署了SmartData,但确定不会使用缓存可以忽略本缺陷。

    SmartData支持JindoFS Cache模式JindoFS Block模式两种缓存模式。

  • 缺陷影响的版本:
    • EMR版本:3.30.x、4.5.x、3.32.x、4.6.x、3.33.x、4.7.x、3.34.x、4.8.x、3.35.x、4.9.x。
    • SmartData版本:3.0.x、3.1.x、3.2.x、3.3.x、3.4.x、3.5.x。
  • 缺陷级别:严重,建议修复,概率性发生时会出现数据正确性问题。
  • 缺陷发生现象:如果集群启用JindoFS Cache模式(即设置数据缓存参数jfs.cache.data-cache.enabletrue)或者使用了JindoFS Block模式(Block模式默认启用缓存),则数据缓存会出现小概率数据污染的情况,从而导致作业读取数据时报错。例如,作业对源数据读取报数据内容不正确的错误(ORC或Parquet文件格式无法解析)或HBase报HFile格式错误等。

缺陷修复方案

由于历史版本缓存损坏问题是由于Storage Service的小文件合并(compaction)流程的缺陷导致,通过修改compaction配置关闭该优化路径并重启SmartData服务,即可避免该问题的产生。如果已发生该问题,优先关闭缓存开关及时止损,以消除缓存数据的影响,尽快恢复线上业务;如果您仅启用了Cache模式,没用使用Block模式,则可以使用工具对集群全部缓存进行全量清理,彻底格式化缓存系统,从而清除集群中所有可能损坏的缓存块,清理完成后可以重新启用缓存。

修复流程

常规修复

如果所在集群尚未发生该问题,则可以通过关闭小文件合并的优化路径,彻底避免该问题。

  1. 在EMR控制台SmartData服务页面,添加自定义配置。
    1. 在SmartData服务的storage配置页,单击自定义配置
      storage
    2. 新增配置项对话框中,添加Key为storage.compaction.enable,Value为false的配置项。
      添加配置项
    3. 单击确定
  2. 重启Jindo Storage Service。
    1. 在SmartData服务页面,选择操作 > 重启Jindo Storage Service
      重启服务
    2. 执行集群操作对话框中,输入执行原因,单击确定
    3. 确认对话框中,单击确定

紧急修复

对于已发生该问题的情况,请按以下步骤及时恢复业务,并进行缓存修复:

  1. 该缺陷是缓存数据损坏导致的,通过关闭缓存可以消除缓存数据的影响。在SmartData服务的client配置页面通过以下配置关闭缓存。
    • 使用Block模式:添加自定义配置项。添加Key为jfs.data-cache.enable,Vlaue为false的配置项。
    • 使用Cache模式:修改参数jfs.cache.data-cache.enable的参数值为false
  2. 重跑相关作业。

    重跑作业后,作业能够恢复正常,如果仍有问题,则可能不是该文档所描述的错误原因,请另行排查问题原因或者提交工单处理。

    Presto、Impala和HBase等常驻服务的计算组件需重启各自的服务组件使上述配置生效。Hive和Spark等On YARN的计算组件直接重跑作业即可生效。

  3. 缓存修复流程。
    • 使用Block模式:提交工单进行组件升级处理。
    • 使用Cache模式:
      说明 因为已经关闭了缓存,所以以下操作不会影响业务。
      1. 在EMR控制台停止SmartData服务。
      2. 将脚本format_cache.sh上传到集群的Master节点,并使用hadoop用户执行以下命令。
        sh format_cache.sh
      3. 在EMR控制台SmartData服务的storage配置页,添加Key为storage.compaction.enable,Value为false的配置项。
      4. 在EMR控制台启动SmartData服务。
      5. 重新打开缓存开关,修改参数jfs.cache.data-cache.enable的参数值为true