正如您所看到的,我的小应用程序有4个作业,总运行时间为20.2秒,但是在作业1和作业2之间有一个很大的延迟,导致总时间超过一分钟。作业编号1在sparkhadoopmapreducewriter运行作业。scala:88 is 正在将hfiles批量上载到hbase表中。这是我用来加载文件的代码
val outputDir = new Path(HBaseUtils.getHFilesStorageLocation(resolvedTableName))
val job = Job.getInstance(hBaseConf)
job.getConfiguration.set(TableOutputFormat.OUTPUT_TABLE, resolvedTableName)
job.setOutputFormatClass(classOf[HFileOutputFormat2])
job.setMapOutputKeyClass(classOf[ImmutableBytesWritable])
job.setMapOutputValueClass(classOf[KeyValue])
val connection = ConnectionFactory.createConnection(job.getConfiguration)
val hBaseAdmin = connection.getAdmin
val table = TableName.valueOf(Bytes.toBytes(resolvedTableName))
val tab = connection.getTable(table).asInstanceOf[HTable]
val bulkLoader = new LoadIncrementalHFiles(job.getConfiguration)
preBulkUploadCallback.map(callback => callback())
bulkLoader.doBulkLoad(outputDir, hBaseAdmin, tab, tab.getRegionLocator)
如果有人有什么想法,我会非常感激的
4条答案
按热度按时间mm5n2pyu1#
我可以看到作业1中有26个任务,这是基于创建的hfiles的数量。即使作业2显示在2秒内完成,将这些文件复制到目标位置也需要一些时间,这就是为什么作业2和作业3之间会出现延迟的原因。这可以通过减少作业1中的任务数来避免。
6rqinv9w2#
感谢你们的支持,我降低了任务0中创建的hfiles的数量。这使滞后降低了20%左右。我曾经
它会自动计算reduce任务数,以匹配表的当前区域数。我要说的是,我们使用的是aws emr中由s3支持的hbase,而不是传统的hdfs。我现在要调查这是否会导致延迟。
owfi6suc3#
作业编号1在sparkhadoopmapreducewriter运行作业。scala:88 is 执行批量上载
这不完全正确。此作业仅在hbase之外创建hfiles。你看到的这项工作和下一项工作之间的差距可以解释为实际批量装载在现场
bulkLoader.doBulkLoad
. 这个操作只涉及元数据传输,通常执行得更快(根据我的经验),所以您应该检查驱动程序日志以查看它挂起的位置。tmb3ates4#
减少hbase中输出表的区域数,这将减少第二个作业的任务数。
tableoutputformat根据hbase中给定表的区域数确定拆分