我可以看到,我的小型应用程序有4个作业,总运行时间为20.2秒,但是作业1和2之间存在很大的延迟,导致总时间超过一分钟。 SparkHadoopMapReduceWriter.scala中的作业号1 runJob:88 正在将一堆HFile执行到HBase表中。这是我用来加载文件的代码
<Reference>
如果有人有任何想法,我会非常感激
答案 0 :(得分:1)
减少Hbase中输出表的区域数量,这将减少第二个作业的任务数量。
TableOutputFormat根据Hbase中给定表的区域数确定拆分
答案 1 :(得分:1)
SparkHadoopMapReduceWriter.scala中的作业号1 runJob:88正在执行bulkupload
这不是真的。这项工作只会产生HBase 之外的HFile。您在此作业与下一作业之间看到的差距可以通过bulkLoader.doBulkLoad
处的实际批量加载来解释。此操作仅涉及元数据转移,并且通常执行速度更快(根据我的经验),因此您应该检查驱动程序日志以查看它挂起的位置。
答案 2 :(得分:0)
我可以看到作业1中有26个任务基于创建的hfiles数量。即使作业2显示在2s内完成,也需要一些时间将这些文件复制到目标位置,这就是你在作业2和3之间得到延迟的原因。这可以通过减少作业1中的任务数来避免。 / p>
答案 3 :(得分:0)
感谢您的输入人员,我降低了在任务0中创建的HFile数量。这使滞后减少了大约20%。我用了
HFileOutputFormat2.configureIncrementalLoad(job, tab, tab.getRegionLocator)
自动计算reduce任务的数量,以匹配表的当前区域数。我会说我们正在使用AWS EMR中的S3支持的HBase而不是传统的HDFS。我现在要调查这是否会导致滞后。