如何找到每个Spark Partition访问的Kafka分区及其每个微分集的偏移量范围?

时间:2017-09-16 21:47:30

标签: apache-spark apache-kafka spark-streaming

我需要跟踪审计目的,每个Spark任务的详细信息,例如任务运行的工作人员IP,开始和完成的持续时间,读取的Kafka主题分区以及每个处理的偏移量是多少每个微量补丁间隔的任务?

我正在使用Kafka Direct流媒体方法,我知道我可以使用以下代码

OffsetRange[] offsetRanges = ((HasOffsetRanges) consRecordRDD.rdd()).offsetRanges();

我已经使用它来记录驱动程序发生任何故障时的偏移量。

我需要做的是获取每个Spark任务正在访问的Kafka分区的详细信息以及它为每个微量分析器尝试处理的偏移量。

我无法在offsetRanges数组中找到任何Spark Partition / Task Id。

请帮忙。

1 个答案:

答案 0 :(得分:0)

实质上,您可以在执行程序函数中访问TaskContext,它可以为您提供任务ID,阶段ID等信息。

代码示例:

public class MyFunction implements VoidFunction<Iterator<String>> {
    private static Logger log = LoggerFactory.getLogger(MyFunction .class);

public void call(Iterator<String> iterator) throws Exception {
long startTime = System.currentTimeMillis();

TaskContext tc = TaskContext.get();
    int partitionId = TaskContext.getPartitionId()
    long tid = tc.taskAttemptId();
    int sid = tc.stageId();
    while (iterator.hasNext()) {
        // your processing of each message
     }
long endTime = System.currentTimeMillis();
log.info("HOST="{}" STAGE_ID={} TASK_ID={} PARTITION_ID={} ELAPSE_TIME={}",
                getHostName(), sid, tid, partitionId,(endTime-startTime));
   }
    // you can cache the host name 
    private static String hostName;

    public static String getHostName() {

        if (StringUtils.isBlank(hostName)) {
            try {
                hostName = InetAddress.getLocalHost().getHostName();
            } catch (UnknownHostException e) {
                logger.warn("Error occured while getting hostname through IndetAddress. stack={}", e);
                hostName = System.getenv("hostname");// get it from environment
                }
            }
        return hostName;
    }
  }

}

您还可以添加任务完成侦听器。

TaskContext tc = TaskContext.get();
tc.addTaskCompletionListener(new TaskCompletionListener() {

    @Override
    public void onTaskCompletion(TaskContext arg0) {
        // TODO Auto-generated method stub
        long taskId = arg0.taskAttemptId();
        int stageId = arg0.stageId();
    }
});