美文网首页
Spark CommitCoordinator 保证数据一致性

Spark CommitCoordinator 保证数据一致性

作者: Entry_1 | 来源:发表于2019-07-10 14:04 被阅读0次

    本文引用了技术世界文章,来自:http://www.jasongj.com/spark/committer/

    问题引入

    • Spark 输出数据到HDFS时,多个task同时写数据到HDFS,如何保证数据的一致性
    • 如果打开了speculation ,两个相同的task实例写相同的数据到HDFS,如何保证只有一个commit成功
    • 几十万的task,如何高效管理文件

    【 三个重要目录 】

    • ${output.dir.root}
    • ${appAttempt} application attempt ID ,从0开始
    • ${taskAttempt} task attempt ID, 从0开始

    写入目录:

    ${output.dir.root}/_temporary/${appAttempt}/_temporary/${taskAttempt}/${fileName}
    

    写入步骤:

    • 1检查是否需要commit
      需要commit && 开启了commit coordinator
         commit coordinator检查是否可以commit:
          - 若该taskAttempt为失败的attempt,直接拒绝
          - 若该taskAttempt成功,且commit coordinator未允许过其该task的其他attempt的commit请求,则允许
          - 若该taskAttempt之前已经被同意过,则commit coordinator会继续同意
          - 若该taskAttempt成功,但已经有其他该task的attempt被授权commit了,则拒绝该attempt的commit请求
      不需要commit(则拒绝写入)
    
    • 2 rename重命名
      判断mapreduce.fileoutputcommiter.algorithm.version
    该值为1时
    task commitTask 会将 ${output.dir.root}/_temporary/${appAttempt}/_temporary/${taskAttempt} 目录重命名为${output.dir.root}/_temporary/${appAttempt}/${taskAttempt}
    
    该值为2时
    task commitTask 会将 ${output.dir.root}/_temporary/${appAttempt}/_temporary/${taskAttempt} 内所有文件移动到${output.dir.root}
    
    • 3 整个job的commit
      判断mapreduce.fileoutputcommiter.algorithm.version
    该值为1,则遍历${output.dir.root}/_temporary/${appAttempt}/${taskAttempt},并将所有文件移动到${output.dir.root}
    该值为2,无需移动
    
    • 4 清理
      Driver 清理_temporary的内容

    相关文章

      网友评论

          本文标题:Spark CommitCoordinator 保证数据一致性

          本文链接:https://www.haomeiwen.com/subject/bhickctx.html