It is exactly the issue here, isn't it?

We are using memory / N, where N should be the maximum number of active
tasks. In the current master, we use the number of cores to approximate the
number of tasks -- but it turned out to be a bad approximation in tests
because it is set to 32 to increase concurrency.


On Tue, Sep 15, 2015 at 10:47 PM, Pete Robbins <robbin...@gmail.com> wrote:

> Oops... I meant to say "The page size calculation is NOT the issue here"
>
> On 16 September 2015 at 06:46, Pete Robbins <robbin...@gmail.com> wrote:
>
>> The page size calculation is the issue here as there is plenty of free
>> memory, although there is maybe a fair bit of wasted space in some pages.
>> It is that when we have a lot of tasks each is only allowed to reach 1/n of
>> the available memory and several of the tasks bump in to that limit. With
>> tasks 4 times the number of cores there will be some contention and so they
>> remain active for longer.
>>
>> So I think this is a test case issue configuring the number of executors
>> too high.
>>
>> On 15 September 2015 at 18:54, Reynold Xin <r...@databricks.com> wrote:
>>
>>> Maybe we can change the heuristics in memory calculation to use
>>> SparkContext.defaultParallelism if it is local mode.
>>>
>>>
>>> On Tue, Sep 15, 2015 at 10:28 AM, Pete Robbins <robbin...@gmail.com>
>>> wrote:
>>>
>>>> Yes and at least there is an override by setting  spark.sql.test.master
>>>> to local[8] , in fact local[16] worked on my 8 core box.
>>>>
>>>> I'm happy to use this as a workaround but the 32 hard-coded will fail
>>>> running build/tests on a clean checkout if you only have 8 cores.
>>>>
>>>> On 15 September 2015 at 17:40, Marcelo Vanzin <van...@cloudera.com>
>>>> wrote:
>>>>
>>>>> That test explicitly sets the number of executor cores to 32.
>>>>>
>>>>> object TestHive
>>>>>   extends TestHiveContext(
>>>>>     new SparkContext(
>>>>>       System.getProperty("spark.sql.test.master", "local[32]"),
>>>>>
>>>>>
>>>>> On Mon, Sep 14, 2015 at 11:22 PM, Reynold Xin <r...@databricks.com>
>>>>> wrote:
>>>>> > Yea I think this is where the heuristics is failing -- it uses 8
>>>>> cores to
>>>>> > approximate the number of active tasks, but the tests somehow is
>>>>> using 32
>>>>> > (maybe because it explicitly sets it to that, or you set it
>>>>> yourself? I'm
>>>>> > not sure which one)
>>>>> >
>>>>> > On Mon, Sep 14, 2015 at 11:06 PM, Pete Robbins <robbin...@gmail.com>
>>>>> wrote:
>>>>> >>
>>>>> >> Reynold, thanks for replying.
>>>>> >>
>>>>> >> getPageSize parameters: maxMemory=515396075, numCores=0
>>>>> >> Calculated values: cores=8, default=4194304
>>>>> >>
>>>>> >> So am I getting a large page size as I only have 8 cores?
>>>>> >>
>>>>> >> On 15 September 2015 at 00:40, Reynold Xin <r...@databricks.com>
>>>>> wrote:
>>>>> >>>
>>>>> >>> Pete - can you do me a favor?
>>>>> >>>
>>>>> >>>
>>>>> >>>
>>>>> https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/shuffle/ShuffleMemoryManager.scala#L174
>>>>> >>>
>>>>> >>> Print the parameters that are passed into the getPageSize
>>>>> function, and
>>>>> >>> check their values.
>>>>> >>>
>>>>> >>> On Mon, Sep 14, 2015 at 4:32 PM, Reynold Xin <r...@databricks.com>
>>>>> wrote:
>>>>> >>>>
>>>>> >>>> Is this on latest master / branch-1.5?
>>>>> >>>>
>>>>> >>>> out of the box we reserve only 16% (0.2 * 0.8) of the memory for
>>>>> >>>> execution (e.g. aggregate, join) / shuffle sorting. With a 3GB
>>>>> heap, that's
>>>>> >>>> 480MB. So each task gets 480MB / 32 = 15MB, and each operator
>>>>> reserves at
>>>>> >>>> least one page for execution. If your page size is 4MB, it only
>>>>> takes 3
>>>>> >>>> operators to use up its memory.
>>>>> >>>>
>>>>> >>>> The thing is page size is dynamically determined -- and in your
>>>>> case it
>>>>> >>>> should be smaller than 4MB.
>>>>> >>>>
>>>>> https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/shuffle/ShuffleMemoryManager.scala#L174
>>>>> >>>>
>>>>> >>>> Maybe there is a place that in the maven tests that we explicitly
>>>>> set
>>>>> >>>> the page size (spark.buffer.pageSize) to 4MB? If yes, we need to
>>>>> find it and
>>>>> >>>> just remove it.
>>>>> >>>>
>>>>> >>>>
>>>>> >>>> On Mon, Sep 14, 2015 at 4:16 AM, Pete Robbins <
>>>>> robbin...@gmail.com>
>>>>> >>>> wrote:
>>>>> >>>>>
>>>>> >>>>> I keep hitting errors running the tests on 1.5 such as
>>>>> >>>>>
>>>>> >>>>>
>>>>> >>>>> - join31 *** FAILED ***
>>>>> >>>>>   Failed to execute query using catalyst:
>>>>> >>>>>   Error: Job aborted due to stage failure: Task 9 in stage 3653.0
>>>>> >>>>> failed 1 times, most recent failure: Lost task 9.0 in stage
>>>>> 3653.0 (TID
>>>>> >>>>> 123363, localhost): java.io.IOException: Unable to acquire
>>>>> 4194304 bytes of
>>>>> >>>>> memory
>>>>> >>>>>       at
>>>>> >>>>>
>>>>> org.apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter.acquireNewPage(UnsafeExternalSorter.java:368)
>>>>> >>>>>
>>>>> >>>>>
>>>>> >>>>> This is using the command
>>>>> >>>>> build/mvn -Pyarn -Phadoop-2.2 -Phive -Phive-thriftserver  test
>>>>> >>>>>
>>>>> >>>>>
>>>>> >>>>> I don't see these errors in any of the amplab jenkins builds. Do
>>>>> those
>>>>> >>>>> builds have any configuration/environment that I may be missing?
>>>>> My build is
>>>>> >>>>> running with whatever defaults are in the top level pom.xml, eg
>>>>> -Xmx3G.
>>>>> >>>>>
>>>>> >>>>> I can make these tests pass by setting
>>>>> spark.shuffle.memoryFraction=0.6
>>>>> >>>>> in the HiveCompatibilitySuite rather than the default 0.2 value.
>>>>> >>>>>
>>>>> >>>>> Trying to analyze what is going on with the test it is related
>>>>> to the
>>>>> >>>>> number of active tasks, which seems to rise to 32, and so the
>>>>> >>>>> ShuffleMemoryManager allows less memory per task even though
>>>>> most of those
>>>>> >>>>> tasks do not have any memory allocated to them.
>>>>> >>>>>
>>>>> >>>>> Has anyone seen issues like this before?
>>>>> >>>>
>>>>> >>>>
>>>>> >>>
>>>>> >>
>>>>> >
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Marcelo
>>>>>
>>>>
>>>>
>>>
>>
>

Reply via email to