数据迁移的工具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、引号问题,要么外层使用单引号,内层使用双引号,CONDITIONS的符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后CONDITIONS的符号需要转义
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342