sqoop的使用之import导入到HDFS
原文链接:
https://www.toutiao.com/i6772128429614563843/
首先我们已经安装好sqoop了,如果没有安装好参考文档《快速搭建CDH-Hadoop-Hive-Zoopkeeper-Sqoop环境进入Sqoop学习环境》
准备一些基本的认识
1、sqoop分为了sqoop1和sqoop2
2、sqoop2拆分server和client,类似于hiveserver2和beeline
3、sqoop早期是一些封装MR程序,以jar文件的形式,最后才演变成了框架
4、用于在hadoop和结构化数据库之间的高效传输批量数据的工具
下面我们开始做一些简单是使用,熟悉sqoop的使用方式
查看帮助信息:bin/sqoop help

连接mysql
bin/sqoop list-databases --connect jdbc:mysql://mastercdh:3306/ --username root --password password
可以将数据库罗列出来,显示mysql数据库说明安装成功

从关系型数据库中导入到HDFS(rdbms -> hdfs)
在mysql中创建一个库和表,方便我们练习

create table importhdfs(
id int primary key not null,
name varchar(20) not null
);

插入数据
insert into importhdfs values(1,'x1');
insert into importhdfs values(2,'x2');
insert into importhdfs values(3,'x3');
insert into importhdfs values(4,'x4');
insert into importhdfs values(5,'x5');

使用命令导入数据(注意反斜杠,反斜杠后面不能有空格等)
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table importhdfs


我们可以看reduce数量,sqoop不运行reduce

或者

那么我们的数据在哪里?


搜索outputdir,就可以看到目录
hdfs://mastercdh:8020/user/root/importhdfs

我们就可以看到数据了

我们查看下数据
bin/hdfs dfs -text /user/root/importhdfs/part-m-00001

我们也可以
控制map任务的个数 -m,--num-mappers
输出目录路径如果存在则删除--delete-target-dir
指定输出目录 --target-dir
运行下
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--delete-target-dir \
--target-dir /sqoop_test \
--table importhdfs \
-m 1

我们查看数据

bin/hdfs dfs -text /sqoop_test/part-m-00000

这个数据分隔符是逗号
1,x1
2,x2
3,x3
4,x4
5,x5
我们可以指定数据输出分隔符(mysql默认是 ',')
分隔符参数fields-terminated-by
命令
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--delete-target-dir \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t"

查看下数据
bin/hdfs dfs -text /sqoop_test/part-m-00000

其中有个日志信息

指定快速模式 --direct
命令
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--delete-target-dir \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t"

bin/hdfs dfs -text /sqoop_test/part-m-00000

增量导入,从原有的数据上进行追加数据。比如mysql中表数据变化了,那么我重新执行sqoop,会把HDFS上的数据删除,这不符合我们的要求,我们只希望在原来的基础上添加数据。
首先了解三个参数
--check-column (col):指定要导入时检查的列,行的检测列,一般都是拿主键作为检测列。注意:char、varchar类型不可以使用
--incremental (mode):有两种模式:append 和 lastmodifuied
append :追加 lastmodifuied:时间戳
--last-value (value):指定上次导入检测列最后字段的最大值,也就是最后一个值
在append模式下

增加几条数据
insert into importhdfs values(5,'x5');
insert into importhdfs values(6,'x6');
insert into importhdfs values(7,'x7');
insert into importhdfs values(8,'x8');
insert into importhdfs values(9,'x9');

注意:append和--delete-target-dir不能同时使用
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 5

会有很多信息


查看

查看
bin/hdfs dfs -text /sqoop_test/part-m-00000
bin/hdfs dfs -text /sqoop_test/part-m-00001

在lastmodifuied模式下
如果check-column是时间列time的话
--check-column time time列下面的数据,指定的就是你添加数据时最后的时间戳
--last-value"2019-12-19 19:04:07" 最后一行的时间戳
创建表
create table inc_tab(
id int,
name varchar(20),
last_mod timestamp default current_timestamp on update current_timestamp
);
添加数据
insert into inc_tab(id,name) values(1,'inc1');
insert into inc_tab(id,name) values(2,'inc2');
insert into inc_tab(id,name) values(3,'inc3');
insert into inc_tab(id,name) values(4,'inc4');
insert into inc_tab(id,name) values(5,'inc5');

执行sqoop命令
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table inc_tab \
--target-dir /sqoop_test_inc \
--fields-terminated-by '\t' \
--num-mappers 1

查看数据
bin/hdfs dfs -text /sqoop_test_inc/part-m-00000

再添加几条数据
insert into inc_tab(id,name) values(6,'inc6');
insert into inc_tab(id,name) values(7,'inc7');
insert into inc_tab(id,name) values(8,'inc8');

使用lastmodifuied模式进行增量导入指定增量数据是以--append(附加)还是 --merge-key(合并)模式进行添加
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table inc_tab \
--target-dir /sqoop_test_inc \
--check-column last_mod \
--fields-terminated-by '\t' \
--incremental lastmodified \
--last-value "2019-12-20 03:13:51" \
--num-mappers 1 \
--merge-key id

bin/hdfs dfs -text /sqoop_test_inc/part-r-00000

这个地方是有reduce的

这些命令我们可以使用job执行:sqoop job
bin/sqoop job --create job01 创建
bin/sqoop job --delete 删除任务
bin/sqoop job --exec 执行job
bin/sqoop job --show 显示job的详细信息
bin/sqoop job --list 显示可执行的job
示例语句:
sqoop job --create myjob -- import --connect jdbc:mysql://example.com/db \
--table mytable
我们做个练习
先导入数据
insert into importhdfs values(11,'x11');
insert into importhdfs values(12,'x12');
insert into importhdfs values(13,'x13');
insert into importhdfs values(14,'x14');
insert into importhdfs values(15,'x15');

执行命令
bin/sqoop job \
--create job_importhdfs \
-- \
import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--target-dir /sqoop_test \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t" \
--check-column id \
--incremental append \
--last-value 10

我们查看是否成功

我们执行一下
bin/sqoop job --exec job_importhdfs
执行job的时候会确认密码,指定成mysql的登录密码

我们查看数据

可以选择行列
导出某几列数据或者几行数据
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--delete-target-dir \
--target-dir /where_test_importhdfs \
--table importhdfs \
-m 1 \
--fields-terminated-by "\t" \
--where 'id<6'

查看数据
bin/hdfs dfs -text /where_test_importhdfs/part-m-00000

导出某几列
--query使用要点:
不能使用--table
如果--query的sql语句带着where字句,
必须要加上标识符$CONDITIONS

查看数据
bin/hdfs dfs -text /where_test_importhdfs_sql/part-m-00000

mysql导入数据到hive中该如何做呢?
先登录hive

在hive中操作,创建数据库:
create database frommysql;

创建表
创建表
create table importhive_info(
num int,
name string
)row format delimited fields terminated by "\t";

数据也有了

执行语句
bin/sqoop import \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--direct \
--table importhdfs \
--delete-target-dir \
--hive-import \
--hive-database frommysql \
--hive-table importhive_info \
--fields-terminated-by "\t" \
-m 1
执行报错

但是我们数据库明明有

查看mysql元数据信息发现新建的库表都没有

难道没有使用mysql的元数据库?初始化出问题了吗?于是重新初始化
bin/schematool -dbType mysql –initSchema
出现derby信息,还是旧信息

我的配置没有起作用?

为什么会有元数据库呢?说明之前是对的,仔细核对了一遍,发现是配置文件被我改动的问题。
这个地方写错路径了(截图已改对)

重新启动

Mysql中元数据库有了

重新创建上面的库表


元数据有信息了

在执行之前的sqoop语句

查看下hive中的数据已经有了

这个地方注意:运行mr任务时,结果将会保存在默认的输出目录上。还在/user/hive/warehouse。

从hdfs导入到mysql(export)
常规模式导入数据到mysql
我们创建一个表
create table tomysql(
id int primary key not null,
name varchar(20) not null
);

导出语句
bin/sqoop export \
--connect jdbc:mysql://mastercdh:3306/sqoop_test \
--username root \
--password password \
--table tomysql \
--export-dir /user/hive/warehouse/frommysql.db/importhive_info \
-m 1 \
--input-fields-terminated-by '\t'

查看下数据

sqoop运行一个file文件
在mysql重新建表file_to_mysql

创建文本
export
--connect
jdbc:mysql://mastercdh:3306/sqoop_test
--username
root
--password
password
--table
file_to_mysql
--export-dir
/user/hive/warehouse/frommysql.db/importhive_info
-m
1
--input-fields-terminated-by
'\t'

执行命令
bin/sqoop --options-file /data/test/filetomysql

查看数据已经有了

sqoop的使用之import导入到HDFS的更多相关文章
- 15.sqoop数据从mysql里面导入到HDFS里面
表数据 在mysql中有一个库userdb中三个表:emp, emp_add和emp_contact 表emp id name deg salary dept 1201 gopal manager 5 ...
- 使用 sqoop 将mysql数据导入到hdfs(import)
Sqoop 将mysql 数据导入到hdfs(import) 1.创建mysql表 CREATE TABLE `sqoop_test` ( `id` ) DEFAULT NULL, `name` va ...
- Sqoop导入到hdfs
1.注意win下直接复制进linux 改一下--等 sqoop-list-databases --connect jdbc:mysql://122.206.79.212:3306/ --usernam ...
- sqoop操作之Oracle导入到HDFS
导入表的所有字段 sqoop import --connect jdbc:oracle:thin:@192.168.1.100:1521:ORCL \ --username SCOTT --passw ...
- sqoop命令,mysql导入到hdfs、hbase、hive
1.测试MySQL连接 bin/sqoop list-databases --connect jdbc:mysql://192.168.1.187:3306/trade_dev --username ...
- sqoop数据导入到Hdfs 或者hive
用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql http://www.cnblogs.com/xuyou551/p/7999773.html 用sqoop将mysql ...
- sqoop从mysql导入到hdfs出现乱码问题
最近把hive元数据库的快照数据导入到hdfs中,以便对历史的元数据进行查询. 命令如下: sqoop import -D mapred.job.queue.name=do.production -- ...
- 大数据之路week07--day07 (Sqoop 从mysql增量导入到HDFS)
我们之前导入的都是全量导入,一次性全部导入,但是实际开发并不是这样,例如web端进行用户注册,mysql就增加了一条数据,但是HDFS中的数据并没有进行更新,但是又再全部导入一次又完全没有必要. 所以 ...
- Sqoop(三)将关系型数据库中的数据导入到HDFS(包括hive,hbase中)
一.说明: 将关系型数据库中的数据导入到 HDFS(包括 Hive, HBase) 中,如果导入的是 Hive,那么当 Hive 中没有对应表时,则自动创建. 二.操作 1.创建一张跟mysql中的i ...
随机推荐
- 访问Github速度很慢以及解决方法(系统通用)
原因分析1,CDN,Content Distribute Network,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数据时,不需要直接从源站获取,通过CD ...
- Git忽略提交规则 .gitignore文件
在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交.简单来说一个场景:在你使用git add .的时候,遇到 ...
- zctf_2016_note3(unlink)
这道题完全没想到漏洞在哪(还是菜了) 这道题目我通过海哥的博客学习的 (16条消息) zctf_2016_note3_seaaseesa的博客-CSDN博客 例行检查我就不放了 进入edit页面 这里 ...
- windows10 安装 Mysql8.0
目录 1.Mysql8.0下载 2.配置环境变量 3.在安装目录下创建my.ini文件 4 初始化Mysql 5 安装至系统服务 6 更改密码 1.Mysql8.0下载 2.配置环境变量 将下载后文件 ...
- 录入任务信息(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 日历设置好了,就该录入任务了.当然在录入任务之前还要对任务进行一下面分解,就是一个项目,要分几个大步完成,每个大步又分几个 ...
- matplotlib模块详解
简单绘图,折线图,并保存为图片 import matplotlib.pyplot as plt x=[1,2,3,4,5] y=[10,5,15,10,20] plt.plot(x,y,'ro-',c ...
- CF1144A Diverse Strings 题解
Content 我们定义一个字符串是合法的,当且仅当这个字符串是"连续排列"(按照字母表顺序排序).现在给出 \(n\) 个字符串 \(s_1,s_2,s_3,...,s_n\), ...
- DNS解析超时排查/etc/resolv.conf single-request-reopen参数说明
添加 options rotate timeout:1 attempts:3 single-request-reopen 添加到/etc/resolv.conf 中 #释义: 循环查询 超时时间 重试 ...
- Windows 数据盘自动分区脚本
在CMD命令文本下执行,即可: diskpart //1.进入diskpart模式 list disk //2.查询磁盘 select disk 1 //3.选择磁盘 create partition ...
- pdf2swf转换不成功该怎么解决啊,Process p=r.exec("D:/swf/pdf2swf.exe \""+pdfFile.getPath()+"\" -o \""+swfFile.getPath()+"\" -T 9");
pdf2swf转换不成功该怎么解决啊,可以这样解决吧,请注意命令的用法啊:Process p=r.exec("D:/swf/pdf2swf.exe \""+pdfFil ...