首页 文章

spark.read中选项(“numPartitions”,x)的spark-submit中的num-executors,executor-cores,executor-memory有什么区别? [重复]

提问于
浏览
0

这个问题在这里已有答案:

我在PostgreSQL DB上读取了一个RDBMS表:

val dataDF    = spark.read.format("jdbc").option("url", connectionUrl)
                            .option("dbtable", s"(${execQuery}) as year2017")
                            .option("user", devUserName)
                            .option("password", devPassword)
                            .option("numPartitions",10)
                            .load()

选项:numPartitions表示数据被拆分的分区数,然后以并行方式处理每个分区,在这种情况下它是:10 . 我认为这是一个很酷的选项,直到我遇到spark-submit的一个很棒的功能: - num-executors, - executor-cores, - executor-memory . 我从这个链接中读取了spark-submit中上述三个参数的概念:here

我不明白的是,如果两者都用于并行处理,那么两者之间有何不同?

谁能让我知道上述选项之间的区别?

1 回答

  • 3

    read.jdbc(..numPartitions..) 中, numPartitions 是您的数据(Dataframe / Dataset)具有的分区数 . 换句话说,读取数据帧上的所有后续操作都将具有等于 numPartitions 的并行度 . (此选项还控制对JDBC源进行的并行连接数 . )

    要理解 --num-executors--executor-cores--executor-memory ,您应该理解 Task 的概念 . 您在Dataframe(或数据集)上执行的每个操作都会转换为Dataframe分区上的 Task . 因此,对于数据的每个分区,每个操作都存在一个 Task .

    TaskExecutor 上执行 . --num-executors 控制将由Spark生成的执行程序的数量;因此,这可以控制 Tasks 的并行性 . 另外两个选项 --executor-cores--executor-memory 控制您为每个执行程序提供的资源 . 除其他外,这取决于您希望在每台机器上执行的执行程序的数量 .

    P.S:这假设您手动分配资源 . Spark也能够dynamic allocation .

    有关此内容的更多信息,您可以使用以下链接:


    EDITS:

    以下声明有一个重要的警告:

    读取Dataframe上的所有后续操作都将具有等于numPartitions的并行度 .

    诸如连接和聚合(涉及shuffle)之类的操作以及诸如union(其不会混洗数据)之类的操作可能会改变分区因子 .

相关问题