[英]log error from catch block to cosmos db - spark
目標:- 使用“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 嗎?
如果要將錯誤寫入 cosmo DB,則需要使用“帶外”方法從執行程序啟動連接。(想想:從 partition.foreach 內部啟動 jdbc 連接。)
作為較低的標准,如果您想知道它是否發生,您可以使用Accumulators 。 這不是用於日志記錄,而是有助於將信息從執行程序傳輸到驅動程序。 這將使您能夠向 Cosmos 回寫一些內容,但實際上只是用於簡單地計算是否發生了某些事情。 (如果您最終重試執行程序,則可能會重復計算,所以它並不完美。)它在技術上可以將信息傳輸回驅動程序,但只能用於可數的事情。 (如果這種類型的故障非常不規律,則可能適合。如果這種情況經常發生,則不適合使用。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.