Spark每日半小时(21)——文件系统

本地/“常规”文件系统

Spark支持从本地文件系统中读取文件,不过它要求文件在集群中所有节点的相同路径下都可以找到。

一些像NFS、AFS以及MapR的NFS layer这样的网络文件系统会把文件以常规文件系统的形式暴露给用户。如果你的数据已经在这些系统中,那么你只需要指定输入为一个file://路径;只要这个文件系统挂载在每个节点的同一个路径下,Spark就会自动处理

JavaRDD<String> lines = sc.textFile("file://home/holden/happypandas.gz");

如果文件还没有放在集群中的所有节点上,你可以在驱动器程序中从本地读取该文件而无需使用整个集群,然后再调用parallelize将内容分发给工作节点。不过这种方式可能会比较慢,所以推荐的方法是将文件先放到像HDFS、NFS、S3等共享文件系统上。

Amazon S3

用Amazon S3来存储大量数据正日益流行。当计算节点部署再Amazon EC2上的时候,使用S3作为存储尤其快,但是在需要通过公网访问数据时性能会差很多。

要在Spark中访问S3数据,你应该首先把你的S3访问凭据设置为AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量。你可以从Amazon Web Service控制台创建这些凭据。接下来,将一个以s3n://开头的路径以s3n://bucket/path-within-bucket的形式传给Spark的输入方法。和其他所有文件系统一样,Spark也能在S3路径中支持通配字符,例如s3n://bucket/my-Files/*.txt。

如果你从Amazon那里得到S3访问权限错误,请确保你指定了访问密钥的账号对数据桶有“read”和“list”的权限。Spark需要列出桶内的内容,来找到想要读取的数据。

HDFS

Hadoop分布式文件系统是一种广泛使用的文件系统,Spark能够很好地使用它。HDFS被设计为可以在廉价地硬件上工作,有弹性地应对节点失败,同时提供高吞吐量。Spark和HDFS可以部署在同一批机器上,这样Spark可以利用数据分布来尽量避免一些网络开销。

在Spark中使用HDFS只需要将输入输出路径指定为hdfs://master:port/path就够了。

HDFS协议随Hadoop版本改变而变化,因此如果你使用地Spark是依赖于另一个版本地Hadoop编译的,那么读取会失败。默认情况下,Spark基于Hadoop1.0.4编译。如果从源代码编译,你可以在环境变量中指定SPARK_HADOOP_VERSION=来基于另一个版本的Hadoop进行编译;也可以直接下载预编译好的Spark版本。你可以根据运行hadoop version的结果来获得环境变量要设置的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章