【问题标题】:Spark RDD problemsSpark RDD 问题
【发布时间】:2016-07-19 10:36:00
【问题描述】:

我从 spark 开始,从未使用过 Hadoop。我有 10 台 iMac,在其上安装了 Spark 1.6.1 和 Hadoop 2.6。我下载了预编译的版本,并将提取的内容复制到/usr/local/spark/。我使用SCALA_HOME 设置了所有环境变量,更改为PATH 和其他spark conf。我可以同时运行 spark-shellpyspark(使用 anaconda 的 python)。

我已经设置了独立集群;所有节点都显示在我的 Web UI 上。现在,通过使用 python shell(不在本地集群上运行)我关注了this link's python interpreter word count example

这是我使用的代码

from operator import add

def tokenize(text):
    return text.split()

text = sc.textFile("Testing/shakespeare.txt")
words = text.flatMap(tokenize)
wc = words.map(lambda x: (x,1))
counts = wc.reduceByKey(add)

counts.saveAsTextFile("wc")

在从属节点上找不到文件shakespeare.txt,这是给我的错误。环顾四周,我了解到如果我不使用 HDFS,那么该文件应该存在于同一路径上的每个从节点上。这是堆栈跟踪 - github gist

现在,我有几个问题-

  • RDD 不应该是分布式的吗?也就是说,它应该在所有节点上分发(当在 RDD 上运行操作时)文件,而不是要求我分发它。

  • 我使用 Hadoop 2.6 下载了 spark,但是任何 Hadoop 命令都不能用于创建 HDFS。我提取了在spark/lib 中找到的Hadoop jar 文件,希望能找到一些可执行文件,但什么也没有。那么,spark下载中提供了哪些Hadoop相关文件呢?

  • 最后,如何在集群上运行分布式应用程序(spark-submit)或分布式分析(使用 pyspark)?如果我必须创建 HDFS,那么需要哪些额外步骤?还有,这里怎么创建HDFS?

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 我已经添加了代码和堆栈跟踪。
  • RDD 不会为你分发文件,这就是为什么你通常会使用像 HDFS 这样的分布式文件系统。

标签: hadoop apache-spark pyspark rdd hadoop2


【解决方案1】:

如果您阅读Spark Programming Guide,您会找到第一个问题的答案:

为了说明 RDD 的基础知识,考虑下面的简单程序:

val lines = sc.textFile("data.txt")
val lineLengths = lines.map(s => s.length)
val totalLength = lineLengths.reduce((a, b) => a + b)

第一行定义了来自外部文件的基本 RDD。这个数据集 没有加载到内存中或以其他方式作用于:行仅仅是一个 指向文件的指针。第二行将 lineLengths 定义为结果 地图变换。同样, lineLengths 不是立即 计算,由于懒惰。最后,我们运行reduce,这是一个动作。 此时 Spark 将计算分解为要运行的任务 独立的机器,每台机器都运行它的地图部分和 局部缩减,仅将其答案返回给驱动程序。

请记住,转换是在 Spark 工作人员上执行的(请参阅link,幻灯片 n.21)。

关于您的第二个问题,如您所见,Spark 仅包含使用 Hadoop 基础架构的库。您需要先设置 Hadoop 集群(Hdfs 等),才能使用它(使用 Spark 中的库):查看Hadoop Cluster Setup

为了回答您的最后一个问题,我希望official documentation 有所帮助,尤其是Spark Standalone

【讨论】:

  • 啊!谢谢。我遵循了您指出的相同官方文档,但没有提及设置 Hadoop 集群。所以,一个后续问题-
  • Hadoop 不是 Spark,这就是您在我发布的链接中找不到任何内容的原因。我用 hadoop 集群设置链接更新了我的答案。
  • 设置好hadoop集群后,我必须启动namenode,spark会自动使用它?
  • 一旦你正确设置了hadoop集群,你只需要告诉Spark使用哪个Hdfs节点(基本上是包含namenode的那个节点)。然后就可以了。
猜你喜欢
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-04-03
  • 2018-10-15
  • 1970-01-01
  • 2016-01-20
  • 2015-10-31
  • 2014-05-13
相关资源
最近更新 更多