本文简单介绍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表,获取到hdfscreate 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;)