目標:- 使用“get”api 呼叫從 S3 存盤桶中檢索物件,將檢索到的物件寫入 azure 資料湖,并在出現 404s(未找到物件)等錯誤時將錯誤訊息寫入 Cosmos DB
“my_dataframe”由一列 (s3ObjectName) 組成,物件名稱如下:-
| s3 物件名稱 |
|---|
| a1.json |
| b2.json |
| c3.json |
| d4.json |
| e5.json |
//retry function that writes cosmos error in event of failure
def retry[T](n: Int)(fn: => T): T = {
Try {
return fn
} match {
case Success(x) => x
case Failure(t: Throwable) => {
Thread.sleep(1000)
if (n > 1) {
retry(n - 1)(fn)
} else {
val loggerDf = Seq((t.toString)).toDF("Description")
.withColumn("Type", lit("Failure"))
.withColumn("id", uuid())
loggerDf.write.format("cosmos.oltp").options(ExceptionCfg).mode("APPEND").save()
throw t
}
}
}
}
//execute s3 get api call
my_dataframe.rdd.foreachPartition(partition => {
val creds = new BasicAWSCredentials(AccessKey, SecretKey)
val clientRegion: Regions = Regions.US_EAST_1
val s3client = AmazonS3ClientBuilder.standard()
.withRegion(clientRegion)
.withCredentials(new AWSStaticCredentialsProvider(creds))
.build()
partition.foreach(x => {
retry (2) {
val objectKey = x.getString(0)
val i = s3client.getObject(s3bucket_name, objectKey).getObjectContent
val inputS3String = IOUtils.toString(i, "UTF-8")
val filePath = s"${data_lake_file_path}"
val file = new File(filePath)
val fileWriter = new FileWriter(file)
val bw = new BufferedWriter(fileWriter)
bw.write(inputS3String)
bw.close()
fileWriter.close()
}
})
})
執行上述操作時,會導致以下錯誤:-
引起:java.lang.NullPointerException
當要求創建資料幀 loggerDf 并將其寫入 cosmos db 時,重試函式中會出現此錯誤
還有另一種方法可以將錯誤訊息寫入 cosmos DB 嗎?
uj5u.com熱心網友回復:
也許現在不是使用火花的好時機。已經有一些 hadoop 工具可以使用 hadoop完成這種型別的S3 檔案傳輸,它可以完成您正在做的事情,但使用了 hadoop 工具。
如果您仍然覺得 spark 是正確的工具:將其拆分為報告問題和資料傳輸問題。創建并測驗檔案串列以查看它們是否有效。撰寫一個 UDF 來完成創建好/壞檔案資料框的骯臟作業。報告無效的檔案。(對宇宙)
傳輸有效的檔案。
uj5u.com熱心網友回復:
如果要將錯誤寫入 cosmo DB,則需要使用“帶外”方法從執行程式啟動連接。(想想:從 partition.foreach 內部啟動 jdbc 連接。)
作為較低的標準,如果您想知道它是否發生,您可以使用Accumulators。這不是用于日志記錄,而是有助于將資訊從執行程式傳輸到驅動程式。這將使您能夠向 Cosmos 回寫一些內容,但實際上只是用于簡單地計算是否發生了某些事情。(如果您最終重試執行程式,則可能會重復計算,所以它并不完美。)它在技術上可以將資訊傳輸回驅動程式,但只能用于可數的事情。(如果這種型別的故障非常不規律,則可能適合。如果這種情況經常發生,則不適合使用。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/318739.html
