前言
在Sqoop中,“导入”指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,使用import关键字.
这里采用mysql和hdfs.
1.全量导入
1.1在mysql中创建需要的表:
``
CREATE TABLE order_table(
order_id INT,
buyer VARCHAR(20),
mod_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
这里的mod_time列的值,为当前行数据插入或者数据更新的系统时间
1.2 插入数据
``
INSERT INTO order_table(order_id,buyer) VALUES(1,‘zhangsan’);
查看数据
1.3 sqoop导入
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/test \
--username root \
--password 000000 \
--table order_table \
--target-dir /user/order_table \
--delete-target-dir \
--num-mappers 1
查看hdfs上文件
查看内容
命令:hdfs dfs -cat /user/order_table/part-m-00000
结果:
1,zhangsan,2020-10-29 10:15:04.0
1.4 mysql添加数据,再次导入
此时在mysql中再插入一条数据:
``INSERT INTO order_table(order_id,buyer) VALUES(2,‘lisi’);
执行相同的sqoop导入命令.
因为是全量导入,所以会将mysql表中的所有数据导入到hdfs,覆盖之前的文件内容.
命令:hdfs dfs -cat /user/order_table/part-m-00000
结果:
如果数据量很大,这样是很耗费资源的.这时就可以采用增量导入的方式
2.增量导入
增量导入有两种方式:append-基于递增列的增量数据导入。LastModified-基于时间列的增量数据导入
2.1 append方式
mysql中插入一条新数据
``
INSERT INTO order_table(order_id,buyer) VALUES(3,‘wangwu’);
sqoop命令:
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/test \
--username root \
--password 000000 \
--table order_table \
--target-dir /user/order_table \
--num-mappers 1 \
--incremental append \
--check-column order_id \
--last-value 2
参数解释:
–incremental append 指定增量导入为append方式
–check-column 指定参考的递增列
–last-value 阈值(int),会将递增列值大于此阈值的所有数据导入
查看hdfs上数据:
发现多了一个文件part-m-00001
查看此文件内容
即采用append方式,会新生成一个文件存放增量的内容
2.2 lastmodified 方式
lastmodified里又有两个参数项可选择:1.append 2.merge-key
lastmodified:append
mysql中插入新的数据
``
INSERT INTO order_table(order_id,buyer) VALUES(4,‘maliu’);
sqoop命令:
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/test \
--username root \
--password 000000 \
--table order_table \
--target-dir /user/order_table \
--num-mappers 1 \
--incremental lastmodified \
--check-column mod_time \
--append \
--last-value "2020-10-29 10:53:00"
参数解释:
–incremental lastmodified 指定增量导入为lastmodified 方式
–check-column 指定时间列
–last-value 阈值,时间大于等于阈值的数据会导入
-append 数据追加,hdfs上会生成新的文件
查看新生成的文件数据:
lastmodified:merge-key
1.mysql中插入新的数据
``
INSERT INTO order_table(order_id,buyer) VALUES(5,‘qianqi’);
2.将order_id为2的buyer名字改为lisisi
sqoop导入命令:
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/test \
--username root \
--password 000000 \
--table order_table \
--target-dir /user/order_table \
--num-mappers 1 \
--incremental lastmodified \
--check-column mod_time \
--merge-key order_id \
--last-value "2020-10-29 11:13:26"
参数解释:
–merge-key 指定合并列,对于键值相同的记录会进行合并,底层运行一个完整的mr,最终只生成一个文件
查看hdfs上的文件
hdfs dfs -cat /user/order_table
查看文件内容:
发现对于更改的第二条记录,也进行了同步更新.