Hadoop資料遷移MaxCompute最佳實踐

付帥發表於2018-09-10

本文向您詳細介紹如何通過使用DataWorks資料同步功能,將Hadoop資料遷移到阿里雲MaxCompute大資料計算服務上。

1.  環境準備

1.1 Hadoop叢集搭建

進行資料遷移前,您需要保證自己的Hadoop叢集環境正常。本文使用阿里雲EMR服務自動化搭建Hadoop叢集,詳細過程請參見https://help.aliyun.com/document_detail/35223.html?spm=a2c4g.11186623.6.557.20e219306ZJC9i

本文使用的EMR Hadoop版本資訊如下:

EMR版本: EMR-3.11.0

叢集型別: HADOOP

軟體資訊: HDFS2.7.2 / YARN2.7.2 / Hive2.3.3 / Ganglia3.7.2 / Spark2.2.1 / HUE4.1.0 / Zeppelin0.7.3 / Tez0.9.1 / Sqoop1.4.6 / Pig0.14.0 / ApacheDS2.0.0 / Knox0.13.0

Hadoop叢集使用經典網路,區域為華東1(杭州),主例項組ECS計算資源配置公網及內網IP,高可用選擇為否(非HA模式),具體配置如下所示。

1.2 MaxCompute

請參考https://help.aliyun.com/document_detail/58226.html?spm=a2c4g.11174283.6.570.64d4590eaIbcxH

開通MaxCompute服務並建立好專案,本文中在華東1(杭州)區域建立專案bigdata_DOC,同時啟動DataWorks相關服務,如下所示。

2.  資料準備

2.1 Hadoop叢集建立測試資料

進入EMR Hadoop叢集控制檯介面,使用互動式工作臺,新建互動式任務doc。本例中HIVE建表語句:

CREATE TABLE IF NOT EXISTS hive_doc_good_sale(

   create_time timestamp,

   category STRING,

   brand STRING,

   buyer_id STRING,

   trans_num BIGINT,

   trans_amount DOUBLE,

   click_cnt BIGINT

   )

   PARTITIONED BY (pt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY `,` lines terminated by `
`

選擇執行,觀察到Query executed successfully提示則說明成功在EMR Hadoop叢集上建立了測試用表格hive_doc_good_sale,如下圖所示。

插入測試資料,您可以選擇從OSS或其他資料來源匯入測試資料,也可以手動插入少量的測試資料。本文中手動插入資料如下:

insert into hive_doc_good_sale PARTITION(pt =1 ) values(`2018-08-21`,`外套`,`品牌A`,`lilei`,3,500.6,7),(`2018-08-22`,`生鮮`,`品牌B`,`lilei`,1,303,8),(`2018-08-22`,`外套`,`品牌C`,`hanmeimei`,2,510,2),(2018-08-22,`衛浴`,`品牌A`,`hanmeimei`,1,442.5,1),(`2018-08-22`,`生鮮`,`品牌D`,`hanmeimei`,2,234,3),(`2018-08-23`,`外套`,`品牌B`,`jimmy`,9,2000,7),(`2018-08-23`,`生鮮`,`品牌A`,`jimmy`,5,45.1,5),(`2018-08-23`,`外套`,`品牌E`,`jimmy`,5,100.2,4),(`2018-08-24`,`生鮮`,`品牌G`,`peiqi`,10,5560,7),(`2018-08-24`,`衛浴`,`品牌F`,`peiqi`,1,445.6,2),(`2018-08-24`,`外套`,`品牌A`,`ray`,3,777,3),(`2018-08-24`,`衛浴`,`品牌G`,`ray`,3,122,3),(`2018-08-24`,`外套`,`品牌C`,`ray`,1,62,7) ;

完成插入資料後,您可以使用select * from hive_doc_good_sale where pt =1;語句檢查Hadoop叢集表中是否已存在資料可用於遷移。

2.2 利用DataWorks新建目標表

在管理控制檯,選擇對應的MaxCompute專案,點選進入資料開發頁面,點選新建表,如下所示。

在彈框中輸入SQL建表語句,本例中使用的建表語句如下:

CREATE TABLE IF NOT EXISTS hive_doc_good_sale(

   create_time string,

   category STRING,

   brand STRING,

   buyer_id STRING,

   trans_num BIGINT,

   trans_amount DOUBLE,

   click_cnt BIGINT

   )

   PARTITIONED BY (pt string) ;

在建表過程中,需要考慮到HIVE資料型別與MaxCompute資料型別的對映,當前資料對映關係可參見 https://help.aliyun.com/document_detail/54081.html?spm=a2c4e.11153940.blogcont630231.16.587919b0KIgCfQ 

由於本文使用DataWorks進行資料遷移,而DataWorks資料同步功能當前暫不支援timestamp型別資料,因此在DataWorks建表語句中,將create_time設定為string型別。

上述步驟同樣可通過odpscmd命令列工具完成,命令列工具安裝和配置請參考https://help.aliyun.com/document_detail/27804.html?spm=a2c4g.11186623.6.572.e66b5a41WP2nyj ,執行過程如下所示。

注意:考慮到部分HIVE與MaxCompute資料型別的相容問題,建議在odpscmd客戶端上執行以下命令。

set odps.sql.type.system.odps2=true;set odps.sql.hive.compatible=true;

完成建表後,可在DataWorks資料開發>表查詢一欄檢視到當前建立的MaxCompute上的表,如下所示。

3.  資料同步

3.1 新建自定義資源組

由於MaxCompute專案所處的網路環境與Hadoop叢集中的資料節點(data node)網路通常不可達,我們可通過自定義資源組的方式,將DataWorks的同步任務執行在Hadoop叢集的Master節點上(Hadoop叢集內Master節點和資料節點通常可達)。

3.1.1 檢視Hadoop叢集datanode

在EMR控制檯上首頁/叢集管理/叢集/主機列表頁檢視,如下圖所示,通常非HA模式的EMR上Hadoop叢集的master節點主機名為 emr-header-1,datanode主機名為emr-worker-X。

您也可以通過點選上圖中Master節點的ECS ID,進入ECS例項詳情頁,通過點選遠端連線進入ECS,通過 hadoop dfsadmin –report命令檢視datenode,如下圖所示。

由上圖可以看到,在本例中,datanode只具有內網地址,很難與DataWorks預設資源組互通,所以我們需要設定自定義資源組,將master node設定為執行DataWorks資料同步任務的節點。

3.1.2 新建自定義資源組

進入DataWorks資料整合頁面,選擇資源組,點選新增資源組,如下圖所示。關於新增排程資源組的詳細資訊,請參考新增排程資源

在新增伺服器步驟中,需要輸入ECS UUID和機器IP等資訊(對於經典網路型別,需輸入伺服器名稱,對於專有網路型別,需輸入伺服器UUID。目前僅DataWorks V2.0 華東2區支援經典網路型別的排程資源新增,對於其他區域,無論您使用的是經典網路還是專有網路型別,在新增排程資源組時都請選擇專有網路型別),機器IP需填寫master node公網IP(內網IP可能不可達)。ECS的UUID需要進入master node管理終端,通過命令dmidecode | grep UUID獲取(如果您的hadoop叢集並非搭建在EMR環境上,也可以通過該命令獲取),如下所示。

完成新增伺服器後,需保證master node與DataWorks網路可達,如果您使用的是ECS伺服器,需設定伺服器安全組。如果您使用的內網IP互通,可參考https://help.aliyun.com/document_detail/72978.html?spm=a2c4g.11186623.6.580.6a294f79DmqM6f設定。如果您使用的是公網IP,可直接設定安全組公網出入方向規則,本文中設定公網入方向放通所有埠(實際應用場景中,為了您的資料安全,強烈建議設定詳細的放通規則),如下圖所示。

完成上述步驟後,按照提示安裝自定義資源組agent,觀察到當前狀態為可用,說明新增自定義資源組成功。

如果狀態為不可用,您可以登入master node,使用tail –f/home/admin/alisatasknode/logs/heartbeat.log命令檢視DataWorks與master node之間心跳報文是否超時,如下圖所示。

3.2 新建資料來源

關於DataWorks新建資料來源詳細步驟,請參見https://help.aliyun.com/knowledge_list/72788.html?spm=a2c4g.11186623.6.573.7d882b59eqdXhi

DataWorks新建專案後,預設設定自己為資料來源odps_first。因此我們只需新增Hadoop叢集資料來源:在DataWorks資料整合頁面,點選資料來源>新增資料來源,在彈框中選擇HDFS型別的資料來源。

在彈出視窗中填寫資料來源名稱及defaultFS。對於EMR Hadoop叢集而言,如果Hadoop叢集為HA叢集,則此處地址為hdfs://emr-header-1的IP:8020,如果Hadoop叢集為非HA叢集,則此處地址為hdfs://emr-header-1的IP:9000。在本文中,emr-header-1與DataWorks通過公網連線,因此此處填寫公網IP並放通安全組。

完成配置後,點選測試連通性,如果提示“測試連通性成功”,則說明資料來源新增正常。

注意:如果EMR Hadoop叢集設定網路型別為專有網路,則不支援連通性測試。

3.3 配置資料同步任務

在DataWorks資料整合頁面點選同步任務,選擇新建>指令碼模式,在匯入模板彈窗選擇資料來源型別如下:

完成匯入模板後,同步任務會轉入指令碼模式,本文中配置指令碼如下,相關解釋請參見https://help.aliyun.com/document_detail/74304.html?spm=a2c4g.11186631.6.576.2c506aaczJB2i7

在配置資料同步任務指令碼時,需注意DataWorks同步任務和HIVE表中資料型別的轉換如下:

在Hive表中的資料型別

DataX/DataWorks 內部型別

TINYINT,SMALLINT,INT,BIGINT

Long

FLOAT,DOUBLE,DECIMAL

Double

String,CHAR,VARCHAR

String

BOOLEAN

Boolean

Date,TIMESTAMP

Date

Binary

Binary

詳細程式碼如下:

{

  “configuration”: {

    “reader”: {

      “plugin”: “hdfs”,

      “parameter”: {

        “path”: “/user/hive/warehouse/hive_doc_good_sale/”,

        “datasource”: “HDFS1”,

        “column”: [

          {

            “index”: 0,

            “type”: “string”

          },

          {

            “index”: 1,

            “type”: “string”

          },

          {

            “index”: 2,

            “type”: “string”

          },

          {

            “index”: 3,

            “type”: “string”

          },

          {

            “index”: 4,

            “type”: “long”

          },

          {

            “index”: 5,

            “type”: “double”

          },

          {

            “index”: 6,

            “type”: “long”

          }

        ],

        “defaultFS”: “hdfs://121.199.11.138:9000”,

        “fieldDelimiter”: “,”,

        “encoding”: “UTF-8”,

        “fileType”: “text”

      }

    },

    “writer”: {

      “plugin”: “odps”,

      “parameter”: {

        “partition”: “pt=1”,

        “truncate”: false,

        “datasource”: “odps_first”,

        “column”: [

          “create_time”,

          “category”,

          “brand”,

          “buyer_id”,

          “trans_num”,

          “trans_amount”,

          “click_cnt”

        ],

        “table”: “hive_doc_good_sale”

      }

    },

    “setting”: {

      “errorLimit”: {

        “record”: “1000”

      },

      “speed”: {

        “throttle”: false,

        “concurrent”: 1,

        “mbps”: “1”,

        “dmu”: 1

      }

    }

  },

  “type”: “job”,

  “version”: “1.0”

}

其中,path引數為資料在Hadoop叢集中存放的位置,您可以在登入master node後,使用hdfs dfs –ls /user/hive/warehouse/hive_doc_good_sale命令確認。對於分割槽表,您可以不指定分割槽,DataWorks資料同步會自動遞迴到分割槽路徑,如下圖所示。

完成配置後,點選執行。如果提示任務執行成功,則說明同步任務已完成。如果執行失敗,可通過複製日誌進行進一步排查。

4.  驗證結果

在DataWorks資料開發/表查詢頁面,選擇表hive_doc_good_sale後,點選資料預覽可檢視HIVE資料是否已同步到MaxCompute。您也可以通過新建一個table查詢任務,在任務中輸入指令碼select * FROM   hive_doc_good_sale where pt =1;後,點選執行來檢視錶結果,如下圖所示。

當然,您也可以通過在odpscmd命令列工具中輸入select * FROM   hive_doc_good_sale where pt =1;查詢表結果。


5.  MaxCompute資料遷移到Hadoop

如果您想實現MaxCompute資料遷移到Hadoop。步驟與上述步驟類似,不同的是同步指令碼內的reader和writer物件需要對調,具體實現指令碼舉例如下。

{
  "configuration": {
    "reader": {
      "plugin": "odps",
      "parameter": {
      "partition": "pt=1",
      "isCompress": false,
      "datasource": "odps_first",
      "column": [
        "create_time",
        "category",
        "brand",
      "buyer_id",
      "trans_num",
      "trans_amount",
      "click_cnt"
    ],
    "table": "hive_doc_good_sale"
    }
  },
  "writer": {
    "plugin": "hdfs",
    "parameter": {
    "path": "/user/hive/warehouse/hive_doc_good_sale",
    "fileName": "pt=1",
    "datasource": "HDFS_data_source",
    "column": [
      {
        "name": "create_time",
        "type": "string"
      },
      {
        "name": "category",
        "type": "string"
      },
      {
        "name": "brand",
        "type": "string"
      },
      {
        "name": "buyer_id",
        "type": "string"
      },
      {
        "name": "trans_num",
        "type": "BIGINT"
      },
      {
        "name": "trans_amount",
        "type": "DOUBLE"
      },
      {
        "name": "click_cnt",
        "type": "BIGINT"
      }
    ],
    "defaultFS": "hdfs://47.99.162.100:9000",
    "writeMode": "append",
    "fieldDelimiter": ",",
    "encoding": "UTF-8",
    "fileType": "text"
    }
  },
  "setting": {
    "errorLimit": {
      "record": "1000"
  },
  "speed": {
    "throttle": false,
    "concurrent": 1,
    "mbps": "1",
    "dmu": 1
  }
  }
},
"type": "job",
"version": "1.0"
}

您需要參考配置HDFS Writer在執行上述同步任務前對Hadoop叢集進行設定,在執行同步任務後手動拷貝同步過去的檔案。



相關文章