Apache Sqoop基础及数据迁移
一、什么是Sqoop?
Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具。
- 将数据从RDBMS导入到HDFS:HDFS、Hive、HBase。
- 从HDFS导出数据到RDBMS。
- 使用MapReduce导入和导出数据,提供并行操作和容错。
二、从RDBMS导入数据到HDFS:
1.导入表到HDFS
# connet 后面为你的mysql数据库链接/数据库名
# driver 后面为JDBC连接数据库的驱动包名
# table 后面为表名
# username 后面为你要连接的mysql数据库用户,通常为root
# password 后面为该用户连接数据库的密码
# delete 先删除之前导入的表
# target-dir为导出到的hdfs文件系统路径
# split-by 后面为按什么进行分组
# m 即map,表示分配的map个数,有几个map就会将导出结果分成几个文件
sqoop import --connect jdbc:mysql://localhost:3306/databasename --driver com.mysql.cj.jdbc.Driver \
--table tablename --username root --password password --delete-target-dir \
--target-dir hdfspath --split-by store_id --m 3
2.通过Where语句过滤导入表
sqoop import --connect jdbc:mysql://localhost:3306/databasename --driver com.mysql.cj.jdbc.Driver \
--table tablename --where "employee_number>20"
--username root --password password --delete-target-dir \
--target-dir hdfspath --split-by store_id --m 3
3.使用query方式导入数据
# 换行时必须加入\表示,上一行和下一行连接在一起
sqoop import --connect jdbc:mysql://172.20.0.5:3306/test --driver com.mysql.cj.jdbc.Driver \
--table store_details --username root --password password --delete-target-dir \
--target-dir /user/root/mysql/dbs --split-by store_id \
--query “select * from store_details where \$CONDITIONS” --m 3
4.通过COLUMNS过滤导入表
sqoop import --connect jdbc:mysql://localhost:3306/databasename --driver com.mysql.cj.jdbc.Driver \
--table tablename --columns"store_id,store_name,employee_number"
--username root --password password --delete-target-dir \
--target-dir hdfspath --split-by store_id --m 3
5.使用Sqoop增量导入数据
#Incremental指定增量导入的模式
#增量导入方式为append追加数据至已经存在的HDFS数据集
#check-column:指定递增的列
#last-value:指定上一次导入的最大值
sqoop import --connect jdbc:mysql://localhost:3306/hr --driver com.mysql.cj.jdbc.Driver \
--table orders--username root --password password --incremental append\
--check-column order_date--last-value ‘2015-10-10’ --target-dir /data/orders--m 3
三、导入文件格式
#--as-textfile 导入数据为text文件(默认)
#--as-avrodatafile 导入数据为avro文件
#--as-sequencefile 导入数据为sequence文件
#--as-parquetfile 导入数据为parquet文件
sqoop import --connect jdbc:mysql://localhost:3306/databasename --driver com.mysql.cj.jdbc.Driver \
--table tablename --columns"store_id,store_name,employee_number"
--username root --password password --delete-target-dir \
--target-dir hdfspath --split-by store_id --m 3 --as-sequencefile
四、从RDBMS导入数据到Hive
1.直接导入数据到Hive:
#--create-hive-table:自动创建表,生产中一般不使用
#--hive-overwrite:覆盖原有表数据
sqoop import --connect jdbc:mysql://localhost:3306/databasename --driver com.mysql.cj.jdbc.Driver \
--table tablename --columns"store_id,store_name,employee_number" --username root --password password \
--hive-import --create-hive-table --hive-database databaseName --hive-table tableName --m 1 --as-parquetfile
2.导入数据到Hive分区:
sqoop import --connect jdbc:mysql://localhost:3306/hr --driver com.mysql.cj.jdbc.Driver \
--query “select order_id, order_status from orders where order_date >= ‘2014-07-24’ and order_date < ‘2014-07-25’ and \$CONDITIONS” \
--username root --password hadoop--target-dir /user/data/orders--split-by order_status \
--hive-import--hive-table eShop.orders--hive-partition-key “order_date” \
--hive-partition-value “20140724”--m 3
五、从RDBMS导入数据到HBase
sqoop import \
--connect jdbc:mysql://localhost:3306/databasename \
--username root \
--password password \
--table tablename \
--hbase-table hb_tablename \
--column-family hb_column_family \
--hbase-row-key hb_rowkey \
-m 1