У меня есть работа, которая перебирает столбцы таблицы, чтобы получить различные значения каждого из них.Каждый запрос занимает около 6 секунд, но они не используют полный процессор.Вот почему я решил использовать расписание FAIR в Приложении, чтобы ресурсы могли быть полностью использованы.На самом деле это приложение имеет 4 ядра и 10 Гб оперативной памяти.
Я добавил в свой файл 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);
Используется пул filters , я вижу его в графическом интерфейсе приложения spark, и задания выполняются параллельно, но если раньше, то каждый запрос выполнялсяв режиме FIFO за 6 секунд с использованием режима FAIR 4 параллельных запроса выполняются за 24 секунды.Я проверил загрузку процессора и, как раньше, когда использовался режим FIFO.
Я что-то упустил?