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

时间:2015-09-08 17:26:25

标签: 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

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 |

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>

问题

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

    如果

    ,计算此类统计信息的最佳方式是什么?
    1. Hadoop保证通过作业完成,即使

      ,也会执行一次计数器更新
      1. 相应的任务重新启动
      2. 启用推测执行
    2. Hadoop计数器are not intended用于统计。

    3. 关于Spark,

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

0 个答案:

没有答案