2017-06-13 88 views
0
JavaRDD<String> textFile = sc.textFile("C://test.txt"); 

说我有1000行test.txt文件。我有一个四核处理器的单机版。这里是我的理解火花如何实现并行性在这里Spark在这种情况下如何工作?

  1. Spark将从单个线程中的文件读取字符块。不确定是否有默认的块大小或取决于文件大小
  2. Spark将根据以下两个参数确定要创建多少个分区 a)在步骤1中读取的数据大小和 b)基于数字cpu中的核心数
  3. 根据步骤2中的分区大小,它会产生线程。如果有3个分区,它会产生三个线程。

我的理解是否正确?

+0

中实现,根据我的知识,Spark默认将分区等同于文本文件块的数量。我们可以通过给出 (文件路径,分区数量)手动定义分区 – user4342532

+0

您可以详细说明文件中块的含义是什么吗?你的意思是有1000行,spark会将它分成4块,然后创建4个分区,然后在同一台机器上创建4个线程,否则发送给4个工作者。这样对吗 ? –

+0

在Hadoop中,默认块大小为64 MB(apache distribution,如果cloudera为128mb)如果你的文件大小是假设为256mb。其默认存储为4个块(4 * 64 mb)。 Spark默认将每个块作为每个分区,并且我们可以管理它们。 – user4342532

回答

1

在本地文件的情况下,火花将分割文件,其中n是默认的并行级和等于簇中的核心数量的n块(例如:在local[4]情况下,这将是4) 。

我们可以提供多个分区覆盖该行为:

textFile = sc.textFile("C://test.txt", 8) // will create 8 spark partitions. 

我们可以检查分区:

textFile.partitions() 
//Array[org.apache.spark.Partition] =  Array(
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected], 
    [email protected] 
) 

注意,这是底层的Hadoop文件系统实现的行为。对于分布式文件系统(如hdfs),Spark将使用所使用文件的分区级别。 Spark和Hadoop之间的交互在 https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/rdd/HadoopRDD.scala

+0

如果我假设n为4,则意味着火花会将它划分为每行250行的4个块。对 ?你也可以详细说明'注意这是底层hadoop文件系统实现的行为。对于分布式文件系统,如hdfs,Spark将使用所使用文件的分区级别?基于系统的文件或HDFS是否有其自己的分区级别?带有'sc.textFile(“C://test.txt”,8)的' –

+0

'文件将被分成8个块,如果一个机器中有8个内核,每个内核可以处理一个块。对 ? –

+0

@scottmiles在数据操作可并行化的情况下,这确实是期望值。 – maasg

相关问题