Hadoop计数器与Spark累加器(或者从hadoop mr和spark应用程序收集统计信息的最佳方式)

szh*_*hem 7 hadoop mapreduce apache-spark

我想了解在标准hadoop map-reduce和spark中收集作业执行统计数据的最佳实践是什么.

特定

1. hdfs中的许多文件(每个导演,即dataset1,dataset2等,是来自第3点的数据集的名称)

/user/tester/dataset1/part-0000*.avro
/user/tester/dataset2/part-0000*.avro
/user/tester/dataset3/part-0000*.avro
/user/tester/dataset4/part-0000*.avro
Run Code Online (Sandbox Code Playgroud)

2.每个文件包含一个具有~1000个属性的avro记录

| id | attr_1  | attr_2  | attr_3  | ... | attr_N  |
----------------------------------------------------
| 1  | val_1_1 | val_1_2 | val_1_3 | ... | val_1_N |
| 2  | val_2_1 | val_2_2 | val_2_3 | ... | val_2_N |
| 3  | val_M_1 | val_M_2 | val_M_3 | ....| val_M_N |
Run Code Online (Sandbox Code Playgroud)

3.有一个配置文件,其中包含哪些属性/列以及从哪个数据集中获取以及如何过滤出给定数据集的信息

<datasets>
    <dataset>
        <id>dataset1</id>
        <attributes>
            <attribute>attr_1</attribute>
            <attribute>attr_3</attribute>
        </attributes>
        <filter>attr_1 gt 50 and attr_3 eq 100</filter>
    </dataset>
    <dataset>
        <id>dataset2</id>
        <attributes>
            <attribute>attr_2</attribute>
            <attribute>attr_5</attribute>
            <attribute>attr_8</attribute>
        </attributes>
        <filter>attr_2 gteq 71</filter>
    </dataset>
    ...
</datasets>
Run Code Online (Sandbox Code Playgroud)

问题

  1. 过滤所有数据集并根据第2点的配置获得必要的属性,然后按属性id对数据集进行分组,并将结果数据集保存到文件中(此处的实现非常清楚).
  2. 在作业结束时,确定从每个数据集读取的记录总数
  3. 在作业结束时,确定每个数据集中的过滤记录数
  4. 在作业结束时,根据点2的配置确定每个数据集中每个非空属性发生的次数.
  5. 在作业结束时,确定最终数据集中每个非空属性发生的次数.

所以

如果计算此类统计数据的最佳方法是什么?

  1. Hadoop保证,即使工作完成,计数器的更新也会执行一次

    1. 相应的任务重新启动
    2. 推测执行已启用
  2. Hadoop计数器用于统计信息.

  3. 关于Spark,

    1. 仅在操作内执行累加器更新,并且Spark保证每个任务对累加器的更新仅应用一次,即重新启动的任务不会更新该值.
    2. 在转换中,用户应该知道,如果重新执行任务或作业阶段,每个任务的更新可能会被多次应用?