我正试图了解Spark内部。
我的问题是
我有10 GB的文件存储在块大小为128 MB的HDFS中。 大约是78。每个执行程序加载多少个分区?如果考虑由4个节点组成的群集,并且每个节点具有4个核心,那么这是否意味着将4个分区加载到单个执行程序中,所以4个任务可以并行运行?分区如何在群集中分布,创建的任务数量是多少?
请考虑由3个节点组成的群集,每个节点具有4 GB的内存。如果为驱动程序保留一个节点,则将两个节点留给执行程序。我必须加入两个10 GB的数据集。仅在群集中,spark是否耗尽内存错误 可用8 GB的内存,总共需要加载20 GB的数据集?
答案 0 :(得分:0)
所以,您有78个文件,容量为128 Mb,第一种情况如下:
具有4个核心的4个节点-启动该过程时,将有16个核心同时读取16个文件。每个文件完成后,执行者将获取下一个文件。如果您的执行是简单的读取,转换和写入,则您的工作将为每个文件执行此任务,并为下一个文件执行步骤,并且不会在内存或磁盘中存储任何内容。最大并行化将为16,在最佳情况下,如果所有文件同时完成,则每次将处理16个文件。
3个节点,每个节点4Gb,用于连接10 GB的2个数据集。-这种情况是Spark神奇的地方。 Spark尝试确保数据集的大小无关紧要Spark会始终尝试解决它。首先,如果数据太大,并非所有数据都会保留在内存中。ApacheSpark会将数据溢出到磁盘上。洗牌发生在记忆中吗?是的,的确如此,但是对于128Mb的每个文件都会发生这种混洗,而对于整个10GB的数据集而言,这种混洗永远不会发生。因此,即使您没有10GB的内存,如果您不强制在内存中进行缓存,Spark也会将数据溢出到工作磁盘中,并将使用将存储在内存中的元数据来处理联接。但是,如果您有两个10Gb的文件没有分成128 Mb的块,那么您可能会遇到Spark尝试一次加载所有内容的问题。
有关更多信息here,您可以找到此惊人的演示文稿,其中解释了我在解释中未讨论的Spark连接之间的区别,但可以帮助您更好地理解其工作原理。