数据迁移的工具Sqoop实践

数据迁移的工具Sqoop实践

sqoop : 数据迁入迁出的工具

RDBMS -- import -> Hadoop
Hadoop -- export -> RDBMS

列出MySQL数据库里的database:

sqoop list-databases \
--connect jdbc:mysql://bigdata02:3306/ \
--username bigdata \
--password 123456
sqoop list-databases --connect jdbc:mysql://localhost:3306/ --username bigdata --password 123456

--connect 连接关系型数据库的URL
--username 数据库的用户名
--password 数据库的密码

列出MySQL中的mysql数据库的数据表:

sqoop list-tables \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456

创建一张跟mysql中的help_keyword表一样的hive表hk:

在hive里使用默认的default库

sqoop create-hive-table \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--hive-table hk

使用myhive库

sqoop create-hive-table \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--hive-database myhive \
--hive-table hk

导入

导入MySQL表中数据到HDFS中:

普通导入:导入mysql库中的help_keyword的数据到HDFS上的默认路径:/user/bigdata/help_keyword

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--table help_keyword   \
-m 1

-m 1就是一个MapTask

查看结果:

hadoop fs -cat /user/bigdata/help_keyword/p*

先删除原来的结果文件:

 hadoop fs -rm -r /user/bigdata/help_keyword

下面会生成4个文件夹,也就是说默认的m是4个MapTask。

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456  \
--table help_keyword

导入: 指定分隔符为和导入路径

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--table help_keyword   \
--target-dir /user/bigdata/my_help_keyword2  \
--fields-terminated-by '\t'  \
-m 1
hadoop fs -cat /user/bigdata/my_help_keyword2/part-m-00001

导入数据:带where条件

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--where "name='STRING' " \
--table help_keyword   \
--target-dir /sqoop/bigdata/myoutport1  \
-m 1
hadoop fs -cat /sqoop/bigdata/myoutport1/part-m-00000

导入:指定自定义查询SQL

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--target-dir /user/bigdata/myimport2  \
--query 'select help_keyword_id,name from help_keyword WHERE $CONDITIONS and  name = "STRING"'  \
--split-by  help_keyword_id \
--fields-terminated-by '\t'  \
-m 1
hadoop fs -cat /user/bigdata/myimport2/part-m-00000

下面是导入所有,其实没有添加条件,但是WHERE $CONDITIONS 必须要有。

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--target-dir /user/root/myimport22  \
--query "select help_keyword_id,name from help_keyword WHERE \$CONDITIONS"  \
--split-by  help_keyword_id \
--fields-terminated-by '\t'  \
-m 3

下面会报错

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--target-dir /user/root/myimport222  \
--query "select help_keyword_id,name from help_keyword"  \
--split-by help_keyword_id \
--fields-terminated-by '\t'  \
-m 3

在以上需要按照自定义SQL语句导出数据到HDFS的情况下:

1、引号问题,要么外层使用单引号,内层使用双引号,符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后符号需要转义
2、自定义的SQL语句中必须带有WHERE $CONDITIONS

导入MySQL数据库中的表数据到Hive中:

普通导入:数据存储在默认的default hive库中,表名就是对应的mysql的表名:

sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--table help_keyword   \
--hive-import \
-m 1
// hadoop fs -cat /user/hive/warehouse/help_keyword/p*     
// 查看数据
hadoop fs -cat /home/bigdata/data/hivedata/help_keyword/p* 
// 指定行分隔符和列分隔符,
//指定hive-import,
//指定覆盖导入,
//指定自动创建hive表,
//指定表名,
//指定删除中间结果数据目录
sqoop import  \
--connect jdbc:mysql://bigdata02:3306/mysql  \
--username bigdata  \
--password 123456  \
--table help_keyword  \
--fields-terminated-by "\t"  \
--lines-terminated-by "\n"  \
--hive-import  \
--hive-overwrite  \
--create-hive-table  \
--delete-target-dir \
--hive-database  myhive \
--hive-table new_help_keyword2
// hadoop fs -cat /user/hive/warehouse/myhive.db/new_help_keyword2/p*
hadoop fs -cat /home/bigdata/data/hivedata/myhive.db/new_help_keyword2/p*

增量导入 导入到hdfs


sqoop import   \
--connect jdbc:mysql://bigdata02:3306/mysql   \
--username bigdata  \
--password 123456   \
--table help_keyword  \
--target-dir /user/root/myimport3  \
--incremental  append  \
--check-column  help_keyword_id \
--last-value 500  \
-m 1
hadoop fs -cat /user/root/myimport3/p* 

last-value 500 只导入 id > 500 的所有记录。

导出:

mysql --> RDBMS

注意:导出的RDBMS的表必须自己预先创建,不会自动创建
创建student表

hive
create database if not exists myhive;

use myhive;

drop table if exists student;

create table student(id int, name string, sex string, age int, department string) row format delimited fields terminated by ",";

load data local inpath "/home/bigdata/data/student.txt" into table myhive.student;

select * from myhive.student;

创建sqoopstudent表

mysql -ubigdata -p123456
create database sqoopdb default character set utf8 COLLATE utf8_general_ci; 

use sqoopdb;

CREATE TABLE sqoopstudent ( 
   id INT NOT NULL PRIMARY KEY, 
   name VARCHAR(20), 
   sex VARCHAR(20),
   age INT,
   department VARCHAR(20)
);

导出HDFS数据到MySQL:

// 导出HDFS数据到MySQL:
sqoop export \
--connect jdbc:mysql://bigdata02:3306/sqoopdb  \
--username bigdata \
--password 123456 \
--table sqoopstudent \
--export-dir /student_ext_4 \
--fields-terminated-by ','

导出hive数据到MySQL:

先清空sqoopstudent

// 导出hive数据到MySQL:
sqoop export \
--connect jdbc:mysql://bigdata02:3306/sqoopdb  \
--username bigdata \
--password 123456 \
--table sqoopstudent \
--export-dir /home/bigdata/data/hivedata/myhive.db/student \
--fields-terminated-by ','

一些其他操作:

列出mysql数据库中的所有数据库

//列出mysql数据库中的所有数据库
sqoop list-databases \
--connect jdbc:mysql://bigdata02:3306/ \
-username bigdata \
-password 123456

连接mysql并列出数据库中的表

//连接mysql并列出数据库中的表
sqoop list-tables \
--connect jdbc:mysql://bigdata02:3306/mysql \
-username bigdata \
-password 123456

导入 MySQL 数据到 HBase

先手动创建表

hbase shell
create 'new_help_keyword','info'

提示:sqoop1.4.6只支持HBase1.0.1之前的版本的自动创建HBase表的功能

sqoop import \
--connect jdbc:mysql://bigdata02:3306/mysql \
--username bigdata \
--password 123456 \
--table help_keyword \
--columns "help_keyword_id,name" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "help_keyword_id" \
--hbase-table "new_help_keyword" 
hbase shell

scan 'new_help_keyword'

字段解释:

--connect jdbc:mysql://bigdata02:3306/mysql       表示远程或者本地 Mysql 服务的 URI 
--hbase-create-table                            表示在 HBase 中建立表。 
--hbase-table new_help_keyword      表示在 HBase 中建立表 new_help_keyword。 
--hbase-row-key help_keyword_id      表示hbase表的rowkey是mysql表的help_keyword_id 字段。 
--column-family "info"       表示在表 new_help_keyword 中建立列族 person。 
--username root           表示使用用户 root 连接 mysql。 
--password 111111           连接 mysql 的用户密码 
--table help_keyword         表示导出 mysql 数据库的 help_keyword 表。 

导出 HBase 数据到 MySQL

很遗憾,现在还没有直接的命令将 HBase 的数据导出到 MySQL
一般采用如下方法:

1、将 Hbase 数据,扁平化成 HDFS 文件,然后再由 sqoop 导入
2、直接使用 HBase 的 Java API 读取表数据,直接向 mysql 导入,不需要使用 sqoop

你可能感兴趣的:(数据迁移的工具Sqoop实践)