簡體   English   中英

將錯誤從 catch 塊記錄到 Cosmos db - spark

[英]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 嗎?

也許現在不是使用火花的好時機。 已經有一些 hadoop 工具可以使用 hadoop完成這種類型的S3 文件傳輸,它可以完成您正在做的事情,但使用了 hadoop 工具。

如果您仍然覺得 spark 是正確的工具:將其拆分為報告問題和數據傳輸問題。 創建並測試文件列表以查看它們是否有效。 編寫一個 UDF 來完成創建好/壞文件數據框的骯臟工作。 報告無效的文件。 (對宇宙)

傳輸有效的文件。

如果要將錯誤寫入 cosmo DB,則需要使用“帶外”方法從執行程序啟動連接。(想想:從 partition.foreach 內部啟動 jdbc 連接。)

作為較低的標准,如果您想知道它是否發生,您可以使用Accumulators 這不是用於日志記錄,而是有助於將信息從執行程序傳輸到驅動程序。 這將使您能夠向 Cosmos 回寫一些內容,但實際上只是用於簡單地計算是否發生了某些事情。 (如果您最終重試執行程序,則可能會重復計算,所以它並不完美。)它在技術上可以將信息傳輸回驅動程序,但只能用於可數的事情。 (如果這種類型的故障非常不規律,則可能適合。如果這種情況經常發生,則不適合使用。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM