@@ -1528,6 +1528,48 @@ def test_parse_memory_string(memory_string, expected_output):
15281528 assert spark_config .parse_memory_string (memory_string ) == expected_output
15291529
15301530
1531+ @pytest .mark .parametrize (
1532+ 'spark_opts,executor_memory,expected_output' ,
1533+ [
1534+ # min_memory_overhead
1535+ ({}, 1024 , 384 ),
1536+ # default_memory_overhead_factor
1537+ ({}, 4096 , 409.6 ),
1538+ # executor_memoryOverhead_configured
1539+ ({'spark.executor.memoryOverhead' : '1024' }, 4096 , 1024 ),
1540+ # mesos_memoryOverhead_configured
1541+ ({'spark.mesos.executor.memoryOverhead' : '2048' }, 4096 , 2048 ),
1542+ # kubernetes_memoryOverheadFactor_configured
1543+ ({'spark.kubernetes.memoryOverheadFactor' : '0.2' }, 4096 , int (4096 * 0.2 )),
1544+ # multiple_configs_highest_selected
1545+ (
1546+ {
1547+ 'spark.executor.memoryOverhead' : '1024' ,
1548+ 'spark.mesos.executor.memoryOverhead' : '2048' ,
1549+ 'spark.kubernetes.memoryOverheadFactor' : '0.2' ,
1550+ },
1551+ 4096 ,
1552+ 2048 ,
1553+ ),
1554+ # default_memory_overhead_small_executor
1555+ ({}, 1024 , 384 ),
1556+ ],
1557+ ids = [
1558+ 'min_memory_overhead' ,
1559+ 'default_memory_overhead_factor' ,
1560+ 'executor_memoryOverhead_configured' ,
1561+ 'mesos_memoryOverhead_configured' ,
1562+ 'kubernetes_memoryOverheadFactor_configured' ,
1563+ 'multiple_configs_highest_selected' ,
1564+ 'default_memory_overhead_small_executor' ,
1565+ ],
1566+ )
1567+ def test_compute_requested_memory_overhead (spark_opts , executor_memory , expected_output ):
1568+ result = spark_config .get_spark_executor_memory_overhead_mb (spark_opts , executor_memory )
1569+ assert isinstance (result , float )
1570+ assert int (result ) == int (expected_output )
1571+
1572+
15311573def test_get_grafana_url ():
15321574 spark_conf = {
15331575 'spark.executorEnv.PAASTA_CLUSTER' : 'test-cluster' ,
@@ -1544,38 +1586,10 @@ def test_get_grafana_url():
15441586
15451587@pytest .mark .parametrize (
15461588 'spark_opts,expected_output' , [
1547- # mesos ( 2 instances, not configure memory overhead, default: 384m )
1548- (
1549- {
1550- 'spark.cores.max' : '10' ,
1551- 'spark.executor.cores' : '5' ,
1552- 'spark.executor.memory' : '2g' ,
1553- },
1554- {
1555- 'cpus' : 10 ,
1556- 'mem' : (384 + 2048 ) * 2 ,
1557- 'disk' : (384 + 2048 ) * 2 ,
1558- 'gpus' : 0 ,
1559- },
1560- ),
1561- # mesos ( 2 instances, not configure memory overhead, default: 409m )
1562- (
1563- {
1564- 'spark.cores.max' : '10' ,
1565- 'spark.executor.cores' : '5' ,
1566- 'spark.executor.memory' : '4g' ,
1567- },
1568- {
1569- 'cpus' : 10 ,
1570- 'mem' : (409 + 4096 ) * 2 ,
1571- 'disk' : (409 + 4096 ) * 2 ,
1572- 'gpus' : 0 ,
1573- },
1574- ),
1575- # mesos ( 2 instances, configure memory overhead)
1589+ # basic_config
15761590 (
15771591 {
1578- 'spark.cores.max ' : '10 ' ,
1592+ 'spark.executor.instances ' : '2 ' ,
15791593 'spark.executor.cores' : '5' ,
15801594 'spark.executor.memory' : '4g' ,
15811595 'spark.executor.memoryOverhead' : '3072' ,
@@ -1587,26 +1601,25 @@ def test_get_grafana_url():
15871601 'gpus' : 0 ,
15881602 },
15891603 ),
1590- # mesos ( 2 instances, Duplicate config, choose the higher memory overhead)
1604+ # kubernetes_memory_overhead
15911605 (
15921606 {
1593- 'spark.cores.max ' : '10 ' ,
1607+ 'spark.executor.instances ' : '2 ' ,
15941608 'spark.executor.cores' : '5' ,
15951609 'spark.executor.memory' : '4g' ,
1596- 'spark.executor.memoryOverhead' : '3072' ,
1597- 'spark.mesos.executor.memoryOverhead' : '4096' ,
1610+ 'spark.kubernetes.memoryOverheadFactor' : '0.5' ,
15981611 },
15991612 {
16001613 'cpus' : 10 ,
1601- 'mem' : (4096 + 4096 ) * 2 ,
1602- 'disk' : (4096 + 4096 ) * 2 ,
1614+ 'mem' : (4096 * 0.5 + 4096 ) * 2 ,
1615+ 'disk' : (4096 * 0.5 + 4096 ) * 2 ,
16031616 'gpus' : 0 ,
16041617 },
16051618 ),
1606- # mesos ( 2 instances, configure memory overhead)
1619+ # mesos_memory_overhead
16071620 (
16081621 {
1609- 'spark.cores.max ' : '10 ' ,
1622+ 'spark.executor.instances ' : '2 ' ,
16101623 'spark.executor.cores' : '5' ,
16111624 'spark.executor.memory' : '4g' ,
16121625 'spark.mesos.executor.memoryOverhead' : '3072' ,
@@ -1618,10 +1631,11 @@ def test_get_grafana_url():
16181631 'gpus' : 0 ,
16191632 },
16201633 ),
1621- # k8s
1634+ # gpu_enabled
16221635 (
16231636 {
16241637 'spark.executor.instances' : '2' ,
1638+ 'spark.mesos.gpus.max' : '2' ,
16251639 'spark.executor.cores' : '5' ,
16261640 'spark.executor.memory' : '4g' ,
16271641 'spark.executor.memoryOverhead' : '3072' ,
@@ -1630,41 +1644,33 @@ def test_get_grafana_url():
16301644 'cpus' : 10 ,
16311645 'mem' : (3072 + 4096 ) * 2 ,
16321646 'disk' : (3072 + 4096 ) * 2 ,
1633- 'gpus' : 0 ,
1647+ 'gpus' : 2 ,
16341648 },
16351649 ),
1636- # k8s
1650+ # dynamic_allocation_enabled
16371651 (
16381652 {
1639- 'spark.executor.instances' : '2' ,
1653+ 'spark.executor.instances' : '0' ,
1654+ 'spark.dynamicAllocation.enabled' : 'true' ,
1655+ 'spark.dynamicAllocation.maxExecutors' : '2' ,
16401656 'spark.executor.cores' : '5' ,
16411657 'spark.executor.memory' : '4g' ,
16421658 'spark.kubernetes.memoryOverheadFactor' : '0.5' ,
16431659 },
16441660 {
16451661 'cpus' : 10 ,
1646- 'mem' : (4096 * 0.5 + 4096 ) * 2 ,
1647- 'disk' : (4096 * 0.5 + 4096 ) * 2 ,
1662+ 'mem' : (4096 * 1.5 ) * 2 ,
1663+ 'disk' : (4096 * 1.5 ) * 2 ,
16481664 'gpus' : 0 ,
16491665 },
16501666 ),
1651- # gpu
1652- (
1653- {
1654- 'spark.cores.max' : '10' ,
1655- 'spark.mesos.gpus.max' : '2' ,
1656- 'spark.executor.cores' : '5' ,
1657- 'spark.executor.memory' : '4g' ,
1658- 'spark.executor.memoryOverhead' : '3072' ,
1659- },
1660- {
1661- 'cpus' : 10 ,
1662- 'mem' : (3072 + 4096 ) * 2 ,
1663- 'disk' : (3072 + 4096 ) * 2 ,
1664- 'gpus' : 2 ,
1665- },
1666-
1667- ),
1667+ ],
1668+ ids = [
1669+ 'basic_config' ,
1670+ 'kubernetes_memory_overhead' ,
1671+ 'mesos_memory_overhead' ,
1672+ 'gpu_enabled' ,
1673+ 'dynamic_allocation_enabled' ,
16681674 ],
16691675)
16701676def test_get_resources_requested (spark_opts , expected_output ):
0 commit comments