我有一个迭代表列的工作,以获取每个列的不同值。每个查询大约需要6秒,但它们不使用完整的CPU。这就是为什么我决定在应用程序中使用FAIR调度,以便可以充分利用资源。实际上这个应用程序有4个内核和10 Gb内存。
我在spark spark-defaults.conf文件中添加了以下行:
spark.scheduler.mode FAIR
spark.scheduler.allocation.file /bin/spark/pools.xml
我创建了以下池:
<pool name="filters">
<schedulingMode>FAIR</schedulingMode>
<weight>1000</weight>
<minShare>0</minShare>
</pool>
这是我的代码:
List<ColumnMetadata> fields = getCategoryFieldsFromViewMetadata(...);
Dataset<Row> dsCube = sqlContext.sql("...");
dsCube = dsCube
.select(JavaConversions.asScalaBuffer(filterColumns))
.persist(StorageLevel.MEMORY_ONLY());
dsCube.createOrReplaceTempView("filter_temp");
sqlContext.sparkContext().setLocalProperty("spark.scheduler.pool", "filters");
fields.parallelStream().forEach((ColumnMetadata field) -> {
Dataset<Row> temp = sqlContext.sql("select distinct tenant_id, user_domain, cube_name, field, value "
+"from filter_temp");
saveDataFrameToMySQL("analytics_cubes_filters", temp, SaveMode.Append); //Here I save the results to a MySQL table.
});
sqlContext.sparkContext().setLocalProperty("spark.scheduler.pool", null);
正在使用过滤器池,我可以在spark应用程序GUI中看到它,并且作业是并行执行的,但如果之前,每个查询都在6秒内以FIFO模式执行,现在使用FAIR模式4个并行查询在24秒内执行。我已经检查了CPU的使用情况,并且在使用FIFO模式之前看起来很像。
我错过了什么吗?