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的結果來獲得環境變量要設置的值。

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