【问题标题】:How Spark internally works in this scenario?在这种情况下,Spark 内部如何工作?
【发布时间】:2017-06-14 22:29:34
【问题描述】:
  JavaRDD<String> textFile = sc.textFile("C://test.txt");

假设我有 1000 行 test.txt 文件。我有带四核处理器的单机。这是我理解 spark 将如何在这里实现并行性

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

我的理解正确吗?

【问题讨论】:

  • 据我所知,Spark 默认采用的分区数等于文本文件的块数。我们可以通过给出(文件路径,分区数)手动定义分区
  • 你能详细说明文件中没有块是什么意思吗?你的意思是有 1000 行,spark 会将它分成一些块,比如 4,然后创建 4 个分区,然后如果在同一台机器上创建 4 个线程,否则将其发送给 4 个工人。对吗?
  • 在 Hadoop 中,默认块大小为 64 mb(apache 发行版,如果 cloudera 为 128mb)如果您的文件大小为 256mb。它默认存储为 4 个块(4*64 mb)。 Spark默认将每个块作为每个分区,我们可以管理它们。
  • 对 HDFS 文件或文件系统也有效吗?
  • 在任何文件系统中,但块大小可能不同

标签: java multithreading apache-spark


【解决方案1】:

对于本地文件,Spark 将分割文件的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(
  org.apache.spark.rdd.HadoopPartition@cd0, 
  org.apache.spark.rdd.HadoopPartition@cd1, 
  org.apache.spark.rdd.HadoopPartition@cd2, 
  org.apache.spark.rdd.HadoopPartition@cd3, 
  org.apache.spark.rdd.HadoopPartition@cd4, 
  org.apache.spark.rdd.HadoopPartition@cd5, 
  org.apache.spark.rdd.HadoopPartition@cd6, 
  org.apache.spark.rdd.HadoopPartition@cd7
)

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

【讨论】:

  • 如果我假设 n 为 4,这意味着 spark 会将其分成 4 个块,每行 250 行。正确的 ?您还可以详细说明Note that this is a behavior of the underlying hadoop filesystem implementation. For distributed filesystems, such as hdfs, Spark will use the partitioning level of the consumed file 吗?基于系统的文件或 HDFS 是否有自己的分区级别?
  • 带有sc.textFile("C://test.txt", 8)的文件将被分成8个块,如果一台机器有8个核心,每个核心可以处理一个块。对吗?
  • @scottmiles 这确实是对数据的操作是可并行化的期望。
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2018-06-16
  • 2017-06-21
  • 2018-01-19
  • 1970-01-01
  • 2021-12-06
  • 2020-12-27
相关资源
最近更新 更多