我正在使用 Java 在 Spark 中运行以下代码。
Code
测试.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 仪表板的快照
在这里我可以看到Active任务仅在一个 Executor 上执行。
我总共有 10 个 Executor 正在运行。
我的问题
为什么我的应用程序在一个执行器上显示活动任务,而不是将其分布到所有 10 个执行器上?
下面是我的火花提交命令 :
./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
看起来所有数据都在一个分区中读取,并转到一个执行器。
为了使用更多的执行器,必须创建更多的分区。
参数“numPartitions”可以与分区列一起使用,如下所示:
https://docs.databricks.com/spark/latest/data-sources/sql-databases.html#jdbc-reads https://docs.databricks.com/spark/latest/data-sources/sql-databases.html#jdbc-reads
此链接也很有用:
Spark:read.jdbc(..numPartitions..) 和 repartition(..numPartitions..) 中 numPartitions 之间的差异 https://stackoverflow.com/questions/48276241/spark-difference-between-numpartitions-in-read-jdbc-numpartitions-and-repa
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)