我在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()
当每个从属节点运行任务时,它从本地文件系统加载数据文件。
但是,在我们提交要运行的应用程序之前,我们还必须使用data
将目录$ ./ephemeral-hdfs/bin/hadoop fs -put /root/data/ ~
放入Hadoop分布式文件系统(HDFS)中。
现在我对这个过程感到困惑。每个从节点是否从其自己的本地文件系统或HDFS加载数据文件?如果它从本地文件系统加载数据,为什么我们需要将data
放入HDFS?如果有人能帮助我,我将不胜感激。
答案 0 :(得分: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 。
希望这有帮助。
答案 1 :(得分:0)
一个快速建议是从S3加载csv而不是在本地加载。
这是一个示例scala片段,可用于从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)