我们有一个将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
答案 0 :(得分:0)
您正在做%USERPROFILE%\.AndroidStudio3.2
,这意味着您仅使用了8台机器中的6台,可以将其设置为8来利用您拥有的所有硬件。
您可以更改的另一个参数是螺栓的并行度提示,这表示组件的执行程序(线程)的初始数量。您仅将并行度设置为8,可以将并行度提高到100/200,并查看性能如何变化。
您可以通过this来了解并行在风暴中的工作方式。
您还能告诉您max-spout-pending的配置是什么吗?