В Spark задача выполняется только на одном исполнителе

Я запускаю код под искрой, используя Java.

Код

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();
    }

}

Я просто пытаюсь найти количество строк. Диапазон составляет 20 миллионов.

Ниже приведен снимок панели управления Spark

введите описание изображения здесь

Здесь я вижу Активную задачу только на одном Исполнителе. У меня работает всего 10 исполнителей.

Мой вопрос

Почему мое приложение показывает активную задачу на одном исполнителе, а не распределяет ее между всеми 10 исполнителями?

Ниже представлена ​​моя команда 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

person A Learner    schedule 22.11.2018    source источник


Ответы (1)


Похоже, все данные читаются в одном разделе и передаются одному исполнителю. Чтобы использовать больше исполнителей, необходимо создать больше разделов. Параметр numPartitions можно использовать вместе со столбцом раздела, как указано здесь:

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

Также может пригодиться эта ссылка:

Spark: разница между numPartitions в read.jdbc (.. numPartitions ..) и повторное разделение (.. numPartitions ..)

person pasha701    schedule 22.11.2018
comment
Спасибо, в моей таблице 100 миллионов строк. Я использую Dataset ‹Row› 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 (); по вашему предложению, как вы думаете, это оптимально? - person A Learner; 22.11.2018
comment
Зависит от нескольких факторов - сколько подключений сервер Oracle может поддерживать одновременно; сколько исполнителей будет задействовано; сколько ядер процессора на одного исполнителя - на одно ядро ​​можно использовать 2-4 раздела. Думаю, можно поэкспериментировать. - person pasha701; 22.11.2018
comment
Конечно, я попробую, у меня есть 10 исполнителей, каждый исполнитель работает на 17 ядрах, и каждый исполнитель имеет память 91 ГБ. Я хотел понять, что эта верхняя граница означает общее количество записей, которые должны быть прочитаны, или максимальный размер раздела. - person A Learner; 22.11.2018
comment
Сэкономил мне невероятное количество времени. - person Rafael Barros; 27.08.2020