轉角遇見DataX
DataX 是阿里巴巴集團內被廣泛使用的離線數據同步工具/平臺,實現包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各種異構數據源之間高效的數據同步功能。
阿里datax網址(本文摘自阿里datax介紹):https://github.com/alibaba/DataX
Features
DataX本身作爲數據同步框架,將不同數據源的同步抽象爲從源頭數據源讀取數據的Reader插件,以及向目標端寫入數據的Writer插件,理論上DataX框架可以支持任意數據源類型的數據同步工作。同時DataX插件體系作爲一套生態系統, 每接入一套新數據源該新加入的數據源即可實現和現有的數據源互通。
Support Data Channels
DataX目前已經有了比較全面的插件體系,主流的RDBMS數據庫、NOSQL、大數據計算系統都已經接入,目前支持數據如下圖,詳情請點擊:DataX數據源參考指南
類型 | 數據源 | Reader(讀) | Writer(寫) | 文檔 |
---|---|---|---|---|
RDBMS 關係型數據庫 | MySQL | √ | √ | 讀 、寫 |
Oracle | √ | √ | 讀 、寫 | |
SQLServer | √ | √ | 讀 、寫 | |
PostgreSQL | √ | √ | 讀 、寫 | |
DRDS | √ | √ | 讀 、寫 | |
通用RDBMS(支持所有關係型數據庫) | √ | √ | 讀 、寫 | |
阿里雲數倉數據存儲 | ODPS | √ | √ | 讀 、寫 |
ADS | √ | 寫 | ||
OSS | √ | √ | 讀 、寫 | |
OCS | √ | √ | 讀 、寫 | |
NoSQL數據存儲 | OTS | √ | √ | 讀 、寫 |
Hbase0.94 | √ | √ | 讀 、寫 | |
Hbase1.1 | √ | √ | 讀 、寫 | |
Phoenix4.x | √ | √ | 讀 、寫 | |
Phoenix5.x | √ | √ | 讀 、寫 | |
MongoDB | √ | √ | 讀 、寫 | |
Hive | √ | √ | 讀 、寫 | |
無結構化數據存儲 | TxtFile | √ | √ | 讀 、寫 |
FTP | √ | √ | 讀 、寫 | |
HDFS | √ | √ | 讀 、寫 | |
Elasticsearch | √ | 寫 | ||
時間序列數據庫 | OpenTSDB | √ | 讀 | |
TSDB | √ | 寫 |
mysql的讀操作
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"column": [
"id",
"name"
],
"splitPk": "db_id",
"connection": [
{
"table": [
"table"
],
"jdbcUrl": [
"jdbc:mysql://127.0.0.1:3306/database"
]
}
]
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print":true
}
}
}
]
}
}
{
"job": {
"setting": {
"speed": {
"channel":1
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "root",
"connection": [
{
"querySql": [
"select db_id,on_line_flag from db_info where db_id < 10;"
],
"jdbcUrl": [
"jdbc:mysql://bad_ip:3306/database",
"jdbc:mysql://127.0.0.1:bad_port/database",
"jdbc:mysql://127.0.0.1:3306/database"
]
}
]
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": false,
"encoding": "UTF-8"
}
}
}
]
}
}
splitPk
-
- 描述:MysqlReader進行數據抽取時,如果指定splitPk,表示用戶希望使用splitPk代表的字段進行數據分片,DATAX因此會啓動併發任務進行數據同步,這樣可以大大提供數據同步的效能。 推薦splitPk用戶使用表主鍵,因爲表主鍵通常情況下比較均勻,因此切分出來的分片也不容易出現數據熱點。 目前splitPk僅支持整形數據切分,`不支持浮點、字符串、日期等其他類型`。如果用戶指定其他非支持類型,MysqlReader將報錯!
如果splitPk不填寫,包括不提供splitPk或者splitPk值爲空,DataX視作使用單通道同步該表數據。
- 必選:否
- 默認值:空
querySQL所
描述:在有些業務場景下,在這一配置項不足以描述所篩選的條件,用戶可以通過該配置型來自定義篩選SQL當用戶配置了這一項之後,數據X系統就會忽略表,列這些配置類型,直接使用此配置項的內容對數據進行篩選,例如需要進行多表join後同步數據,使用從table_a中選擇a,b加入table_a.id = table_b.id上的table_b
當用戶配置querySql時,MysqlReader直接忽略table、column、where條件的配置,querySQL所優先級大於表,列,其中選項。
必選:否
默認值:無
類型轉換
目前MysqlReader支持大部分Mysql類型,但也存在部分個別類型沒有支持的情況,請注意檢查你的類型。
下面列出MysqlReader針對Mysql類型轉換列表:
DataX 內部類型 | Mysql 數據類型 |
---|---|
Long | int, tinyint, smallint, mediumint, int, bigint |
Double | float, double, decimal |
String | varchar, char, tinytext, text, mediumtext, longtext, year |
Date | date, datetime, timestamp, time |
Boolean | bit, bool |
Bytes | tinyblob, mediumblob, blob, longblob, varbinary |
請注意:
- 除上述羅列字段類型外,其他類型均不支持`。
- `tinyint(1) DataX視作爲整形`。
- `year DataX視作爲字符串類型`
- `bit DataX屬於未定義行爲`。
mysql的寫操作
{
"job": {
"setting": {
"speed": {
"channel": 1
}
},
"content": [
{
"reader": {
"name": "streamreader",
"parameter": {
"column" : [
{
"value": "DataX",
"type": "string"
},
{
"value": 19880808,
"type": "long"
},
{
"value": "1988-08-08 08:08:08",
"type": "date"
},
{
"value": true,
"type": "bool"
},
{
"value": "test",
"type": "bytes"
}
],
"sliceRecordCount": 1000
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"writeMode": "insert",
"username": "root",
"password": "root",
"column": [
"id",
"name"
],
"session": [
"set session sql_mode='ANSI'"
],
"preSql": [
"delete from test"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:3306/datax?useUnicode=true&characterEncoding=gbk",
"table": [
"test"
]
}
]
}
}
}
]
}
}
column
-
描述:目的表需要寫入數據的字段,字段之間用英文逗號分隔。例如: “column”: [“id”,“name”,“age”]。如果要依次寫入全部列,使用表示, 例如: “column”: [""]。
**column配置項必須指定,不能留空!** 注意:1、我們強烈不推薦你這樣配置,因爲當你目的表字段個數、類型等有改動時,你的任務可能運行不正確或者失敗 2、 column 不能配置任何常量值
-
必選:是
-
默認值:否
類似 MysqlReader ,目前 MysqlWriter 支持大部分 Mysql 類型,但也存在部分個別類型沒有支持的情況,請注意檢查你的類型。
下面列出 MysqlWriter 針對 Mysql 類型轉換列表:
DataX 內部類型 | Mysql 數據類型 |
---|---|
Long | int, tinyint, smallint, mediumint, int, bigint, year |
Double | float, double, decimal |
String | varchar, char, tinytext, text, mediumtext, longtext |
Date | date, datetime, timestamp, time |
Boolean | bit, bool |
Bytes | tinyblob, mediumblob, blob, longblob, varbinary |
bit類型目前是未定義類型轉換
DataX HdfsReader 插件文檔
1 快速介紹
HdfsReader提供了讀取分佈式文件系統數據存儲的能力。在底層實現上,HdfsReader獲取分佈式文件系統上文件的數據,並轉換爲DataX傳輸協議傳遞給Writer。
目前HdfsReader支持的文件格式有textfile(text)、orcfile(orc)、rcfile(rc)、sequence file(seq)和普通邏輯二維表(csv)類型格式的文件,且文件內容存放的必須是一張邏輯意義上的二維表。
HdfsReader需要Jdk1.7及以上版本的支持。
2功能和限制
HdfsReader實現了從Hadoop分佈式文件系統Hdfs中讀取文件數據並轉爲DataX協議的功能。textfile是Hive建表時默認使用的存儲格式,數據不做壓縮,本質上textfile就是以文本的形式將數據存放在hdfs中,對於DataX而言,HdfsReader實現上類比TxtFileReader,有諸多相似之處。orcfile,它的全名是Optimized Row Columnar file,是對RCFile做了優化。據官方文檔介紹,這種文件格式可以提供一種高效的方法來存儲Hive數據。HdfsReader利用Hive提供的OrcSerde類,讀取解析orcfile文件的數據。目前HdfsReader支持的功能如下:
- 支持textfile、orcfile、rcfile、sequence file和csv格式的文件,且要求文件內容存放的是一張邏輯意義上的二維表。
- 支持多種類型數據讀取(使用String表示),支持列裁剪,支持列常量
- 支持遞歸讀取、支持正則表達式("*“和”?")。
- 支持orcfile數據壓縮,目前支持SNAPPY,ZLIB兩種壓縮方式。
- 多個File可以支持併發讀取。
- 支持sequence file數據壓縮,目前支持lzo壓縮方式。
- csv類型支持壓縮格式有:gzip、bz2、zip、lzo、lzo_deflate、snappy。
- 目前插件中Hive版本爲1.1.1,Hadoop版本爲2.7.1(Apache[爲適配JDK1.7],在Hadoop 2.5.0, Hadoop 2.6.0 和Hive 1.2.0測試環境中寫入正常;其它版本需後期進一步測試;
- 支持kerberos認證(注意:如果用戶需要進行kerberos認證,那麼用戶使用的Hadoop集羣版本需要和hdfsreader的Hadoop版本保持一致,如果高於hdfsreader的Hadoop版本,不保證kerberos認證有效)
我們暫時不能做到:
- 單個File支持多線程併發讀取,這裏涉及到單個File內部切分算法。二期考慮支持。
- 目前還不支持hdfs HA;
{
"job": {
"setting": {
"speed": {
"channel": 3
}
},
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"path": "/user/hive/warehouse/mytable01/*",
"defaultFS": "hdfs://xxx:port",
"column": [
{
"index": 0,
"type": "long"
},
{
"index": 1,
"type": "boolean"
},
{
"type": "string",
"value": "hello"
},
{
"index": 2,
"type": "double"
}
],
"fileType": "orc",
"encoding": "UTF-8",
"fieldDelimiter": ","
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"print": true
}
}
}
]
}
}
-
path
-
描述:要讀取的文件路徑,如果要讀取多個文件,可以使用正則表達式"*",注意這裏可以支持填寫多個路徑。。
當指定單個Hdfs文件,HdfsReader暫時只能使用單線程進行數據抽取。二期考慮在非壓縮文件情況下針對單個File可以進行多線程併發讀取。
當指定多個Hdfs文件,HdfsReader支持使用多線程進行數據抽取。線程併發數通過通道數指定。
當指定通配符,HdfsReader嘗試遍歷出多個文件信息。例如: 指定/代表讀取/目錄下所有的文件,指定/bazhen/*代表讀取bazhen目錄下游所有的文件。HdfsReader目前只支持"“和”?"作爲文件通配符。
特別需要注意的是,DataX會將一個作業下同步的所有的文件視作同一張數據表。用戶必須自己保證所有的File能夠適配同一套schema信息。並且提供給DataX權限可讀。
-
必選:是
-
默認值:無
-
-
defaultFS
-
描述:Hadoop hdfs文件系統namenode節點地址。
目前HdfsReader已經支持Kerberos認證,如果需要權限認證,則需要用戶配置kerberos參數,見下面
-
必選:是
-
默認值:無
-
-
fileType
-
描述:文件的類型,目前只支持用戶配置爲"text"、“orc”、“rc”、“seq”、“csv”。
text表示textfile文件格式
orc表示orcfile文件格式
rc表示rcfile文件格式
seq表示sequence file文件格式
csv表示普通hdfs文件格式(邏輯二維表)
特別需要注意的是,HdfsReader能夠自動識別文件是orcfile、textfile或者還是其它類型的文件,但該項是必填項,HdfsReader則會只讀取用戶配置的類型的文件,忽略路徑下其他格式的文件
另外需要注意的是,由於textfile和orcfile是兩種完全不同的文件格式,所以HdfsReader對這兩種文件的解析方式也存在差異,這種差異導致hive支持的複雜複合類型(比如map,array,struct,union)在轉換爲DataX支持的String類型時,轉換的結果格式略有差異,比如以map類型爲例:
orcfile map類型經hdfsreader解析轉換成datax支持的string類型後,結果爲"{job=80, team=60, person=70}"
textfile map類型經hdfsreader解析轉換成datax支持的string類型後,結果爲"job:80,team:60,person:70"
從上面的轉換結果可以看出,數據本身沒有變化,但是表示的格式略有差異,所以如果用戶配置的文件路徑中要同步的字段在Hive中是複合類型的話,建議配置統一的文件格式。
如果需要統一複合類型解析出來的格式,我們建議用戶在hive客戶端將textfile格式的表導成orcfile格式的表
-
必選:是
-
默認值:無
-
-
column
-
描述:讀取字段列表,type指定源數據的類型,index指定當前列來自於文本第幾列(以0開始),value指定當前類型爲常量,不從源頭文件讀取數據,而是根據value值自動生成對應的列。
默認情況下,用戶可以全部按照String類型讀取數據,配置如下:
"column": ["*"]
用戶可以指定Column字段信息,配置如下:
-
{ “type”: “long”, “index”: 0 //從本地文件文本第一列獲取int字段 }, { “type”: “string”, “value”: “alibaba” //HdfsReader內部生成alibaba的字符串字段作爲當前字段 } ```
對於用戶指定Column信息,type必須填寫,index/value必須選擇其一。
* 必選:是 <br />
* 默認值:全部按照string類型讀取 <br />
-
fieldDelimiter
- 描述:讀取的字段分隔符
另外需要注意的是,HdfsReader在讀取textfile數據時,需要指定字段分割符,如果不指定默認爲’,’,HdfsReader在讀取orcfile時,用戶無需指定字段分割符
- 必選:否
- 默認值:,
-
encoding
- 描述:讀取文件的編碼配置。
- 必選:否
- 默認值:utf-8
-
nullFormat
-
描述:文本文件中無法使用標準字符串定義null(空指針),DataX提供nullFormat定義哪些字符串可以表示爲null。
例如如果用戶配置: nullFormat:"\N",那麼如果源頭數據是"\N",DataX視作null字段。
-
必選:否
-
默認值:無
compress
- 描述:當fileType(文件類型)爲csv下的文件壓縮方式,目前僅支持 gzip、bz2、zip、lzo、lzo_deflate、hadoop-snappy、framing-snappy壓縮;值得注意的是,lzo存在兩種壓縮格式:lzo和lzo_deflate,用戶在配置的時候需要留心,不要配錯了;另外,由於snappy目前沒有統一的stream format,datax目前只支持最主流的兩種:hadoop-snappy(hadoop上的snappy stream format)和framing-snappy(google建議的snappy stream format);orc文件類型下無需填寫。
- 必選:否
- 默認值:無
-
hadoopConfig
-
描述:hadoopConfig裏可以配置與Hadoop相關的一些高級參數,比如HA的配置。
"hadoopConfig":{ "dfs.nameservices": "testDfs", "dfs.ha.namenodes.testDfs": "namenode1,namenode2", "dfs.namenode.rpc-address.aliDfs.namenode1": "", "dfs.namenode.rpc-address.aliDfs.namenode2": "", "dfs.client.failover.proxy.provider.testDfs": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider" }
3.4 按分區讀取
Hive在建表的時候,可以指定分區partition,例如創建分區partition(day=“20150820”,hour=“09”),對應的hdfs文件系統中,相應的表的目錄下則會多出/20150820和/09兩個目錄,且/20150820是/09的父目錄。瞭解了分區都會列成相應的目錄結構,在按照某個分區讀取某個表所有數據時,則只需配置好json中path的值即可。
比如需要讀取表名叫mytable01下分區day爲20150820這一天的所有數據,則配置如下:
"path": "/user/hive/warehouse/mytable01/20150820/*"
DataX HdfsWriter 插件文檔
-
(1)、目前HdfsWriter僅支持textfile和orcfile兩種格式的文件,且文件內容存放的必須是一張邏輯意義上的二維表;
-
(2)、由於HDFS是文件系統,不存在schema的概念,因此不支持對部分列寫入;
-
(3)、目前僅支持與以下Hive數據類型: 數值型:TINYINT,SMALLINT,INT,BIGINT,FLOAT,DOUBLE 字符串類型:STRING,VARCHAR,CHAR 布爾類型:BOOLEAN 時間類型:DATE,TIMESTAMP 目前不支持:decimal、binary、arrays、maps、structs、union類型;
-
(4)、對於Hive分區表目前僅支持一次寫入單個分區;
-
(5)、對於textfile需用戶保證寫入hdfs文件的分隔符與在Hive上創建表時的分隔符一致,從而實現寫入hdfs數據與Hive表字段關聯;
-
(6)、HdfsWriter實現過程是:首先根據用戶指定的path,創建一個hdfs文件系統上不存在的臨時目錄,創建規則:path_隨機;然後將讀取的文件寫入這個臨時目錄;全部寫入後再將這個臨時目錄下的文件移動到用戶指定目錄(在創建文件時保證文件名不重複); 最後刪除臨時目錄。如果在中間過程發生網絡中斷等情況造成無法與hdfs建立連接,需要用戶手動刪除已經寫入的文件和臨時目錄。
-
(7)、目前插件中Hive版本爲1.1.1,Hadoop版本爲2.7.1(Apache[爲適配JDK1.7],在Hadoop 2.5.0, Hadoop 2.6.0 和Hive 1.2.0測試環境中寫入正常;其它版本需後期進一步測試;
-
(8)、目前HdfsWriter支持Kerberos認證(注意:如果用戶需要進行kerberos認證,那麼用戶使用的Hadoop集羣版本需要和hdfsreader的Hadoop版本保持一致,如果高於hdfsreader的Hadoop版本,不保證kerberos認證有效)
官網案例
{
"setting": {},
"job": {
"setting": {
"speed": {
"channel": 2
}
},
"content": [
{
"reader": {
"name": "txtfilereader",
"parameter": {
"path": ["/Users/shf/workplace/txtWorkplace/job/dataorcfull.txt"],
"encoding": "UTF-8",
"column": [
{
"index": 0,
"type": "long"
},
{
"index": 1,
"type": "long"
},
{
"index": 2,
"type": "long"
},
{
"index": 3,
"type": "long"
},
{
"index": 4,
"type": "DOUBLE"
},
{
"index": 5,
"type": "DOUBLE"
},
{
"index": 6,
"type": "STRING"
},
{
"index": 7,
"type": "STRING"
},
{
"index": 8,
"type": "STRING"
},
{
"index": 9,
"type": "BOOLEAN"
},
{
"index": 10,
"type": "date"
},
{
"index": 11,
"type": "date"
}
],
"fieldDelimiter": "\t"
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://xxx:port",
"fileType": "orc",
"path": "/user/hive/warehouse/writerorc.db/orcfull",
"fileName": "xxxx",
"column": [
{
"name": "col1",
"type": "TINYINT"
},
{
"name": "col2",
"type": "SMALLINT"
},
{
"name": "col3",
"type": "INT"
},
{
"name": "col4",
"type": "BIGINT"
},
{
"name": "col5",
"type": "FLOAT"
},
{
"name": "col6",
"type": "DOUBLE"
},
{
"name": "col7",
"type": "STRING"
},
{
"name": "col8",
"type": "VARCHAR"
},
{
"name": "col9",
"type": "CHAR"
},
{
"name": "col10",
"type": "BOOLEAN"
},
{
"name": "col11",
"type": "date"
},
{
"name": "col12",
"type": "TIMESTAMP"
}
],
"writeMode": "append",
"fieldDelimiter": "\t",
"compress":"NONE"
}
}
}
]
}
}
-
defaultFS
- 描述:Hadoop hdfs文件系統namenode節點地址。格式:hdfs://ip:端口;例如:hdfs://127.0.0.1:9000
- 必選:是
- 默認值:無
-
fileType
-
描述:文件的類型,目前只支持用戶配置爲"text"或"orc"。
text表示textfile文件格式
orc表示orcfile文件格式
-
必選:是
-
默認值:無
-
-
path
- 描述:存儲到Hadoop hdfs文件系統的路徑信息,HdfsWriter會根據併發配置在Path目錄下寫入多個文件。爲與hive表關聯,請填寫hive表在hdfs上的存儲路徑。例:Hive上設置的數據倉庫的存儲路徑爲:/user/hive/warehouse/ ,已建立數據庫:test,表:hello;則對應的存儲路徑爲:/user/hive/warehouse/test.db/hello
- 必選:是
- 默認值:無
-
fileName
- 描述:HdfsWriter寫入時的文件名,實際執行時會在該文件名後添加隨機的後綴作爲每個線程寫入實際文件名。
- 必選:是
- 默認值:無
-
column
-
描述:寫入數據的字段,不支持對部分列寫入。爲與hive中表關聯,需要指定表中所有字段名和字段類型,其中:name指定字段名,type指定字段類型。
用戶可以指定Column字段信息,配置如下:
"column": [ { "name": "userName", "type": "string" }, { "name": "age", "type": "long" } ]
-
必選:是
-
默認值:無
-
-
writeMode
- 描述:hdfswriter寫入前數據清理處理模式:
- append,寫入前不做任何處理,DataX hdfswriter直接使用filename寫入,並保證文件名不衝突。
- nonConflict,如果目錄下有fileName前綴的文件,直接報錯。
- 必選:是
- 默認值:無
- 描述:hdfswriter寫入前數據清理處理模式:
-
fieldDelimiter
- 描述:hdfswriter寫入時的字段分隔符,需要用戶保證與創建的Hive表的字段分隔符一致,否則無法在Hive表中查到數據
- 必選:是
- 默認值:無
-
compress
- 描述:hdfs文件壓縮類型,默認不填寫意味着沒有壓縮。其中:text類型文件支持壓縮類型有gzip、bzip2;orc類型文件支持的壓縮類型有NONE、SNAPPY(需要用戶安裝SnappyCodec)。
- 必選:否
- 默認值:無壓縮
-
hadoopConfig
-
描述:hadoopConfig裏可以配置與Hadoop相關的一些高級參數,比如HA的配置。
"hadoopConfig":{ "dfs.nameservices": "testDfs", "dfs.ha.namenodes.testDfs": "namenode1,namenode2", "dfs.namenode.rpc-address.aliDfs.namenode1": "", "dfs.namenode.rpc-address.aliDfs.namenode2": "", "dfs.client.failover.proxy.provider.testDfs": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider" }
-
必選:否
-
默認值:無
-
-
encoding
- 描述:寫文件的編碼配置。
- 必選:否
- 默認值:utf-8,慎重修改
類型轉換
目前 HdfsWriter 支持大部分 Hive 類型,請注意檢查你的類型。
下面列出 HdfsWriter 針對 Hive 數據類型轉換列表:
DataX 內部類型 | HIVE 數據類型 |
---|---|
Long | TINYINT,SMALLINT,INT,BIGINT |
Double | FLOAT,DOUBLE |
String | STRING,VARCHAR,CHAR |
Boolean | BOOLEAN |
Date | DATE,TIMESTAMP |
自己的模板案例
mysql2hdfs普通格式
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"name",
"age"
],
"splitPk": "age",
"connection": [
{
"table": [
"USER"
],
"jdbcUrl": [
"jdbc:mysql://hadoop-02:3306/test"
]
}
]
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://hadoop-01:9000",
"fileType": "text",
"path": "/input/mysql2hive",
"fileName": "1.dat",
"column": [
{
"name": "name",
"type": "STRING"
},
{
"name": "name",
"type": "int"
}
],
"writeMode": "append",
"fieldDelimiter": "\t",
}
}
}
]
}
}
mysql2hdfs(orc)加密版
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"name",
"age"
],
"splitPk": "age",
"connection": [
{
"table": [
"USER"
],
"jdbcUrl": [
"jdbc:mysql://hadoop-02:3306/test"
]
}
]
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://hadoop-01:9000",
"fileType": "orc",
"path": "/input/mysql2hive",
"fileName": "mysql2hdfs",
"column": [
{
"name": "name",
"type": "STRING"
},
{
"name": "name",
"type": "int"
}
],
"writeMode": "append",
"fieldDelimiter": "\t",
}
}
}
]
}
}
將mysql數據導入到hive表(orc格式)中
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"name",
"age"
],
"splitPk": "age",
"connection": [
{
"table": [
"USER"
],
"jdbcUrl": [
"jdbc:mysql://hadoop-02:3306/test"
]
}
]
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://hadoop-01:9000",
"fileType": "orc",
"path": "/user/hive/workmouse/ali_test.db/part5",
"fileName": "part5",
"column": [
{
"name": "name",
"type": "STRING"
},
{
"name": "age",
"type": "int"
}
],
"writeMode": "append",
"fieldDelimiter": "\t",
}
}
}
]
}
}
執行語句
python /usr/local/datax/bin/datax.py ./mysql2hdfs.json
建表語句
create table if not exists part5(
name string,
age int
)
row format delimited fields terminated by '\t'
stored as orc
;
HA導入
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"name",
"age"
],
"splitPk": "age",
"connection": [
{
"table": [
"USER"
],
"jdbcUrl": [
"jdbc:mysql://hadoop-02:3306/test"
]
}
],
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://zbs",
"fileType": "orc",
"path": "/user/hive/workmouse/qf_test.db/part5",
"fileName": "part5",
"column": [
{
"name": "name",
"type": "STRING"
},
{
"name": "age",
"type": "int"
}
],
"writeMode": "append",
"fieldDelimiter": "\t",
"hadoopConfig": {
"dfs.nameservices": "zbs",
"dfs.ha.namenodes.zbs": "nn1,nn2",
"dfs.namenode.rpc-address.zbs.nn1": "hadoop-01:9000",
"dfs.namenode.rpc-address.zbs.nn2": "hadoop-02:9000",
"dfs.client.failover.proxy.provider.zbs": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
}
}
}
}
]
}
}
hive到mysql
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"name",
"age"
],
"connection": [
{
"querySql": [
"select name,age from USER"
],
"jdbcUrl": [
"jdbc:mysql://hadoop-02:3306/test"
]
}
],
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://hadoop-01:9000",
"fileType": "text",
"path": "/user/hive/workmouse/qf_test.db/part6",
"fileName": "part6",
"column": [
{
"name": "name",
"type": "STRING"
},
{
"name": "age",
"type": "int"
}
],
"writeMode": "append",
"encoding": "UTF-8",
"fieldDelimiter": "\t",
}
}
}
]
}
}
hdfs導入mysql
{
"job": {
"setting": {
"speed": {
"channel": 3
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://hadoop-01:9000",
"fileType": "text",
"path": "/user/hive/workmouse/ali_test.db/part6",
"column": [
{
"name": "name",
"type": "STRING"
},
{
"name": "age",
"type": "int"
}
],
"fileType":"text",
"encoding": "UTF-8",
"fieldDelimiter": ","
}
},
"writer": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"name",
"age"
],
"connection": [
{
"table":[
"USER"
],
"jdbcUrl": [
"jdbc:mysql://hadoop-02:3306/test"
]
}
],
}
}
}
]
}
}
“name”,
“type”: “STRING”
},
{
“name”: “age”,
“type”: “int”
}
],
“fileType”:“text”,
“encoding”: “UTF-8”,
“fieldDelimiter”: “,”
}
},
“writer”: {
“name”: “mysqlreader”,
“parameter”: {
“username”: “root”,
“password”: “123456”,
“column”: [
“name”,
“age”
],
“connection”: [
{
“table”:[
“USER”
],
"jdbcUrl": [
"jdbc:mysql://hadoop-02:3306/test"
]
}
],
}
}
}
]
}
}