本文简单介绍mysql-->hdfs的数据交换任务
1-首先mysql建立表
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `telephone` varchar(30) DEFAULT NULL, `mail` varchar(50) DEFAULT NULL, `password` varchar(32) DEFAULT NULL, `remark` varchar(1000) DEFAULT NULL, `status` int(11) NOT NULL, `operator` varchar(50) NOT NULL, `operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `operate_ip` varchar(20) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_username` (`username`) USING BTREE, UNIQUE KEY `idx_mail` (`mail`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
2-导入测试数据
3-建立hive表,获取到hdfs
create table mysql_to_hive ( id int, username string, telephone string, mail string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;
4-获取HDFS存储地址
show create table mysql_to_hive; LOCATION 'hdfs://hadoop001:8020/user/hive/warehouse/mysql_to_hive'
5- 查看HDFS下面是否有文件
hadoop fs -ls /user/hive/warehouse/mysql_to_hive
没有文件
6-执行datax数据交换任务
注意:hdfswriter写入时的字段分隔符,**需要用户保证与创建的Hive表的字段分隔符一致,否则无法在Hive表中查到数据
配置文件:
{ "job": { "setting": { "speed": { "channel":1 } }, "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "root", "password": "root123", "connection": [ { "querySql": [ "select id,username,telephone,mail from user;" ], "jdbcUrl": [ "jdbc:mysql://localhost:3306/datax" ] } ] } }, "writer": { "name": "hdfswriter", "parameter": { "defaultFS": "hdfs://hadoop001:8020", "fileType": "TEXT", "path": "/user/hive/warehouse/mysql_to_hive", "fileName": "mysql_to_hive", "column": [ { "name": "id", "type": "STRING" }, { "name": "username", "type": "STRING" }, { "name": "telephone", "type": "STRING" }, { "name": "mail", "type": "STRING" } ], "writeMode": "append", "fieldDelimiter": "\t", "compress": "NONE" } } } ] } }
执行:python bin/datax.py ../../data/dataxJob/mysql_to_hive.json
7-检查执行结果
hadoop fs -ls /user/hive/warehouse/mysql_to_hive -rw-r--r-- 3 root supergroup 52 2018-11-05 06:01 /user/hive/warehouse/mysql_to_hive/mysql_to_hive__17a8a8d2_45ff_4412_8625_5a8eecf910e6
去hive表查询数据:
select * from mysql_to_hive;
...数据展示
8-扩展:
是否通过修改 配置参数 可以在hdfs目录下面产生多个hdfs文件?
首先 我们可以 把mysql reader的配置进行修改
"querySql": [ "select id,username,telephone,mail from user;", "select id,username,telephone,mail from user;" ]
修改为多个sql,此时,就会触发两个task任务。
根据:
setting": {
"speed": {
"channel":1
}
}
可以计算出 产生一个taskGroup,里面包含两个任务,并发执行
可以看到,多了两个文件
hadoop fs -ls /user/hive/warehouse/mysql_to_hive Found 3 items -rw-r--r-- 3 root supergroup 52 2018-11-05 06:01 /user/hive/warehouse/mysql_to_hive/mysql_to_hive__17a8a8d2_45ff_4412_8625_5a8eecf910e6 -rw-r--r-- 3 root supergroup 52 2018-11-05 06:10 /user/hive/warehouse/mysql_to_hive/mysql_to_hive__331eeb4c_4685_4a26_ad16_87e9ee431acb -rw-r--r-- 3 root supergroup 52 2018-11-05 06:10 /user/hive/warehouse/mysql_to_hive/mysql_to_hive__a5f89603_90f8_4f5c_a684_fa518f4787de
当然:通过调整core.json 中的
taskGroup": {
"channel": 5
}
也可以调整任务的并发
比如我们这样调整:
job.json setting": { "speed": { "channel":2 } }
core.json taskGroup": { "channel": 1 }
此时有两条sql,也没有任何限速处理,
此时,会 产生两个taskGroup,每个taskGroup里面有一个任务。
注意HDFS小文件过多是不合适的,会对NameNode造成过大的压力!!!
9-hive内部表 和外部表
内部表数据由Hive自身管理,外部表数据由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir(默认:/user/hive/warehouse),外部表数据的存储位置由自己制定;
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)