<input id="0qass"><u id="0qass"></u></input>
  • <input id="0qass"><u id="0qass"></u></input>
  • <menu id="0qass"><u id="0qass"></u></menu>

    Kettle構建Hadoop ETL實踐(十):并行、集群與分區

    目錄

    一、數據分發方式與多線程

    1. 數據行分發

    2. 記錄行合并

    3. 記錄行再分發

    4. 數據流水線

    5. 多線程的問題

    6. 作業中的并行執行

    二、Carte子服務器

    1. 創建Carte子服務器

    2. 定義子服務器

    3. 遠程執行

    4. 監視子服務器

    5. Carte安全

    6. 服務

    三、集群轉換

    1. 定義一個靜態集群

    2. 設計集群轉換

    3. 執行和監控

    4. 元數據轉換

    5. 配置動態集群

    四、數據庫分區

    1. 在數據庫連接中使用集群

    2. 創建數據庫分區schemas

    3. 啟用數據庫分區

    4. 數據庫分區示例

    5. 集群轉換中的分區

    五、小結


    ? ? ? ? 本專題前面系列文章詳細說明了使用Kettle的轉換和作業,實現Hadoop上多維數據倉庫的ETL過程。通常Hadoop集群存儲的數據量是TB到PB,如果Kettle要處理如此多的數據,就必須考慮如何有效使用所有的計算資源,并在一定時間內獲取執行結果。

    ? ? ? ? 作為本專題的最后一篇文章,將深入介紹Kettle轉換和作業的垂直和水平擴展。垂直擴展是盡可能使用單臺服務器上的多個CPU核,水平擴展是盡可能使用多臺計算機,使它們并行計算。第一部分先介紹轉換內部的并行機制和多種垂直擴展方法。然后說明怎樣在子服務器集群環境下進行水平擴展。最后描述如何利用Kettle數據庫分區進一步提高并行計算的性能。

    一、數據分發方式與多線程

    ? ? ? ? 在“Kettle與Hadoop(一)Kettle簡介”中,我們知道了轉換的基本組成部分是步驟,而且各個步驟是并行執行的?,F在將更深入解釋Kettle的多線程能力,以及應該如何通過這種能力垂直擴展一個轉換。

    ? ? ? ? 默認情況下,轉換中的每個步驟都在一個隔離的線程里并行執行。但可以為任何步驟增加線程數,我們也稱之為“拷貝”。這種方法能夠提高那些消耗大量CPU時間的轉換步驟的性能。來看一個簡單的例子,如圖10-1所示,“×2”的符號表示該步驟將有兩份拷貝同時運行。右鍵單擊步驟,選擇菜單中的“改變開始復制的數量”,在彈出的對話框設置步驟線程數。

    圖10-1 在多個拷貝下運行一個步驟

    ? ? ? ? 注意所有步驟拷貝只維護一份步驟的描述。也就是說,一個步驟僅是一個任務的定義,而一個步驟拷貝則表示一個實際執行任務的線程。

    1. 數據行分發

    ? ? ? ? Kettle轉換中,各步驟之間行集(row set)的發送有分發和復制兩種方式,我們用一個簡單的例子輔助說明。定義一個轉換,以t1表作為輸入,輸出到表t2和t3。t1表中有1-10十個整數。當創建第二個跳(hop)時,會彈出一個警告窗口,如圖10-2所示。

    圖10-2 一個警告對話框

    ? ? ? ? 表輸入步驟將向兩個表輸出步驟發送數據行,此時可以選擇采用分發或復制兩種方式之一,缺省為分發方式。分發方式執行后,t2、t3表的數據如下。

    mysql> select * from t2; ? ? ? ? ? ? ?mysql> select * from t3;
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | a ? ?|?? ??? ??? ??? ??? ??? ??? ? ?| a ? ?|
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | ? ?1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?2 |
    | ? ?3 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?4 |
    | ? ?5 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?6 |
    | ? ?7 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?8 |
    | ? ?9 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 10 |
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    5 rows in set (0.00 sec) ? ? ? ? ? ? ?5 rows in set (0.00 sec)

    ? ? ? ? 本例中,“表輸入”步驟里的記錄發送給兩個“表輸出”步驟。默認情況下,分發工作使用輪詢方式進行。也就是第一表輸出步驟獲取第一條記錄,第一表輸出步驟獲取第二條記錄,如此循環,直到沒有記錄分發為止。

    ? ? ? ? 復制方式是將全部數據行發送給所有輸出跳,例如同時往數據庫表和文件里寫入數據。本例以復制方式執行后,t2、t3表都將具有t1表的全部10行數據。通常情況下每一條記錄僅僅處理一次,所以復制的情況用的比較少。下面看一下多線程分發的情況。圖10-3所示的轉換中,輸入單線程,兩個輸出,一個單線程、另一個兩線程。

    圖10-3 兩個表輸出步驟一個單線程、另一個兩線程

    轉換執行后,t2、t3表的數據如下。輸入線程輪詢分發,單線程輸出每次寫一行,兩線程輸出每次寫兩行。

    mysql> select * from t2; ? ? ? ? ? ? ?mysql> select * from t3;
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | a ? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| a ? ?|
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | ? ?1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?3 |
    | ? ?4 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?6 |
    | ? ?7 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?2 |
    | ? 10 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?9 |
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?5 |
    4 rows in set (0.00 sec) ? ? ? ? ? ? ?| ? ?8 |
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? +------+
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6 rows in set (0.00 sec)

    圖10-4所示的轉換中,輸入單線程、兩個輸出均為兩線程。

    圖10-4?兩個表輸出步驟均為兩線程

    轉換執行后,t2、t3表的數據如下。輸入線程向兩個輸出步驟輪詢分發數據行,兩個輸出步驟每次寫兩行。

    mysql> select * from t2; ? ? ? ? ? ? ?mysql> select * from t3;
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | a ? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| a ? ?|
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | ? ?2 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?4 |
    | ? ?6 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?3 |
    | ? ?1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?8 |
    | ? 10 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?7 |
    | ? ?5 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | ? ?9 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4 rows in set (0.00 sec)
    +------+
    6 rows in set (0.00 sec)

    2. 記錄行合并

    ? ? ? ? 前面例子都是表輸入步驟為單線程的情況。當有幾個步驟或者一個步驟的多份拷貝同時發送給單個步驟拷貝時,會發生記錄行合并,如圖10-5所示。

    圖10-5?合并記錄行

    轉換執行后,t2、t3表的數據如下??梢钥吹?#xff0c;每個輸入線程都以分發方式并行將數據行依次發給每個輸出跳,結果t2表數據為兩倍的單數、而t3表數據為兩倍的雙數。

    mysql> select * from t2; ? ? ? ? ? ? ?mysql> select * from t3;
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | a ? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| a ? ?|
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | ? ?1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?2 |
    | ? ?3 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?4 |
    | ? ?5 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?6 |
    | ? ?7 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?8 |
    | ? ?9 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 10 |
    | ? ?1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?2 |
    | ? ?3 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?4 |
    | ? ?5 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?6 |
    | ? ?7 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?8 |
    | ? ?9 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? 10 |
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    10 rows in set (0.00 sec) ? ? ? ? ? ? 10 rows in set (0.00 sec)

    ? ? ? ? 從“表輸出”步驟來看,并不是依次從每個數據源逐條讀取數據行。如果這樣做會導致比較嚴重的性能問題,例如一個步驟輸送數據很慢,而另一個步驟輸送數據很快。實際上數據行都是從前面步驟批量讀取的,因此也不能保證從前面步驟的多個拷貝中讀取記錄的順序!

    3. 記錄行再分發

    ? ? ? ? 記錄行再分發是指,X個步驟拷貝把記錄行發送給Y個步驟拷貝,如圖10-6所示。

    圖10-6?記錄行再分發

    在本例中,兩個表輸入步驟拷貝都把記錄行分發給四個目標表輸出步驟拷貝。這個結果等同于圖10-7的轉換。

    圖10-7?記錄行再分發展開

    ? ? ? ? 從圖10-7可以看出,在表輸入和表輸出步驟之間有X*Y個行緩沖區。本例中兩個源步驟和八個目標步驟之間有16個緩沖區(箭頭)。在設計轉換的時候要記住這一點,如果在轉換末端有很慢的步驟,這些緩存都可能被填滿,這樣會增加內存消耗。默認情況下最大緩沖區的記錄行數是10000(可在轉換屬性雜項標簽頁中的“記錄集合里的記錄數”屬性進行設置),所以內存中能保存的記錄行總數是160000行。

    ? ? ? ? 轉換執行后,t2、t3表的數據如下。輸出為四線程,因此輸入的第一個線程將前四行發送到輸出1,然后將接著的四行發送到輸出2,然后再將接著的四行(此時只剩兩行)發送到輸出1。輸入的第二個線程也同樣執行這樣的過程。最終t2表兩個1、2、3、4、9、10,t3表有兩個5、6、7、8。

    mysql> select * from t2; ? ? ? ? ? ? ?mysql> select * from t3;
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | a ? ?| ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| a ? ?|
    +------+ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | ? ?2 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?8 |
    | ? ?3 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?7 |
    | ? ?4 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?6 |
    | ? 10 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?7 |
    | ? ?3 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?8 |
    | ? ?4 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?5 |
    | ? ?1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?6 |
    | ? ?2 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| ? ?5 |
    | ? ?9 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+------+
    | ? ?1 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?8 rows in set (0.00 sec)
    | ? 10 |
    | ? ?9 |
    +------+
    12 rows in set (0.00 sec)

    ? ? ? ? 由前面這些例子可以總結出分發方式下執行規律:每個輸入步驟線程執行相同的工作,即輪流向每個輸出步驟發送數據行,每次發送的行數等于相應輸出步驟的線程數。但是,當輸入步驟與輸出步驟的線程數相等時并不符合這個規律。不要以為這是個bug,即使它很像,卻是Kettle故意為之,稱為數據流水線。

    4. 數據流水線

    ? ? ? ? 數據流水線是再分發的一種特例,在數據流水線里源步驟和目標步驟的拷貝數相等(X==Y)。此時,前面步驟拷貝的記錄行不是分發到下面所有的步驟拷貝。實際上,由源步驟的拷貝產生的記錄行被發送到具有相同編號的目標步驟拷貝,圖10-8是這種轉換的例子。

    圖10-8?數據流水線

    在技術上,它等同于圖10-9的轉換。

    圖10-9?數據流水線展開

    ? ? ? ? 轉換執行后,t2、t3表的數據與圖10-5所示轉換的執行結果相同。從現象看輸入輸出線程數相等時,結果如同X個獨立的單線程轉換。

    ? ? ? ? 分發和合并記錄的過程會產生一點性能開銷,通常情況下,最好讓連續步驟的拷貝數相等,這樣可以減少開銷。這種減少步驟開銷之間開銷的過程,也可形象地比喻為將數據放進游泳池的泳道,彼此之間不受干擾。

    5. 多線程的問題

    ? ? ? ? 通過前面的學習,我們知道了一個多線程轉換中所有步驟拷貝都并行運行。接下來看這種執行模式可能產生的一些問題,以及如何解決這些問題。

    (1)數據庫連接
    ? ? ? ? 如果多線程軟件處理數據庫連接,推薦的方法是在轉換執行的過程中為每個線程創建單一的連接,使得每個步驟拷貝都使用它們自己的事務或或者事務集,這也正式Kettle的默認配置。但有一個潛在的后果是,如果在同一轉換里使用同一個數據庫資源,如一個表或一個視圖,很容易產生條件競爭問題。

    ? ? ? ? 一個常見的錯誤場景,就是在前面的步驟里向一個關系數據庫表里寫入數據,在隨后的步驟里再讀取這些數據。因為這兩個步驟使用不同的數據庫連接,而且是不同的事務,不能確保第一個步驟寫入的數據,對其它正在執行讀操作的步驟可見。

    ? ? ? ? 解決這個問題的簡單方案是把這個轉換分成兩個不同的轉換,然后將數據保存在臨時表或文件中。另外一個方案是強制讓所有步驟使用單一數據庫連接(僅一個事務),啟用轉換設置對話框“雜項”標簽頁中的“使用唯一連接”選項即可。該選項意味著Kettle里用到的每個命名數據庫都使用一個連接,直到轉換執行完后才提交事務或者回滾。也就是說在執行過程中完全沒有錯誤才提交,有任何錯誤就回滾。請注意,如果錯誤被錯誤處理步驟處理了,事務就不會回滾。使用這個選項的缺點是會降低轉換的性能,原因之一是可能產生較大的事務,另外如果所有步驟和數據庫的通信都由一個步驟的數據庫連接來完成,在服務器端也只有一個服務器進程來處理請求。

    (2)執行的順序
    ? ? ? ? 由于所有步驟并行執行,所以轉換中的步驟沒有特定的執行順序,但是數據集成過程中仍然有些工作需要按某種順序執行。在大多數情況下,通過創建一個作業來解決這個問題,使任務可以按特定的順序執行。在Kettle轉換中,也有些步驟強制按某種順序執行,下面有幾個技巧。

    • “執行SQL腳本”步驟

    ? ? ? ? 如果想在轉換中的其它步驟開始前,先執行一段SQL腳本,可以使用“執行SQL腳本”步驟。正常模式下,這個步驟將在轉換的初始化階段執行SQL,就是說它優先于其它步驟執行。但是如果選中了這個步驟里的“執行每一行”選項,那么該步驟不會提前執行,而是按照在轉換中的順序執行。

    • “Blocking step”步驟

    ? ? ? ? 如果希望所有的數據行都達到某個步驟后,才開始執行一個操作,可以使用“Blocking step”步驟。該步驟的默認配置是丟棄最后一行以外的所有數據,然后把最后一行數據傳遞給下一個步驟。這條數據將觸發后面的步驟執行某個操作,這樣就能確保在后面步驟處理之前,所有數據行已經在前面步驟處理完。

    6. 作業中的并行執行

    ? ? ? ? 默認情況下,作業中的作業項按順序執行,必須等待一個作業項執行完成后才開始執行下一個。然而,正如“https://wxy0327.www.gifted-edu.com/article/details/106348479#4.%20%E5%B9%B6%E8%A1%8C%E6%89%A7%E8%A1%8C”所述,在作業里也可以并行執行作業項。并行執行的情況下,一個作業項之后的多個作業項同時執行,由不同的線程啟動每個并行執行的作業項。例如,希望并行更新多張維度表,可以按照圖10-10的方式設計,選擇Start作業項右鍵菜單中的“Run Next Entries in Parallel”選項即可。

    圖10-10 并行更新多張維度表

    二、Carte子服務器

    ? ? ? ? 子服務器是Kettle的組成模塊,用來遠程執行轉換和作業,物理上體現為Carte進程。Carte是一個輕量級的服務進程,可以支持遠程監控,并為轉換提供集群的能力,集群在下節介紹。子服務器是一個小型的HTTP服務器,也是集群的最小組成模塊。用它來接收遠程客戶端的命令,這些命令用于作業和轉換的部署、管理與監控。

    ? ? ? ? 正如“https://wxy0327.www.gifted-edu.com/article/details/107985148#%EF%BC%883%EF%BC%89Carte”所述,Carte程序用于子服務器遠程執行轉換和作業。啟動子服務器需要指定主機名或IP地址,以及Web服務的端口號。下面在Kettle 8.3版本上,通過一個具體的例子描述子服務器的配置、創建、使用和監控,示例環境如下:
    172.16.1.102:創建Carte子服務器。
    172.16.1.101:創建轉換,并在172.16.1.102上的子服務器上遠程執行。

    1. 創建Carte子服務器

    ? ? ? ? 在172.16.1.102上執行下面的步驟創建子服務器。

    (1)創建配置文件
    ? ? ? ? 在Kettle的早期版本里,通過命令行指定配置選項。隨著配置選項數目的增加,Kettle最近的版本使用XML格式的配置文件。例如創建如下內容的配置文件slave1.xml,描述一臺子服務器的所有屬性:

    <slave_config>
    ? <max_log_lines>0</max_log_lines>
    ? <max_log_timeout_minutes>0</max_log_timeout_minutes>
    ? <object_timeout_minutes>5</object_timeout_minutes>
    ??
    ? <slaveserver>
    ? ? <name>server1</name>
    ? ? <hostname>172.16.1.102</hostname>
    ?? ?<port>8181</port>
    ? </slaveserver>
    </slave_config>

    <slaveserver>節點里描述了子服務器的主機名和監聽端口,另外在配置文件里還可以配置子服務器的其它屬性,用于優化像Carte這樣長時間運行的服務器進程的內存使用。

    • max_log_lines:設置日志系統保存在內存中的最大日志行數。
    • max_log_timeout_minutes:設置保存在內存中的日志行的最大存活時間(分鐘)。對于運行時間很長的轉換和作業,這是一個尤其重要的選項,防止子服務器內存溢出。
    • object_timeout_minutes:默認情況下,在子服務器的狀態報告中,可以看到所有轉換和作業,這個參數可以自動地從狀態報告列表中清除老的作業。

    (2)啟動子服務器

    ./carte.sh ~/kettle_hadoop/slave1.xml

    ? ? ? ? 命令執行在控制臺輸出的最后信息如下,表示子服務器已經啟動成功。

    ...
    2020/12/03 09:32:32 - Carte - Installing timer to purge stale objects after 5 minutes.
    2020/12/03 09:32:33 - Carte - 創建 web 服務監聽器 @ 地址: 172.16.1.102:8181

    2. 定義子服務器

    ? ? ? ? 在172.16.1.101上定義上步創建的子服務器。Spoon左側的“主對象樹”標簽頁中,右鍵單擊“子服務器”樹節點,選擇“新建”。然后在彈出的新建對話框中,填入子服務器的具體屬性,如圖10-11所示。

    圖10-11?定義子服務器

    其中用戶名、密碼都是cluster。定義完子服務器后,可右鍵單擊“server1”樹節點,選擇“Share”共享該子服務器,以便被所有轉換和作業使用。

    3. 遠程執行

    ? ? ? ? 在172.16.1.101上執行下面的步驟遠程執行轉換。

    (1)新建運行配置
    ? ? ? ? 在Spoon左側的“主對象樹”標簽頁中,右鍵單擊“Run configurations”樹節點,選擇“New...”。在彈出對話框中配置運行屬性,如圖10-12所示。

    圖10-12?配置運行屬性

    選擇Pentaho作為運行轉換的引擎時,運行配置對話框的設置部分包含以下選項:

    • Local:選擇本地Pentaho引擎運行。
    • Slave server:選擇此選項可將轉換發送到遠程服務器或Carte群集。
    • Location:指定遠程服務器的位置。
    • Send resources to this server:遠程執行前會將轉換發送到子服務器。此選項是將轉換的相關資源,例如引用的其它文件,也包含在發送到服務器的信息中。

    (2)遠程執行轉換
    ? ? ? ? 在執行轉換時彈出的“執行轉換”對話框里指定要運行轉換的遠程子服務器,如圖10-13中的server1。如果作業或轉換被另一個作業調用,可以在作業或轉換作業項的對話框里選擇一個遠程子服務器,此時作業或轉換作業項即可遠程執行。

    圖10-13?選擇遠程子服務器

    ? ? ? ? 可見所謂遠程執行,只是將本地定義的轉換或作業的元數據及其相關資源傳到遠程子服務器上,然后再在子服務器上執行。轉換或作業中用到的對象,如數據庫連接等,必須在其運行的遠程子服務器的Kettle中已經定義,否則不能正常執行。

    4. 監視子服務器

    ? ? ? ? 有幾種方法可以遠程監視子服務器。

    • Spoon:在Spoon樹形菜單中右鍵單擊子服務器,選擇“Monitor”選項。就會在Spoon中出現一個監控界面,包含了所有運行在子服務器上的轉換和作業的列表,如圖10-14所示。
    • Web瀏覽器:打開一個瀏覽器窗口,輸入子服務器的地址,例如http://172.16.1.102:8181/,瀏覽器將顯示一個子服務器菜單。通過這些菜單項,可以監控子服務器。
    • PDI企業控制臺:這是PDI企業版的一部分,企業控制臺提供了監控和控制子服務器的功能。
    • 自定義的應用:每個子服務器都以URL方式提供服務,返回的結果是XML格式的數據,可以通過它與子服務器通信。如果使用了Kettle的Java庫,還可以利用Kettle的XML接口來解析這些XML。
    圖10-14?在Spoon中監視子服務器

    ? ? ? ? ?除此之外,從子服務器在控制臺終端打印的日志,也可看到轉換或作業的執行信息。

    5. Carte安全

    ? ? ? ? 默認情況下Carte使用簡單的HTTP認證,在文件pwd/kettle.pwd中定義了用戶名和密碼。Kettle默認的用戶名/密碼都是cluster。文件中的密碼可以利用Kettle自帶的Encr工具來混淆。要生成一個Carte密碼文件,使用-carte選項,像這個例子:

    sh encr.sh -carte Password4Carte
    OBF:1ox61v8s1yf41v2p1pyr1lfe1vgt1vg11lc41pvv1v1p1yf21v9u1oyc

    使用文本編輯器,將返回的字符串追加到密碼文件中用戶名的后面:

    Someuser: OBF:1ox61v8s1yf41v2p1pyr1lfe1vgt1vg11lc41pvv1v1p1yf21v9u1oyc

    OBF:前綴告訴Carte這個字符串是被混淆的,如果不想混淆這個文件中的密碼,也可以像下面這樣指定明文密碼:

    Someuser:Password4Carte

    ? ? ? ? 需要注意的是,密碼是被混淆,而不是被加密。Kettle的encr算法僅僅是讓密碼更難識別,但絕不是不能識別。如果一個軟件能讀取這個密碼,必須假設別的軟件也能讀取這個密碼。因此應該給這個密碼文件一些合適的權限。阻止他人未經授權訪問kettle.pwd文件,能降低密碼被破解的風險。

    6. 服務

    ? ? ? ? 子服務器對外提供了一系列服務。表10-1列出了它定義的服務。這些服務位于Web服務的/kettle/的URI下面。在我們的例子里,就是http://172.16.1.102:8181/kettle/。所有服務都有xml=Y選項以返回XML,客戶端就可以解析。表10-1還說明了服務使用的類(包org.pentaho.di.www)。

    服務名稱

    描述

    參數

    Java

    status

    返回所有轉換和作業的狀態

    ?

    SlaveServerStatus

    transStatus

    返回一個轉換的狀態并且列出所有步驟的狀態

    name(轉換名稱)

    from line(增量日志的開始記錄行)

    SlaveServerTransStatus

    prepareExecution

    準備轉換,完成所有步驟的初始化工作

    name(轉換名稱)

    WebResult

    startExec

    執行轉換

    name(轉換名稱)

    WebResult

    startTrans

    一次性初始化和執行轉換。雖然方便,但是不適用在集群執行環境下,因為初始化需要在集群上同時執行

    name(轉換名稱)

    WebResult

    pauseTrans

    暫?;蛘呋謴鸵粋€轉換

    name(轉換名稱)

    WebResult

    stopTrans

    終止一個轉換的執行

    name(轉換名稱)

    WebResult

    addTrans

    向子服務器中添加一個轉換,客戶端需要提交XML形式的轉換給Carte

    ?

    TransConfiguration

    WebResult

    allocateSocket

    在子服務器上分配一個服務器套接字。更多內容參考本篇后面的“集群轉換”

    ?

    ?

    sniffStep

    獲取一個正在運行的轉換中,經過某個步驟的所有數據行

    trans(轉換名稱)

    step(步驟名稱)

    copy(步驟的拷貝號)

    line(獲取行數)

    type(輸入還是輸出)

    <step-sniff>XML包含了一個RowMeta對象以及一組序列化的數據行

    startJob

    開始執行作業

    name(作業名稱)

    WebResult

    stopJob

    終止執行作業

    name(作業名稱)

    WebResult

    addJob

    向子服務器中添加一個作業,客戶端需要提交XML形式的作業給Carte

    ?

    JobConfiguration

    WebResult

    jobStatus

    獲取單個作業的狀態并列出作業下所有作業項的狀態

    name(作業名稱)

    from(增量日志的開始記錄行)

    SlaveServerJobStatus

    registerSlave

    把一個子服務器注冊到主服務器上(參考“集群轉換”部分),需要客戶端把子服務器的XML提交給子服務器

    ?

    SlaveServerDetection

    WebResult(reply)

    getSlaves

    獲得主服務器下的所有子服務器的列表

    ?

    <SlaveServerDetections>

    節點下包含了幾個SlaveServerDetection節點

    addExport

    把導出的.zip格式的作業或轉換,傳送給子服務器,文件保存為服務器的臨時文件??蛻舳私oCarte服務器提交zip文件的內容。這個方法總是返回XML

    ?

    WebResult里包含了臨時文件的URL

    表10-1 子服務器服務

    三、集群轉換

    ? ? ? ? 集群技術可以用來水平擴展轉換,使它們能以并行的方式運行在多臺服務器上。轉換的工作可以平均分到不同的服務器上。一個集群模式包括一個主服務器和多個子服務器,主服務器作為集群的控制器。只有在集群模式中,才有主服務器和子服務器的概念。作為控制器的Carte服務器就是主服務器,其它的Carte服務器就是子服務器。本節將介紹怎樣配置和執行一個轉換,讓其運行在多臺機器上。
    ? ? ? ??
    ? ? ? ? 集群模式也包含元數據,描述了主服務器和子服務器之間怎樣通信。在Carte服務器之間通過TCP/IP套接字傳遞數據。之所以選擇TCP/IP而不用Web Services作為數據交換的方式,是因為后者比較慢,而且會帶來不必要的性能開銷。

    1. 定義一個靜態集群

    ? ? ? ? 在定義一個集群模式之前,需要先定義一些子服務器。參考上一節的方法,我們已經定義了三個子服務器。其中名為master是主服務器,這是通過在子服務器對話框中勾選“是主服務器嗎?”選項設置的,如圖10-15所示,除此之外不需要給Carte傳遞任何特別的參數。圖中的slave1、slave2為另外兩個子服務器。

    圖10-15?構成Kettle集群的三個子服務器

    ? ? ? ? 定義完子服務器,右鍵單擊Spoon里的“Kettle集群schemas”節點,然后選擇“新建”選項,在配置窗口里設置集群模式的所有選項。至少選擇一個主服務器作為控制器并選擇一個或更多子服務器,如圖10-16所示。

    圖10-16?集群schemas對話框

    ? ? ? ? 這里有幾個重要的選項。

    • 端口:在服務器之間傳遞數據的最小的TCP/IP端口號。這是一個起始端口號。如果你的集群轉換需要50個端口,從初始端口號到初始端口號+50之間的所有端口都會被使用。
    • Sockets緩存大小:緩存大小用來使子服務器之間通信更平滑。不要把這個值設置得太大,否則數據傳輸過程可能比較波動。
    • Sockets刷新間隔(rows):因為進行Socket通信時,傳遞的數據行可能保存在Socket的緩存中。這里要設置一個刷新間隔,緩存中的數據行積累到一定數量,轉換引擎就會執行flush操作,強制把數據推送給對方服務器。這個參數的大小,取決于子服務器之間的網絡速度和延遲。
    • Sockets數據是否壓縮:設置子服務器之間傳輸的數據是否需要壓縮。對于相對較慢的網絡(如10Mbps),可以設置這個選項。設置該選項會導致集群轉換變慢,因為壓縮和解壓數據流需要CPU時間。在網絡不是瓶頸時,最好不啟用這個選項。
    • Dynamic cluster:如果設置了這個選項,Kettle會在主服務器上自動搜尋子服務器列表,來構建集群。

    2. 設計集群轉換

    ? ? ? ? 設計一個集群轉換,需要先設計一個普通的轉換。在轉換里創建一個集群模式,然后選擇希望通過集群方式運行的步驟。右鍵單擊這個步驟,選擇集群。選擇完步驟要運行的集群模式后,轉換將變成如圖10-17所示的樣子。

    圖10-17?一個集群轉換

    ? ? ? ? 這個轉換從表中讀取數據,然后排序,再將數據寫入一個文本文件。執行集群轉換時,所有被定義成集群運行(在圖10-15中有“C×2”標志)的步驟都在這個集群的子服務器上運行,而那些沒有集群標識的步驟都在主服務器上運行。本例中“表輸入”和“排序記錄”兩個步驟會在兩個子服務器上并行執行,而“排序合并”和“文本文件輸出”兩個步驟只在主服務器上執行。

    ? ? ? ? 注意在圖10-17中,“排序記錄”步驟使用了兩個不同的子服務器并行排序,所以就有兩組排好序的數據行依次返回給主服務器。因為后面的步驟接收這兩組數據,所以還要在后面的步驟里把這兩組數據再排序,由“排序合并”步驟來完成這個工作,它從所有的輸入步驟中逐行讀取記錄,然后進行多路合并排序。沒有這個步驟,并行排序的結果是錯誤的。

    ? ? ? ? 如果轉換中至少要有一個步驟被指定運行在一個集群上,這個轉換才是一個集群轉換。為了調試和開發,集群轉換可以在Spoon的執行對話框中以非集群的方法執行。在一個轉換中只能使用一個集群。

    3. 執行和監控

    ? ? ? ? 執行下面的步驟執行集群轉換。

    (1)新建運行配置
    ? ? ? ? 在Spoon左側的“主對象樹”標簽頁中,右鍵單擊“Run configurations”樹節點,選擇“New...”。在彈出對話框中配置運行屬性,如圖10-18所示。

    圖10-18?配置集群運行屬性

    與圖10-12所示的遠程執行設置,這里的Location選擇集群,并出現兩個新選項:

    • Log remote execution locally:顯示來自群集節點的日志。
    • Show transformations:顯示集群運行時生成的轉換。

    (2)執行集群轉換
    ? ? ? ? 在執行轉換時彈出的“執行轉換”對話框里指定要運行轉換的集群運行配置,如本例中的cluster,然后啟動轉換。

    ? ? ? ? 在Spoon樹形菜單中右鍵單擊“Kettle集群schemas”下的集群名稱,選擇彈出菜單中的“Monitor all slave servers”,會在Spoon中出現一個所有主、子服務器的監控界面,每個服務器一個標簽頁,包含了所有運行在相應服務器上的轉換和作業列表。本例集群中的三個服務器顯示如圖10-19所示。

    圖10-19?集群服務器監控頁面

    ? ? ? ? 最后輸出的文本文件在master服務器上生成。與遠程執行一樣,各主、子Carte服務器在控制臺終端打印的日志,也可看到轉換或作業的執行信息。

    4. 元數據轉換

    ? ? ? ? 主服務器和子服務器運行的并不是一樣的轉換。在主服務器和子服務器上運行的轉換是由一個叫元數據轉換(Metadata Transformations)的翻譯流程產生的。在Spoon中設計的原始轉換的元數據,被切分成多個轉換,重新組織,再增加額外信息,然后發送給目標子服務器。

    ? ? ? ? 關于元數據轉換,有以下三種類型的轉換:

    • 原始轉換:用戶在Spoon中設計的集群轉換。
    • 子服務器轉換:它源自原始轉換,運行在一個特定子服務器上的轉換,集群里的每個子服務器都會有一個子服務器轉換。
    • 主服務器轉換:它源自原始轉換,運行在主服務器上的轉換。

    ? ? ? ? 在圖10-17這個集群例子里,生成了兩個子服務器轉換和一個主服務器轉換。勾選集群運行配置中的“Show transformations”選項,將在集群轉換運行時顯示生成的轉換。圖10-20顯示了本例的主服務器轉換,圖10-21顯示了本例的子服務器轉換。

    圖10-20?主服務器轉換

    ?

    圖10-21?子服務器轉換

    ? ? ? ? 淺灰色編號的區域說明在步驟里有遠程輸入或輸出連接,稱之為遠程步驟(Remote Steps)。在我們的例子里,有兩個子服務器把數據從“排序記錄”步驟發送到“排序合并”步驟。這意味著兩個“排序記錄”步驟都有一個遠程輸出步驟,并且“排序合并”步驟有兩個遠程輸入步驟。如果將鼠標懸置到這個淺灰色的矩形內,將會獲取更多關于該遠程步驟的信息,還有分配的端口號,如圖10-22所示。

    圖10-22?遠程步驟上的提示信息

    (1)規則
    ? ? ? ? 可以想象,操作這些元數據轉換時,有很多可能性。以下幾個通用的規則,可以確保邏輯操作正確:

    • 如果一個步驟被配置成集群方式運行,它會被復制到一個子服務器轉換。
    • 如果一個步驟沒有被配置成集群運行,它會被復制到一個主服務器轉換。
    • 發送數據給一個集群步驟的步驟被定義為遠程輸出步驟(發送數據通過TCP/IP sockets)。
    • 從一個集群步驟接收數據的步驟被定義為遠程輸入步驟(接收數據通過TCP/IP sockets)。

    ? ? ? ? 下面的規則更復雜,因為它們處理集群里一些更加復雜的功能。

    • 多份拷貝的步驟也可以在集群方式下運行。在這種情況下,遠程輸入和輸出步驟將分發給不同的步驟拷貝。因為拷貝在遠程機器上運行,所以太多的步驟拷貝沒有意義。
    • 一般情況,集群轉換要盡量簡單,這樣更容易分析生成的轉換。
    • 當一個步驟要從特定的步驟里讀取數據(信息步驟),在生成的轉換里使用“Socket Reader”和“Socket Writer”步驟來做這個工作。

    (2)數據流水線
    ? ? ? ? 記得在本篇前面介紹多線程與數據分發時提到數據流水線或數據的泳道:在Carte服務器之間交換的數據越多,轉換就會越慢。理想情況下應該按照從頭到尾并行執行的方式來組織數據。例如,處理100個XML文件會比處理一個單一的大文件更容易,因為在多份文件情況下數據能夠被并行讀取。

    ? ? ? ? 作為通用的規則,要使集群轉換獲取好的性能,應盡量讓轉換簡單。在同一子服務器上,盡可能在泳道里做更多的事情,以減少服務器之間的數據傳輸。

    5. 配置動態集群

    ? ? ? ? 有兩種類型的Kettle集群,靜態集群有一個固定的模式,它指定一個主服務器和兩個或多個子服務器。而動態集群中僅需指定主服務器,子服務器則通過配置文件動態注冊到主服務器。以下步驟配置并執行一個一主兩從的動態集群轉換。

    (1)創建主服務器配置文件master.xml

    <slave_config>
    ? <max_log_lines>0</max_log_lines>
    ? <max_log_timeout_minutes>0</max_log_timeout_minutes>
    ? <object_timeout_minutes>5</object_timeout_minutes>
    ??
    ? <slaveserver>
    ? ? <name>master</name>
    ? ? <hostname>172.16.1.102</hostname>
    ? ? <port>8181</port>
    ? ? <username>cluster</username>
    ? ? <password>cluster</password>
    ? ? <master>Y</master>
    ? </slaveserver>
    </slave_config>

    (2)創建子服務器配置文件slave1.xml

    <slave_config>
    ? <max_log_lines>0</max_log_lines>
    ? <max_log_timeout_minutes>0</max_log_timeout_minutes>
    ? <object_timeout_minutes>5</object_timeout_minutes>
    ??
    ? <masters>
    ? ? <slaveserver>
    ? ? ? <name>master</name>
    ? ? ? <hostname>172.16.1.102</hostname>
    ? ? ? <port>8181</port>
    ? ? ? <username>cluster</username>
    ? ? ? <password>cluster</password>
    ? ? ? <master>Y</master>
    ? ? </slaveserver>
    ? </masters>
    ?
    ? <report_to_masters>Y</report_to_masters>
    ?
    ? <slaveserver>
    ? ? <name>slave1</name>
    ? ? <hostname>172.16.1.103</hostname>
    ? ? <port>8181</port>
    ? ? <username>cluster</username>
    ? ? <password>cluster</password>
    ? ? <master>N</master>
    ? </slaveserver>
    </slave_config>

    ? ? ? ? masters節點定義一個或多個負載均衡Carte實例管理此子服務器。slaveserver節點包含有關此Carte子服務器實例的信息。

    (3)啟動主服務器

    ./carte.sh ~/kettle_hadoop/master.xml

    (4)啟動子服務器

    ./carte.sh ~/kettle_hadoop/slave1.xml

    (5)按照(2)(4)步驟創建并啟動第二個子服務器

    (6)在Spoon新建一個動態集群,如圖10-23所示

    圖10-23?建立動態集群

    ? ? ? ? 勾選“Dynamic cluster”選項表示配置動態集群,與靜態集群不同,子服務器列表中只加入了master。

    (7)修改圖10-17所示的轉換,步驟選擇動態集群,如圖10-24所示

    圖10-24?動態集群轉換

    ? ? ? ? 此時會看到“表輸入”和“排序記錄”步驟的左上角出現“C×N”標志,說明這些步驟將在集群的所有子服務器上運行。

    (8)以集群方式執行轉換

    四、數據庫分區

    ? ? ? ? 分區是一個非?;\統的術語,廣義地講是將數據拆分成多個部分。在數據集成和數據庫方面,分區指拆分表或數據庫。表可以劃分成不同的“表分區”(table partions),數據庫可以劃分成不同的片(shards)。

    ? ? ? ? 除了數據庫外,也可以把文本或XML文件分區,例如按照每家商店或區域分區。由于數據集成工具需要支持各種分區技術,所以Kettle中的分區被設計成與源數據和目標數據無關。

    ? ? ? ? 分區是Kettle轉換引擎的核心,每當一個步驟把數據行使用“分發模式”發送給多個目標步驟時,實際就是在進行分區,分發模式的分區使用“輪詢”的方式。實際上這種方式并不比隨機發送好多少,它也不是本節要討論的一個分區方法。

    ? ? ? ? 我們討論的Kettle分區,是指Kettle可根據一個分區規則把數據發送到某個特定步驟拷貝的能力。在Kettle里,一組給定的分區集叫做分區模式(partitioning schema),規則本身叫做分區方法(partitioning method)。分區模式要么包含一組命名分區列表,要么簡單地包含幾個分區。分區方法不是分區模式的一部分。

    ? ? ? ? 下面介紹Kettle 8.3中數據庫分區的使用。

    1. 在數據庫連接中使用集群

    ? ? ? ? 在Kettle的數據庫連接對話框中,可定義數據庫分區,如圖10-25所示。

    圖10-25?數據庫連接中配置集群

    ? ? ? ? 在“集群”標簽,勾選“使用集群”,然后定義三個分區。這里的分區實際指的是數據庫實例,需要指定自定義的分區ID,數據庫實例的主機名(IP)、端口、數據庫名、用戶名和密碼。定義分區的目的是為了從某一個分區甚至某一個物理數據庫讀取和寫入數據。一旦在數據庫連接里面定義了數據庫分區,就可以基于這個信息創建了一個分區schema。

    ? ? ? ? 在“一般”標簽,只要指定連接名稱、連接類型和連接方式,在“設置”中都可以為空,如圖10-26所示。Kettle假定所有的分區都是同一數據庫類型和連接類型。

    圖10-26?使用集群的數據庫連接

    定義好分區后點擊“測試”,結果如圖10-27所示。

    圖10-27?測試數據庫集群連接

    2. 創建數據庫分區schemas

    ? ? ? ? 在“主對象樹”的“數據庫分區schemas”上點右鍵“新建”,在彈出窗口中輸入“分區schema名稱”,然后點擊“導入分區”按鈕,如圖10-28所示。

    圖10-28?配置數據庫分區schemas

    ? ? ? ? 選擇上一步定義的數據庫連接mysql_only_shared,點“確定”按鈕后,如圖10-29所示。

    圖10-29 導入數據庫分區

    ? ? ? ? 此時已經導入了上一步定義的三個數據庫分區。點擊“OK”保存。這樣就定義了一個名為shared_source的數據庫分區schema。再用同樣的方法定義一個名為shared_target的數據庫分區schema,所含分區也從mysql_only_shared導入。

    ? ? ? ? 至此,我們已經定義了一個包含三個分區的數據庫連接,并將分區信息導入到兩個數據庫分區schema,如圖10-30所示。

    圖10-30?兩個數據庫分區模式

    ? ? ? ? 現在可以在任何步驟里面應用這兩個數據庫分區schema(就是說使用這個分區的數據庫連接)。Kettle將為每個數據庫分區產生一個步驟復制,并且它將連接物理數據庫。

    3. 啟用數據庫分區

    ? ? ? ? 點擊步驟右鍵,選擇“分區...”菜單項。此時會彈出一個對話框,選擇使用哪個分區方法,如圖10-31所示。

    圖10-31?選擇分區方法

    ? ? ? ? 分區方法可以是下面的一種:

    • None:不使用分區,標準的“Distribute rows”(輪詢)或“Copy rows”(復制)規則被應用。
    • Mirror to all partitions:使用已定義的數據庫分區schema中的所有分區。
    • Remainder of division:Kettle標準的分區方法。通過分區編號除以分區數目,產生的余數被用來決定記錄行將發往哪個分區。例如在一個記錄行里,如果有 “73” 標識的用戶身份,而且有3個分區定義,這樣這個記錄行屬于分區1,編號30屬于分區0,編號14屬于分區2。需要指定基于分區的字段。

    選擇“Mirror to all partitions”,在彈出窗口中選擇已定義的分區schema,如圖10-32所示。

    圖10-32?選擇分區模式

    ? ? ? ? 經此一番設置后,該步驟就將以分區方式執行,如圖10-33所示。

    圖10-33?使用數據庫分區的表輸入步驟

    4. 數據庫分區示例

    (1)將三個mysql實例的數據導入到另一個mysql實例
    ? ? ? ? 轉換如圖10-34所示。

    圖10-34?表輸入使用分區

    ? ? ? ? “表輸入”步驟連接的是mysql_only_shared。因為是按分區方式執行,實際讀取的是三個分區的數據。表輸出使用的是一個標準的單實例數據庫連接。該轉換執行的邏輯為:

    db1.t1 + db2.t1 + db3.t1 -> db4.t4

    轉換執行的結果是將三個mysql實例的數據導入到另一個mysql實例。如果將表輸入步驟連接到一個標準的單實例數據庫,雖然數據庫連接本身沒有使用集群,但依然會為每個分區復制一份步驟,其結果等同于3線程的復制分發。

    (2)將一個mysql實例的數據分發到三個mysql實例
    ? ? ? ? 轉換如圖10-35所示。

    圖10-35?表輸出使用分區

    ? ? ? ? 表輸出步驟連接的是mysql_only_shared。因為是按分區方式執行,會向三個分區中的表輸出數據。該轉換執行的邏輯為:

    db4.t4 -> db1.t2
    db4.t4 -> db2.t2
    db4.t4 -> db3.t2

    (3)將三個mysql實例的數據導入到另三個mysql實例
    ? ? ? ? 轉換如圖10-36所示。

    圖10-36?輸入輸出使用不同分區

    ? ? ? ? 輸入步驟使用的是shared_source分區schema,而輸出步驟使用的是shared_target分區schema。該轉換執行的邏輯為:

    db1.t1 + db2.t1 + db3.t1 -> db4.t2
    db1.t1 + db2.t1 + db3.t1 -> db5.t2
    db1.t1 + db2.t1 + db3.t1 -> db6.t2

    (4)將三個mysql實例的數據導入相同實例的不同表中
    ? ? ? ? 轉換還是如圖10-36所示,與前一個例子只有一點區別:輸入步驟與輸出步驟使用的是同一個分區schema(shared_source)。該轉換執行的邏輯為:

    db1.t1 -> db1.t2
    db2.t1 -> db2.t2
    db3.t1 -> db3.t2

    ? ? ? ? 在數據庫連接中定義分區時需要注意一點,分區ID應該唯一,如果多個分區ID相同,則所有具有相同ID的分區都會連接到第一個具有該ID的分區。例如,我們把mysql_only_shared的分區定義改為如圖10-37所示。

    圖10-37?分區有相同ID

    ? ? ? ? 103與104兩個分區的分區ID都是2。然后重新導入shared_source,并再次執行轉換,結果只會向103中插入數據,而104沒有執行任何操作。

    ? ? ? ? 從這個例子可以看到,Kettle里實現分區很簡單:對于每個分區步驟,Kettle會根據所選擇的分區方法啟動多個步驟拷貝。如果定義了五個分區,就會有五個步驟拷貝。分區步驟的前一個步驟做重分區的工作。當一個步驟里數據沒有分區,這個步驟把數據發送給一個分區步驟的時候,就是在做重分區的工作。使用一種分區模式分區的步驟把數據發送給使用另一個分區模式的步驟,也會做重新分區的工作。

    ? ? ? ? 本節實例的具體表數據和轉換執行結果參見“Kettle數據庫連接中的集群與分片”。其它數據庫相關的步驟也和上面的例子類似,這樣多個數據庫可以并行處理。另外“Mirror to all partitions”分區方法可以并行將同樣的數據寫入多種數據庫分區。這樣在做數據庫查詢時,就可以把查詢表的數據同時復制到多個數據庫分區中,而不用再建立多個數據庫連接。

    5. 集群轉換中的分區

    ? ? ? ? 如果在一個轉換里定義了很多分區,轉換里的步驟拷貝數會急劇增長。為了解決這個問題,需要把分區分散到集群中的子服務器中。

    ? ? ? ? 在轉換執行過程中,分區平均分配給各個子服務器。如果使用靜態分區列表的方式定義了一個分區模式,在運行時,那些分區將會被平均分配到子服務器上。這里有一個限制,分區的數量必須大于或等于子服務器的數量,通常是子服務器的整數倍(slaves × 2、slaves × 3等)。有一個解決分區過多問題的簡單配置方法,就是指定每臺子服務器上的分區數,這樣在運行時就可以動態創建分區模式,不用事先指定分區列表。

    ? ? ? ? 記住如果在集群轉換里使用了分區步驟,數據需要跨子服務器重新分區,這會導致相當多的數據通信。例如,有10臺子服務器的一個集群,步驟A也有10份拷貝,但下面的步驟B設置為在每個子服務器上運行3個分區,這就需要創建10×30條數據路徑,與圖10-7中的例子相似。這些數據流向路徑中的10×30-30=270條路徑包含了遠程步驟,會引起一些網絡阻塞,以及CPU和內存的消耗,在設計帶分區的集群轉換時,要考慮這個問題。

    五、小結

    ? ? ? ? 本篇介紹了轉換的多線程、集群和數據庫分區,重點內容包括:

    • 介紹了一個轉換如何并行執行步驟,如果一個步驟有多個步驟拷貝,如何分發數據行。介紹了數據行是如何被分發以及合并到一起的,并介紹了并發可能導致的幾個問題。
    • 介紹了如何在遠程服務器上部署、執行、管理和監控轉換和作業。
    • 深入介紹了如何使用多臺子服務器構建一個集群,如何構建轉換來利用這些子服務器資源。
    • 最后介紹了如何使用Kettle的數據庫分區模式來并行處理數據庫的讀寫操作。
      ?
    已標記關鍵詞 清除標記
    ??2020 CSDN 皮膚主題: 深藍海洋 設計師:CSDN官方博客 返回首頁
    多乐彩