【问题标题】:Task is running on only one executor in spark [duplicate]任务仅在火花中的一个执行程序上运行[重复]
【发布时间】:2018-11-22 07:37:41
【问题描述】:

我正在使用 Java 在 Spark 中运行以下代码。

代码

Test.java

package com.sample;

import org.apache.spark.SparkConf;
import org.apache.spark.SparkContext;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;
import org.apache.spark.storage.StorageLevel;

import com.addition.AddTwoNumbers;

public class Test{

    private static final String APP_NAME = "Test";
    private static final String LOCAL = "local";
    private static final String MASTER_IP = "spark://10.180.181.26:7077";

    public static void main(String[] args) {

        SparkConf conf = new SparkConf().setAppName(APP_NAME).setMaster(MASTER_IP);
        String connection = "jdbc:oracle:thin:test/test@//xyz00aie.in.oracle.com:1521/PDX2600N";
        // Create Spark Context
        SparkContext context = new SparkContext(conf);
        // Create Spark Session

        SparkSession sparkSession = new SparkSession(context);
        long startTime = System.currentTimeMillis();
        System.out.println("Start time is : " + startTime);
        Dataset<Row> txnDf = sparkSession.read().format("jdbc").option("url", connection)
                .option("dbtable", "CI_TXN_DETAIL_STG_100M").load();

        System.out.println(txnDf.filter((txnDf.col("TXN_DETAIL_ID").gt(new Integer(1286001510)))
                .and(txnDf.col("TXN_DETAIL_ID").lt(new Integer(1303001510)))).count());


        sparkSession.stop();
    }

}

我只是想查找行数。范围是 2000 万。

以下是 Spark 仪表板的快照

这里我只能在一个 Executor 上看到 Active 任务。 我总共有 10 个 Executor 在运行。

我的问题

为什么我的应用程序在一个 Executor 上显示活动任务,而不是在所有 10 个 Executor 上分发它?

下面是我的 spark-submit 命令:

./spark-submit --class com.sample.Test--conf spark.sql.shuffle.partitions=5001 --conf spark.yarn.executor.memoryOverhead=11264 --executor-memory=91GB --conf spark.yarn.driver.memoryOverhead=11264 --driver-memory=91G --executor-cores=17  --driver-cores=17 --conf spark.default.parallelism=306 --jars /scratch/rmbbuild/spark_ormb/drools-jars/ojdbc6.jar,/scratch/rmbbuild/spark_ormb/drools-jars/Addition-1.0.jar --driver-class-path /scratch/rmbbuild/spark_ormb/drools-jars/ojdbc6.jar --master spark://10.180.181.26:7077 "/scratch/rmbbuild/spark_ormb/POC-jar/Test-0.0.1-SNAPSHOT.jar" > /scratch/rmbbuild/spark_ormb/POC-jar/logs/log18.txt

【问题讨论】:

    标签: apache-spark apache-spark-2.0 spark-submit


    【解决方案1】:

    看起来所有数据都在一个分区中读取,并转到一个执行程序。 为了使用更多的执行器,必须创建更多的分区。 参数“numPartitions”可以与分区列一起使用,如下所示:

    https://docs.databricks.com/spark/latest/data-sources/sql-databases.html#jdbc-reads

    这个链接也很有用:

    Spark: Difference between numPartitions in read.jdbc(..numPartitions..) and repartition(..numPartitions..)

    【讨论】:

    • 谢谢,我的表有 1 亿行我正在使用数据集 txnDf = sparkSession.read().format("jdbc").option("url", connection).option(" partitionColumn", "TXN_DETAIL_ID").option("numPartitions", 1000).option("lowerBound", 1L).option("upperBound", 100000L) .option("dbtable", "CI_TXN_DETAIL_STG_100M").load();根据您的建议,您认为这是最优的吗?
    • 取决于几个因素——Oracle 服务器一次可以支持多少个连接;将使用多少个执行者;一个执行器有多少个处理器内核 - 一个内核可以使用 2-4 个分区。猜猜,你可以对此进行实验。
    • 当然我会尝试我有 10 个执行程序,每个执行程序在 17 个内核上运行,每个执行程序有 91 GB 内存,我想了解的一件事是这个上限是否意味着要读取的总记录或分区的最大大小。
    • 为我节省了大量时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多