簡體   English   中英

Google Cloud Data Fusion——從 REST API 端點源構建管道

[英]Google Cloud Data Fusion -- building pipeline from REST API endpoint source

嘗試構建管道以從 3rd 方 REST API 端點數據源讀取。

我正在使用 Hub 中的 HTTP(1.2.0 版)插件。

響應請求 URL 為: https://api.example.io/v2/somedata?return_count=false : https://api.example.io/v2/somedata?return_count=false

響應體示例:

{
  "paging": {
    "token": "12456789",
    "next": "https://api.example.io/v2/somedata?return_count=false&__paging_token=123456789"
  },
  "data": [
    {
      "cID": "aerrfaerrf",
      "first": true,
      "_id": "aerfaerrfaerrf",
      "action": "aerrfaerrf",
      "time": "1970-10-09T14:48:29+0000",
      "email": "example@aol.com"
    },
    {...}
  ]
}

日志中的主要錯誤是:

java.lang.NullPointerException: null
    at io.cdap.plugin.http.source.common.pagination.BaseHttpPaginationIterator.getNextPage(BaseHttpPaginationIterator.java:118) ~[1580429892615-0/:na]
    at io.cdap.plugin.http.source.common.pagination.BaseHttpPaginationIterator.ensurePageIterable(BaseHttpPaginationIterator.java:161) ~[1580429892615-0/:na]
    at io.cdap.plugin.http.source.common.pagination.BaseHttpPaginationIterator.hasNext(BaseHttpPaginationIterator.java:203) ~[1580429892615-0/:na]
    at io.cdap.plugin.http.source.batch.HttpRecordReader.nextKeyValue(HttpRecordReader.java:60) ~[1580429892615-0/:na]
    at io.cdap.cdap.etl.batch.preview.LimitingRecordReader.nextKeyValue(LimitingRecordReader.java:51) ~[cdap-etl-core-6.1.1.jar:na]
    at org.apache.spark.rdd.NewHadoopRDD$$anon$1.hasNext(NewHadoopRDD.scala:214) ~[spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) ~[spark-core_2.11-2.3.3.jar:2.3.3]
    at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:439) ~[scala-library-2.11.8.jar:na]
    at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:439) ~[scala-library-2.11.8.jar:na]
    at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:439) ~[scala-library-2.11.8.jar:na]
    at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$4.apply(SparkHadoopWriter.scala:128) ~[spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$4.apply(SparkHadoopWriter.scala:127) ~[spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1415) ~[spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.internal.io.SparkHadoopWriter$.org$apache$spark$internal$io$SparkHadoopWriter$$executeTask(SparkHadoopWriter.scala:139) [spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$3.apply(SparkHadoopWriter.scala:83) [spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.internal.io.SparkHadoopWriter$$anonfun$3.apply(SparkHadoopWriter.scala:78) [spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) [spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.scheduler.Task.run(Task.scala:109) [spark-core_2.11-2.3.3.jar:2.3.3]
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345) [spark-core_2.11-2.3.3.jar:2.3.3]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_232]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_232]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_232]

可能的問題

在嘗試解決此問題一段時間后,我認為問題可能出在

分頁

  • Data Fusion HTTP插件有很多處理分頁的方法
    • 根據上面的響應正文,分頁類型的最佳選擇似乎是響應正文中的Link in Response Body
    • 對於所需的Next Page JSON/XML Field Path參數,我嘗試了$.paging.nextpaging/next 都不工作。
    • 我已驗證/paging/next中的鏈接在 Chrome 中打開時有效

驗證

  • 當只是嘗試在 Chrome 中查看響應 URL 時,會彈出一個提示,要求輸入用戶名和密碼
    • 只需要輸入用戶名的 API 密鑰即可在 Chrome 中通過此提示
    • 為此,在 Data Fusion HTTP 插件中,API 密鑰用於基本身份驗證部分中的用戶名

有沒有人在 Google Cloud Data Fusion 中創建數據源是 REST API 的管道方面取得成功?

在回答

有沒有人在 Google Cloud Data Fusion 中創建數據源是 REST API 的管道方面取得成功?

這不是實現這一目標的最佳方法,最好的方法是將數據服務 API 概述攝取到發布/訂閱,然后您將使用發布/訂閱作為管道的源,這將為您的數據提供一個簡單可靠的暫存位置它用於處理、存儲和分析,請參閱發布/訂閱 API 的文檔。 為了將其與 Dataflow 結合使用,要遵循的步驟在此處的官方文檔中使用 Pub/Sub 與 Dataflow

我認為您的問題在於您收到的數據格式。 例外:

java.lang.NullPointerException: null

當您沒有指定正確的輸出模式時發生(我相信在這種情況下沒有模式)

解決方案1

要解決它,請嘗試將 HTTP Data Fusion 插件配置為:

  • 接收格式:文本。
  • 輸出架構:名稱:用戶類型:字符串

這應該可以從 API 以字符串格式獲取響應。 完成后,使用 JSONParser 將字符串轉換為類似表的對象。

解決方案2

將 HTTP 數據融合插件配置為:

  • 接收格式:json
  • JSON/XML 結果路徑:數據
  • JSON/XML 字段映射:包括您提供的字段(見附件照片)。

HTTP插件配置

暫無
暫無

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

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