5

我们只是在试用 Spark,事实证明它真的很慢。为了说明我的意思,我在下面给出了一个示例 - Spark 需要将近 2 秒的时间从 HDFS 加载一个包含 10 行的文本文件,并计算行数。我的问题:

  1. 这是预期的吗?您的平台需要多长时间?
  2. 任何可能的想法为什么?目前我在一个两节点 Hadoop 集群(都是 8 个内核,64G RAM)上使用 Spark 1.3。在 Hadoop 和 Spark 方面,我非常熟悉,所以除了 Ambari/HDP 默认值之外,我几乎没有做任何配置。

最初我在测试一亿行——Spark 花了大约 10 分钟来简单地计算它。

例子:

创建 10 个数字的文本文件,并将其加载到 hadoop:

for i in {1..10}; do echo $1 >> numbers.txt; done
hadoop fs -put numbers.txt numbers.txt

启动 pyspark(大约需要 20 秒...):

pyspark --master yarn-client --executor-memory 4G --executor-cores 1 --driver-memory 4G --conf spark.python.worker.memory=4G

从 HDFS 加载文件并计数:

sc.textFile('numbers.txt').count()

根据反馈,Spark 大约需要 1.6 秒才能完成此操作。即使配置很糟糕,我也不认为需要那么长时间。

4

2 回答 2

2

即使对于错误的火花配置(而且通常默认火花配置适用于它的大部分正常使用),这绝对太慢(在我的本地机器上 0.3 秒)。也许您应该仔细检查您的 HDFS 配置或网络相关配置。

于 2016-01-05T15:03:27.223 回答
1

它与集群配置无关。这是由于懒惰的评估。

Spark中有两种类型的 API :Transformations & Actions

从上面的文档链接中查看它。

RDD 支持两种类型的操作:转换(从现有数据集创建新数据集)和操作(在对数据集运行计算后将值返回给驱动程序)。

例如,map 是一种转换,它通过一个函数传递每个数据集元素并返回一个表示结果的新 RDD。另一方面,reduce 是一个操作,它使用某个函数聚合 RDD 的所有元素并将最终结果返回给驱动程序(尽管也有一个并行的 reduceByKey,它返回一个分布式数据集)。

Spark 中的所有转换都是惰性的,因为它们不会立即计算结果。相反,他们只记得应用于某些基础数据集(例如文件)的转换。仅当操作需要将结果返回给驱动程序时才计算转换。

sc.textFile('numbers.txt').count()count()是一个带有调用的动作操作。

由于这个原因,即使您第一次需要 2 秒,第二次也只需要几分之一秒。

于 2016-01-05T15:54:21.320 回答