【问题标题】:Load Data using Apache-Spark on AWS在 AWS 上使用 Apache-Spark 加载数据
【发布时间】:2015-10-13 06:20:36
【问题描述】:

我在 Amazon Web Service (AWS)-EC2 上使用 Apache-Spark 来加载和处理数据。我创建了一个主节点和两个从节点。在主节点上,我有一个目录data,其中包含要处理的所有 csv 格式的数据文件。

现在在我们提交驱动程序(这是我的python代码)运行之前,我们需要将数据目录data从主节点复制到所有从节点。根据我的理解,我认为这是因为每个从节点都需要知道数据文件在自己的本地文件系统中的位置,以便它可以加载数据文件。例如,

from pyspark import SparkConf, SparkContext

### Initialize the SparkContext
conf = SparkConf().setAppName("ruofan").setMaster("local")
sc = SparkContext(conf = conf)

### Create a RDD containing metadata about files in directory "data"
datafile = sc.wholeTextFiles("/root/data")  ### Read data directory 

### Collect files from the RDD
datafile.collect() 

每个从节点运行任务时,会从本地文件系统中加载数据文件。

但是,在我们提交我的应用程序以运行之前,我们还必须使用 $ ./ephemeral-hdfs/bin/hadoop fs -put /root/data/ ~ 将目录 data 放入 Hadoop 分布式文件系统 (HDFS)。

现在我对这个过程感到困惑。每个从节点是否从自己的本地文件系统或 HDFS 加载数据文件?如果它从本地文件系统加载数据,为什么我们需要将data放入HDFS?如果有人可以帮助我,我将不胜感激。

【问题讨论】:

  • 我不太确定我是否理解这里的问题。如果您的数据在 s3 上可用,为什么要尝试将其放在 hdfs 上?
  • 只是一个错字。已经修好了。

标签: amazon-web-services amazon-ec2 apache-spark filesystems hdfs


【解决方案1】:

只是为了澄清可能会看到这篇文章的其他人。

我相信您的困惑是由于没有在文件位置提供协议。当您执行以下行时:

### Create a RDD containing metadata about files in directory "data"
datafile = sc.wholeTextFiles("/root/data")  ### Read data directory 

Spark 假定文件路径 /root/data 位于 HDFS 中。换句话说,它会在 hdfs:///root/data 中查找文件。

您只需要将文件放在一个位置,可以是每个节点本地(在存储方面不是最有效的),也可以是分布在节点间的 HDFS。

如果您想从本地读取文件,请使用 file:///path/to/local/file。如果您想使用 HDFS,请使用 hdfs:///path/to/hdfs/file

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    一个快速的建议是从 S3 加载 csv,而不是在本地加载。

    这是一个示例 scala sn-p,可用于从 S3 加载存储桶

    val csvs3Path = "s3n://REPLACE_WITH_YOUR_ACCESS_KEY:REPLACE_WITH_YOUR_SECRET_KEY@REPLACE_WITH_YOUR_S3_BUCKET"
    val dataframe = sqlContext.
                        read.
                        format("com.databricks.spark.csv").
                        option("header", "true").
                        load(leadsS3Path)
    

    【讨论】:

    • 其实我知道有办法使用S3,而且我也很熟悉怎么做。我的问题是,每个从节点是从自己的本地文件系统还是从 HDFS 加载数据?如果它从本地文件系统加载数据,为什么我们需要在提交运行之前将数据放入HDFS?
    • @RuofanKong 这只是一个建议,因为您正在运行 AWS 的所有内容,最好在 S3 中使用 CSV。
    • 感谢您的评论!事实上,我知道使用 S3 更好......我在这里发布问题的原因是我想澄清加载文件过程的概念,以便每个有相同问题的人都可以得到帮助,而不是只选择更好的方法。 .. 到目前为止,我想我仍然有一个问题:每个从节点是从自己的本地文件系统还是从 HDFS 加载数据?如果它从本地文件系统加载数据,为什么我们需要在提交运行之前将数据放入 HDFS 中?非常感谢您帮助我解决概念问题。
    • 我没有使用 HDFS 处理 spark。但从概念上讲,当您在 HDFS 中归档时,您不需要在每个节点的本地文件系统中都存在该文件。您可以像text_file = spark.textFile("hdfs://...") 一样阅读文件。同样,当您要从本地文件系统中读取文件时,每个节点都应该将文件放在同一目录中,并且不需要是 HDFS 的一部分。你可以像 spark.textFile("/home/user/somefile.csv") 这样加载它。 spark.apache.org/docs/latest/…
    • 再次感谢您的评论。是的,我完全同意你的看法。我已经阅读了本教程 10 多次,因此我理解了整个事情。但是当您在 AWS 上运行 spark 时,情况就不同了。我真的不明白如果我使用本地文件系统,为什么我必须将本地文件放入 HDFS。如果你想使用本地文件系统,但不把文件放到HDFS,会报错!这很奇怪。这就是我在这里发布我的问题的原因............我真的很想知道这个问题背后的概念......我希望你明白我的意思......
    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2018-02-21
    • 2015-02-07
    • 2018-07-07
    相关资源
    最近更新 更多