[ https://issues.apache.org/jira/browse/HIVE-17270?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16121768#comment-16121768 ]
Peter Vary commented on HIVE-17270: ----------------------------------- Thanks [~lirui] for the pointers. Based on that i was able to finally identify the source of the problem {{yarn.scheduler.minimum-allocation-mb}}. By default it is 1024 (MB), so the FairScheduler will use it as an increment. If we set it to 512, the we will have 4 reducers as expected. [~xuefuz]: If I understand the code correctly, when {{spark.dynamicAllocation.enabled}} is set to {{true}} then {{SetSparkReducerParallelism.getSparkMemoryAndCores()}} will set {{SetSparkReducerParallelism.sparkMemoryAndCores}} to {{null}}. And if this is null, then the number of reducers should be based only on the size of the data. So everything should be great. In code: {code:title=SetSparkReducerParallelism.process()} [..] // Divide it by 2 so that we can have more reducers long bytesPerReducer = context.getConf().getLongVar(HiveConf.ConfVars.BYTESPERREDUCER) / 2; int numReducers = Utilities.estimateReducers(numberOfBytes, bytesPerReducer, maxReducers, false); getSparkMemoryAndCores(context); <-- this will return null, if dynamicAllocation is enabled if (sparkMemoryAndCores != null && sparkMemoryAndCores.getFirst() > 0 && sparkMemoryAndCores.getSecond() > 0) { // warn the user if bytes per reducer is much larger than memory per task if ((double) sparkMemoryAndCores.getFirst() / bytesPerReducer < 0.5) { LOG.warn("Average load of a reducer is much larger than its available memory. " + "Consider decreasing hive.exec.reducers.bytes.per.reducer"); } // If there are more cores, use the number of cores numReducers = Math.max(numReducers, sparkMemoryAndCores.getSecond()); } numReducers = Math.min(numReducers, maxReducers); LOG.info("Set parallelism for reduce sink " + sink + " to: " + numReducers + " (calculated)"); desc.setNumReducers(numReducers); [..] {code} So I will provide a patch to use the configuration values if dynamicAllocation is turned off, and the {{SparkSessionImpl.getExecutorCount()}} returns negative number. One more question remains - or after [~lirui] comment - we have a better option: How to handle the misconfiguration in the tests: # Change the spark.executor.instances to 1 in the hive-site.xml, or # Change the yarn.scheduler.minimum-allocation-mb to 512, so we really will have 2 executors Thanks for your help [~lirui], [~xuefuz]! Peter > Qtest results show wrong number of executors > -------------------------------------------- > > Key: HIVE-17270 > URL: https://issues.apache.org/jira/browse/HIVE-17270 > Project: Hive > Issue Type: Bug > Components: Spark > Affects Versions: 3.0.0 > Reporter: Peter Vary > Assignee: Peter Vary > > The hive-site.xml shows, that the TestMiniSparkOnYarnCliDriver uses 2 cores, > and 2 executor instances to run the queries. See: > https://github.com/apache/hive/blob/master/data/conf/spark/yarn-client/hive-site.xml#L233 > When reading the log files for the query tests, I see the following: > {code} > 2017-08-08T07:41:03,315 INFO [0381325d-2c8c-46fb-ab51-423defaddd84 main] > session.SparkSession: Spark cluster current has executors: 1, total cores: 2, > memory per executor: 512M, memoryFraction: 0.4 > {code} > See: > http://104.198.109.242/logs/PreCommit-HIVE-Build-6299/succeeded/171-TestMiniSparkOnYarnCliDriver-insert_overwrite_directory2.q-scriptfile1.q-vector_outer_join0.q-and-17-more/logs/hive.log > When running the tests against a real cluster, I found that running an > explain query for the first time I see 1 executor, but running it for the > second time I see 2 executors. > Also setting some spark configuration on the cluster resets this behavior. > For the first time I will see 1 executor, and for the second time I will see > 2 executors again. -- This message was sent by Atlassian JIRA (v6.4.14#64029)