sqoop介绍及数据迁移
1、sqoop概述
在上次的博客中,我们已经装好了sqoop,并且运行成功了,若是,有同学不清楚安装流程,请参考博客:sqoop安装及配置。
那么sqoop到底是什么呢,作用是什么,我们现在就来看一看:
- Sqoop是一个用于在Hadoop和关系数据库之间传输数据的工具
- 将数据从RDBMS导入到HDFS
- HDFS、Hive、HBase
- 从HDFS导出数据到RDBMS
- 使用MapReduce导入和导出数据,提供并行操作和容错
- 将数据从RDBMS导入到HDFS
- 目标用户
- 系统管理员、数据库管理员
- 大数据分析师、大数据开发工程师等
从这里我们就可以看出来,sqoop的作用就是用于hadoop和关系数据库之间传输数据的工具。
2、sqoop常用命令
我们可以通过sqoop help的命令来查看sqoop的常用命令:
Available commands:
codegen Generate code to interact with database records
create-hive-table Import a table definition into Hive
eval Evaluate a SQL statement and display the results
export Export an HDFS directory to a database table
help List available commands
import Import a table from a database to HDFS
import-all-tables Import tables from a database to HDFS
import-mainframe Import datasets from a mainframe server to HDFS
job Work with saved jobs
list-databases List available databases on a server
list-tables List available tables in a database
merge Merge results of incremental imports
metastore Run a standalone Sqoop metastore
version Display version information
3、sqoop数据迁移
3.1从RDB导入数据到HDFS
- 导入表到HDFS
# \表示换行输出,注意前面有'空格'
sqoop-import \
--connect jdbc:mysql://hadoop100:3306/hive \
--driver com.mysql.jdbc.Driver \
--table DBS \
--username root \
--password ok \
--target-dir /data/dbs/ \
--m 3 #指定mapper数量,默认为4个
- 通过Where语句过滤导入表
sqoop-import \
--connect jdbc:mysql://hadoop100:3306/hive \
--driver com.mysql.jdbc.Driver \
--table DBS \
--where "条件" \ #指定where条件
--username root \
--password ok \
--delete-target-dir \ #如果目标目录存在,则删除
--target-dir /data/dbs/ \
--m 3
- 通过COLUMNS过滤导入表
sqoop-import \
--connect jdbc:mysql://hadoop100:3306/hive \
--driver com.mysql.jdbc.Driver \
--table DBS \
--columns "列名,..." \ #指定列
--where "" \ #指定条件
--username root \
--password ok \
--delete-target-dir \
--target-dir /data/dbs/ \
--m 3
- 使用query方式导入数据
sqoop-import \
--connect jdbc:mysql://hadoop100:3306/hive \
--driver com.mysql.jdbc.Driver \
#直接在query语句中指定table
#必须带上条件 '\$CONDITIONS'
--query "select * from DBS where '条件' and \$CONDITIONS"
--username root \
--password ok \
--delete-target-dir \
--target-dir /data/dbs/ \
--m 3
- 使用Sqoop增量导入数据
- Incremental指定增量导入的模式
- append:追加数据记录
- lastmodified:可追加更新的数据
- Incremental指定增量导入的模式
sqoop-import \
--connect jdbc:mysql://hadoop100:3306/student \
--table student --where "sid>6" \
--username root --password ok \
--incremental append \ #增量导入的方式为append,追加数据
--check-column sid \ #指定递增的列
--last-value 6 \ #指定上一次导入的最大值
--target-dir /data/stu/ \
--m 3
- 导入文件格式
- 导入时指定文件格式参数
- –as-textfile 导入数据为text文件(默认)
- –as-avrodatafile 导入数据为avro文件
- –as-sequencefile 导入数据为sequence文件
- –as-parquetfile 导入数据为parquet文件
- 导入时指定文件格式参数
3.2从RDB导入数据到Hive
- jar包导入
- 从hive的lib目录复制到sqoop的libmulu
hive-common
hive-exec
- 从hive的lib目录复制到sqoop的libmulu
- 直接导入数据到Hive
- –create-hive-table:自动创建表,生产中一般不使用
- –hive-overwrite:覆盖原有表数据
sqoop-import --connect jdbc:mysql://hadoop100:3306/student \
--table student --username root -password ok \
#通过hive-import指定导入到Hive
--hive-import \
#指定创建一个新的hive表
#若表已存在,则删除这句,在末尾用--hive-overwrite覆盖
--hive-create-table \
#指定hive的库名和创建的表名
--hive-database sqooptest \
--hive-table student \
--m 1
- 导入数据到Hive分区
sqoop import --connect jdbc:mysql://localhost:3306/student \
--query “select order_id, order_status from orders where order_date = ‘2014-07-24’ and \$CONDITIONS” \
--username root --password ok \
--target-dir /data/orders \
--split-by order_status \
--hive-import \
--hive-table sqooptest.orders \
--hive-partition-key “date” \ #指定分区字段
--hive-partition-value “20140724” \ #指定分区值
--m 3
3.3从RDB导入数据到HBase
- 导入MySQL数据到HBase
sqoop-import \
--connect jdbc:mysql://hadoop100:3306/student \
--username root --password ok --table products \
--columns "product_name,product_price" \
--hbase-create-table \
--hbase-table product \
--column-family prod \
--hbase-row-key product_id \
--m 1
3.4、导出HDFS数据到MySQL
- 使用sqoop export导出数据到MySQL
- 在 MySQL 中创建表
- 导出数据到 MySQL
sqoop export \
--connect jdbc:mysql://hadoop:3306/student \
--username root \
--password ok \
--table emp \
--export-dir /data/stu \
--m 1