其中应用程序,使用Spark,执行非Spark上下文代码

fcwjkofz  于 6个月前  发布在  Apache
关注(0)|答案(1)|浏览(90)

例如,我有以下代码:

public static void main(String[] args) {
    RestController restController = new RestController();
    SparkSession sparkSession = SparkSession
            .builder()
            .appName("test example")
            .getOrCreate();

    Dataset<Row> csvFileDF = sparkSession.read().csv("test_csv");
    
    // code in task //
    restController.sendFile();
    // __________//
    
    csvFileDF.write().parquet("test_parquet");
}

字符串
方法restController.sendFile()不是在spark上下文中执行的,与读csv和写parquet操作相反。
罐运行人:

spark-submit --jar main.jar


我是否正确理解了restController.sendFile()在驱动程序上执行?

2nc8po8w

2nc8po8w1#

一般来说,在Spark中,在执行器上进行的计算是在分布式数据(RDD,DataFrames,Datasets)上执行的操作/转换。其余部分在驱动程序中进行,因为计算不是分布式的。
所以在你的例子中,它确实看起来像restController.sendFile()只发生在驱动程序上,但我不能肯定,因为我不知道这个方法是做什么的。
让我们举一个非常简单的例子:

from pyspark.sql import SparkSession
import pyspark.sql.functions as F

spark = SparkSession.builder.getOrCreate()

myList = [
    (1,),
    (2,),
    (3,),
    (4,),
    (5,),
    (6,),
    (7,),
    (8,),
    (9,),
    (10,),
]
df = spark.createDataFrame(
    myList,
    ["myInt"],
)

df2 = df.withColumn("increment", F.col("myInt") + 1)
df2.write.csv("myTestFile.csv")

myList2 = [(x[0], x[0] + 1) for x in myList]

字符串
在这里,您可以看到我们:

  • 通过将第一列递增1来创建df2嵌套框架
  • 创建一个myList2列表

当查看该应用程序的spark历史服务器时,我们看到:
x1c 0d1x的数据
在我们的Spark上下文中,只发生了嵌套框架操作,其余的都是在驱动程序上进行的正常的、非分布式的计算。

相关问题