手记

Datax3.0 测试 mysql 到HDFS

本文简单介绍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;)


0人推荐
随时随地看视频
慕课网APP