我需要跟踪审计目的,每个Spark任务的详细信息,例如任务运行的工作人员IP,开始和完成的持续时间,读取的Kafka主题分区以及每个处理的偏移量是多少每个微量补丁间隔的任务?
我正在使用Kafka Direct流媒体方法,我知道我可以使用以下代码
OffsetRange[] offsetRanges = ((HasOffsetRanges) consRecordRDD.rdd()).offsetRanges();
我已经使用它来记录驱动程序发生任何故障时的偏移量。
我需要做的是获取每个Spark任务正在访问的Kafka分区的详细信息以及它为每个微量分析器尝试处理的偏移量。
我无法在offsetRanges数组中找到任何Spark Partition / Task Id。
请帮忙。
答案 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();
}
});