加快风暴拓扑

时间:2018-12-25 08:47:36

标签: hive apache-storm topology bolt spout

我们有一个将csv文件从HDFS移到Hive的应用程序。我们正在为该过程使用风暴拓扑。

已使用8台计算机。它们每个都有22个内核和512 GB RAM。但是,我们的代码运行得很慢。传输600万数据需要10分钟。

60 MB的文件中的10 MB将在一秒钟内传输到HDFS。我们正在尝试优化代码,但是很明显,我们做错了什么。

对于Hive表,我们有64个存储桶。

在我们的拓扑中,我们有1个喷口和2个螺栓。基本上,我们的Spout会获取CSV文件,并向负责分析数据的第一个Bolt发射行,然后向负责HDFS进程的第二个Bolt发射行。

HDFS喷口;

HdfsSpout hdfsSpout = new HdfsSpout()
    .withOutputFields(TextFileReader.defaultFields)
    .setReaderType("text")
    .setHdfsUri(hdfsUri)
    .setSourceDir("/data/in")
    .setArchiveDir("/data/done")
    .setBadFilesDir("/data/bad")
    .setClocksInSync(true) // NTP installed on all hosts
    .setIgnoreSuffix("_COPYING_") 
// do not begin reading file until it is completely copied to HDFS
    .setMaxOutstanding(50_000);

映射器;

DelimitedRecordHiveMapper mapper = new DelimitedRecordHiveMapper()
    .withColumnFields(new Fields(TTDPIRecord.fieldsList))
    .withPartitionFields(new Fields(TTDPIRecord.partitionFieldsList));

配置选项;

HiveOptions hiveOptions = new HiveOptions(metaStoreURI, dbName, tblName, mapper)
    .withAutoCreatePartitions(true)
    .withHeartBeatInterval(3)
    .withCallTimeout(10_000) // default = 10.000
    .withTxnsPerBatch(2)
    .withBatchSize(50_000) 
// doing below because its affecting storm metrics most likely
    .withTickTupleInterval(1);

配置;

Config conf = new Config();
conf.setNumWorkers(6);
conf.setNumAckers(6);
conf.registerMetricsConsumer(LoggingMetricsConsumer.class);

拓扑生成器;

TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("hdfsSpout", hdfsSpout, 8);
builder.setBolt("recordParserBolt", recordParserBolt, 8).localOrShuffleGrouping("hdfsSpout");
builder.setBolt("hiveBolt", hiveBolt, 8).localOrShuffleGrouping("recordParserBolt");

我们不确定以下参数;

  

在HDFS Spout中; .setMaxOutstanding(50_000);

     蜂巢喷口选项中的

; .withTxnsPerBatch(2).withBatchSize(50_000)   .withTickTupleInterval(1);

     

在Config中; .setNumWorkers(6); .setNumAckers(6);

     

壶嘴和螺栓的平行现象;我们每个给了8。

这些参数的值应该是什么?预先感谢。

编辑; 这是10 mb的csv文件的测试结果;

  

hdfsSpout 执行器:8个完整延迟:1834.209毫秒

     

recordParserBolt 执行器:8个完整延迟:0.019毫秒

     

hiveBolt 执行器:8个完整延迟:1092.624 ms

1 个答案:

答案 0 :(得分:0)

您正在做%USERPROFILE%\.AndroidStudio3.2,这意味着您仅使用了8台机器中的6台,可以将其设置为8来利用您拥有的所有硬件。

您可以更改的另一个参数是螺栓的并行度提示,这表示组件的执行程序(线程)的初始数量。您仅将并行度设置为8,可以将并行度提高到100/200,并查看性能如何变化。

您可以通过this来了解并行在风暴中的工作方式。

您还能告诉您max-spout-pending的配置是什么吗?