我正在使用亚马逊网络服务(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 Distributed File System (HDFS)。
现在我对这个过程感到困惑。每个从节点是否从自己的本地文件系统或HDFS加载数据文件?如果它从本地文件系统加载数据,为什么我们需要将data放入HDFS?如果有人能帮我,我将不胜感激。
发布于 2016-06-01 22:34:24
只是为了澄清可能会在这篇文章中遇到的其他人。
我相信您的困惑是由于没有在文件位置提供协议。在执行以下代码行时:
### Create a RDD containing metadata about files in directory "data"
datafile = sc.wholeTextFiles("/root/data") ### Read data directory Spark假定文件路径//data Spark在HDFS中。换言之,它在hdfs:///root/data.中查找文件
您只需要将文件放在一个位置,或者在每个节点的本地位置(就存储效率而言不是最有效的位置),或者放在分布在节点上的HDFS中。
如果要从本地读取文件,请使用file:///path/to/local/file.如果您希望使用HDFS,请使用hdfs:///path/to/hdfs/file.
希望这能有所帮助。
发布于 2015-07-23 15:00:04
一个快速建议是从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)https://stackoverflow.com/questions/31578986
复制相似问题