gpfdist可寫外部表協議介紹

原文鏈接

  • gpfdist 支持可讀外部表和可寫外部表。本文將介紹可寫外部表如何工作。

介紹

可寫外部表的目的是將GPDB中的數據併發地從segment上導出到遠程服務器上的text或CSV格式文件中,可支持壓縮選項。所有的segments直接導出自己的數據到gpfdist外部服務器,而不需要首先經過master。

可寫外部表和可讀外部表有類似的HTTP結構。GPDB segment作爲http client,將數據post到http server(gpfdist)。不過可寫外部表的通信協議和可讀外部表並不相同。它並不會在一個HTTP連接中完成任何處理,而是通過一個HTTP請求序列(最少數量是3)。可寫外部表僅支持協議版本0,就是說數據以原始格式傳輸,元數據通過header字段發送。附加的控制信息通過inital和teardown連接發送。

HTTP Header

可寫外部表用到的所有header字段解釋如下:

Header Message type Required description
X-GP-XID Request Y transaction id
X-GP-CID Request Y command id
X-GP-SN Request Y scan counter
X-GP-SEGMENT-ID Request N segment id
X-GP-SEGMENT-COUNT Request N Segment count
X-GP-LINE-DELIM-LENGTH Request N length of line ending
X-GP-PROTO Request/Response Y protocol version, only 0 for writable external table
X-GP-SEQ Request Y Sequence number of data request
X-GPFDIST-VERSION Response N Gpfdist version
X-GP-DONE Request N Indicates the full write operation is done on this segment
X-GP-DATABASE Request N current database name

大多數字段含義和可讀外部表中一致。這裏只解釋可寫外部表中最重要的幾個字段。

X-GP-SEQ

  • 如前面所述,GPDB的每個segment會發送至少3個http請求來完成一次完整的上傳操作。包括一個初始化請求,若干個數據請求和一個teardown請求。GPDB的每個segment使用X-GP-SEQ 統計當前到gpfdist的連接數。每個segment自己擁有獨立的序列號。
    (譯註:每個任務都從1開始,還是每個segment累積??)

X-GP-DONE

  • 該字段用於指示整個上傳操作是否結束。它可以替代teardown請求。Gpfdist在關閉session之前需要等待每個segment的(所有)teardown消息。

HTTP請求類型

有3種類型的HTTP請求:初始化請求,數據請求和teardown請求。Gpfdist使用http 1.0協議,因此每個HTTP連接只能處理一個請求。在可寫外部表上的每個查詢將會包含一個初始化請求,一個或多個數據請求以及一個teardown請求。具體如下:

初始化請求

  • 每個segment通過inital請求開始上傳數據。inital請求post一個空的數據包(Content-Length是0),且 X-GP-SEQ 字段被設置爲1. Gpfdist 記錄這個session,並回復一個空的響應。inital請求初始化segment的數據傳輸流程。
  • 以下是一個示例:
POST /lineite_wtite HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
X-GP-XID: 1502765779-0000000095
X-GP-CID: 0
X-GP-SN: 0
X-GP-SEGMENT-ID: 0
X-GP-SEGMENT-COUNT: 3
X-GP-LINE-DELIM-LENGTH: -1
X-GP-PROTO: 0
X-GP-SEQ: 1
Content-Type: text/xml
Content-Length: 0
HTTP/1.0 200 ok
Content-type: text/plain
Expires: 0
X-GPFDIST-VERSION: 5.0.0
X-GP-PROTO: 0
Cache-Control: no-cache
Connection: close

數據請求

  • 數據請求是一個POST請求,URL和initial請求相同。如果數據內容長度大於writable_external_table_bufsize(單個包POST請求包的最大大小)將會有多個數據請求。數據請求包含一個"Expect: 100-continue"的header。如果gpfdist server已經準備好接受該數據請求,它將回復"HTTP/1.1 100 Continue"的響應。在收到gpfdist的"continue"響應之後,GPDB segment將會開始POST數據。
  • 以下是一個數據請求示例:
POST /lineite_wtite HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
X-GP-XID: 1502765779-0000000095
X-GP-CID: 0
X-GP-SN: 0
X-GP-SEGMENT-ID: 0
X-GP-SEGMENT-COUNT: 3
X-GP-LINE-DELIM-LENGTH: -1
X-GP-PROTO: 0
X-GP-SEQ: 606
Content-Type: text/xml
Content-Length: 65507
Expect: 100-continue
HTTP/1.1 100 Continue
33|605187|55200|2|32.00|34948.80|0.02|0.05|A|F|1993-12-09|1994-01-04|1993-12-28|COLLECT COD |MAIL |gular theodolites
33|1374686|99700|3|5.00|8803.10|0.05|0.03|A|F|1993-12-09|1993-12-25|1993-12-23|TAKE BACK RETURN |AIR |. stealthily bold exc
33|339175|39176|4|41.00|49780.56|0.09|0.00|R|F|1993-11-09|1994-01-24|1993-11-11|TAKE BACK RETURN |MAIL |unusual packages doubt caref
...

Teardown 請求

  • Teardown請求是所有數據請求之後的最終請求,其HTTP data爲空,header中包含”GP-DONE”字段且值爲1。當gpfdist收到teardown請求後,它會回覆一個空的響應報文,並清理連接資源。
  • 以下是teardown請求示例:
POST /lineite_wtite HTTP/1.1
Host: 127.0.0.1:8080
Accept: */*
X-GP-XID: 1502765779-0000000095
X-GP-CID: 0
X-GP-SN: 0
X-GP-SEGMENT-ID: 0
X-GP-SEGMENT-COUNT: 3
X-GP-LINE-DELIM-LENGTH: -1
X-GP-PROTO: 0
X-GP-SEQ: 608
Content-Type: text/xml
X-GP-DONE: 1
Content-Length: 0
HTTP/1.0 200 ok
Content-type: text/plain
Expires: 0
X-GPFDIST-VERSION: 5.0.0
X-GP-PROTO: 0
Cache-Control: no-cache
Connection: close

可寫外部表工作原理

  • 和可寫讀部表類似,gpfdist server會依據transaction id,command id,scan count參數,對來自segments的請求進行按sessions進行分組。Gpfdist會將相同session的數據寫到同一個文件。
  • 可寫外部協議使用Protocol 0在Greenplum segment和gpfdist之間交換控制信息和數據。segment通過initial request發起寫流程,其後是一系列數據請求。Segment只寫屬於他們自己的數據,寫完後發送teardown表示已經沒有更多的數據。
  • 下圖演示了一個Segment上三種類型的請求序列
    這裏寫圖片描述

  • 當所有segments完成數據傳輸,gpfdist將會關閉session並完成對目標文件的寫入操作。

可寫外部表GUC

  • 有一些控制可寫外部錶行爲的GUC參數如下:

Writable_external_table_bufsize

  • 該值用於控制每個數據請求中可以發送多少數據。這個值是最大buffer大小。如網絡良好的情況下,增大該值可以改善數據傳輸效率。

概述

  • 到目前爲止,我們介紹了可讀、可寫外部表。這將有助於診斷外部表傳輸失敗問題,或設計你的新服務器。此外,還有很多可改善gpfdist協議的方面。比如,我們可以對傳輸的數據進行壓縮,或使用最新的HTTP 2.0協議。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章