因此,我有一个具有Spark Maven依赖项的Java应用程序,在运行它时,它将在运行它的主机上启动Spark服务器。该服务器实例具有36个核心。我正在指定SparkSession实例,在该实例中我同时提到了内核数和其他配置属性,但是当我使用htop
查看统计信息时,它似乎并没有使用所有内核,而是仅使用了1。
SparkSession spark = SparkSession
.builder()
.master("local")
.appName("my-spark")
.config("spark.driver.memory","50g")
.config("spark.hadoop.fs.s3a.impl","org.apache.hadoop.fs.s3a.S3AFileSystem")
.config("spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version", "2")
.config("spark.sql.shuffle.partitions", "400")
.config("spark.eventLog.enabled", "true")
.config("spark.eventLog.dir", "/dir1/dir2/logs")
.config("spark.history.fs.logDirectory", "/dir1/dir2/logs")
.config("spark.executor.cores", "36")
我还添加了JavaSparkContext:
JavaSparkContext sc = new JavaSparkContext(spark.sparkContext());
sc.hadoopConfiguration().set("fs.s3a.access.key", AWS_KEY);
sc.hadoopConfiguration().set("fs.s3a.secret.key", AWS_SECRET_KEY);
sc.hadoopConfiguration().set("spark.driver.memory","50g");
sc.hadoopConfiguration().set("spark.eventLog.enabled", "true");
sc.hadoopConfiguration().set("spark.eventLog.dir", "/dir1/dir2/logs");
sc.hadoopConfiguration().set("spark.executor.cores", "36");
我的任务是将数据从AWS s3读取到df中并将数据写入另一个存储桶中。
Dataset<Row> df = spark.read().format("csv").option("header", "true").load("s3a://bucket/file.csv.gz");
//df = df.repartition(200);
df.withColumn("col_name", df.col("col_name")).sort("col_name", "_id").write().format("iceberg").mode("append").save(location);
答案 0 :(得分:1)
.gz文件是“无法插入的”:要解压缩它们,您必须从字节0开始并向前读取。结果,spark,hive,MapReduce等将整个文件交给了一个工人。如果要并行处理,请使用其他压缩格式(例如snappy)
答案 1 :(得分:0)
您在本地模式下运行Spark,spark.executor.cores
无效,请考虑将.master("local")
更改为.master("local[*]")
希望这会有所帮助