在 Spark 中创建分布式 RDD
Posted
技术标签:
【中文标题】在 Spark 中创建分布式 RDD【英文标题】:Creating an distributed RDD in Spark 【发布时间】:2019-10-16 18:08:56 【问题描述】:我知道要创建 RDD,我们有两种方法:
-
并行化驱动程序中的现有集合。
从外部存储系统(如 HDFS、HBase 等)引用数据。
但是,我想知道当我从 Data Lake 读取数据时会发生什么,例如(Azure Data Lake Storage Gen 2,ADLS Gen 2
)。例如,如果我有以下命令:
df = spark.read.csv("path to ADLS Gen 2").rdd
我想知道数据是如何读取的;是进驱动程序吗?还是直接进入worker节点?
那么,如果我们在Dataframe
或RDD
上应用了一些转换,那么处理会发生在哪里?这个问题只有在数据加载到驱动节点时才存在。
请注意,我是 Spark 的新手,我仍在学习该工具。
【问题讨论】:
数据只有在你运行一个强制它的命令时才会到达驱动程序,主要是collect
。
感谢@Andrew 的回答。我同意你的观点,但是,我想知道转换是否发生在工作节点上。
通常在工作节点上,但您可能会无意中在驱动程序节点上打盹。有3种方式。
【参考方案1】:
数据是在worker节点上读取的,除非集群上运行的程序强制driver节点读取。当然,Spark worker不会将整个RDD加载到本地内存;哪个rdd分区到哪个worker由驱动管理器处理。
这意味着当您在会话上应用转换时,Spark 会执行以下步骤:
1.创建一个 DAG,以最有效的方式计算转换和操作。
2.向集群的所有活动工作人员发送一个 jar 文件,其中包含有关程序的一般信息和有关此工作人员必须应用的处理的具体信息。
以上内容以非常抽象的方式给出,因为在部署应用程序时,火花集群内部还有更多内容,但主要思想是工作人员读取文件以及他们必须对它们做什么,是通过网络从司机那里传来的
【讨论】:
以上是关于在 Spark 中创建分布式 RDD的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Spark 中的 Slaves 内存中创建 RDD?
如何从 Scala 中的 DataFrame 在 Spark 中创建分布式稀疏矩阵