我在使用 spark 讀取和寫入檔案到“遠程”檔案系統(例如 hadoop)時遇到問題。
內容
- 我在當地做了什么?
- 我想在“遠程”上做什么?
1. 我在本地做了什么?
至于現在,我在本地使用 spark - 將檔案讀取和寫入我的設備,如下所示:
Spark會話初始化:
val spark: SparkSession = Try(
SparkSession.builder()
.master("local[*]")
.appName("app")
.getOrCreate()) match {
case Success(session)=>session
case Failure(exception)=> throw new Exception(s"Failed initializing spark, due to: ${exception.getMessage}")
}
在本地保存/寫入,然后加載/讀取它:
(Json 檔案)
val content = "{"a": 10, "b": [], "c": {"x": "1", "z": {}}, {"x": "2", "z": {}}}" // dummy JSON as string
val fileName = "full_path/sample.json"
// ... verify directory exists and create it if not ...
// write sample.json with the content above:
new PrintWriter(fileName) {
write(content)
close()
}
// Read & Operate on it:
val jsonAsBufferedSource = Source.fromFile(fileName)
(Scala 的案例類)
case class Dummy(string: String, i: Int) extends Serializable {}
val content = Dummy("42 is the best number", 42) // Dummy instance
val fileName = "full_path/sample.dummy" // 'dummy' is the serialized saved-object name.
// ... verify directory exists and create it if not ...
// Write it:
val output = new ObjectOutputStream(new FileOutputStream(fileName))
output.writeObject(content)
output.close()
// Read:
val input = new ObjectInputStream(new FileInputStream(fileName))
val dummyObject = input.readObject.asInstanceOf[Dummy]
input.close()
// Operate:
dummyObject.i // 42
2. 我想在“遠程”上做什么?
我希望能夠使用 spark 在 HDFS、S3 或任何其他可用的“遠程”檔案系統上讀/寫,就像我在本地所做的那樣。
大多數情況下,我的問題是:
- Spark 配置:應該更改什么以及如何更改?[主人等]
- 使用 Spark:
- 我如何保存和加載可序列化物件,就像我在本地所做的那樣?
- 如何保存 Json 字串,并將其作為 BufferedSource 加載?
一般來說 - 我想讓自己在本地/遠程使用與我的應用程式相同的“內部介面”作業。
感謝您的閱讀!
編輯
我希望我的應用程式在測驗和除錯時將檔案保存/讀取到磁盤并在我的計算機磁盤上作業。我希望它在生產時使用遠程檔案系統進行保存/讀取。
是否可以使用相同的火花方法?用什么火花配置?
奧倫
uj5u.com熱心網友回復:
不確定我理解這個問題。Spark 使用 file:// 和 hdfs:// 或 s3a:// 前綴都是一樣的。錯誤的是 Source.fromFile 和 PrintWriter
您需要重寫函式以使用正確的 Spark 方法,因為 Spark 旨在在集群中運行,而不是與一臺機器(稱為驅動程式)隔離
// read all JSON files in a folder
val df = spark.read.json("file:///path/to/full_path/")
// write the dataframe to HDFS folder
df.write.format("json").save("hdfs://namenode.fqdn:port/hdfs/path/")
當然,您可以序列化一個類,“本地”寫入檔案(當 時為“遠程” deploy-mode=cluster),然后上傳該檔案,但這似乎不是您在這里所做的。而不是這樣做,您將parellelize是Seq序列化物件的一個??。
使用json4s而不是 ObjectOutputStream 從案例類中獲取 JSON。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382772.html
標籤:json 斯卡拉 阿帕奇火花 Hadoop 亚马逊-s3
上一篇:如何“加入”二次或三次樣條?
下一篇:Python網路爬蟲并存入資料庫
