sqoop导入数据

1. Sqoop简介

Sqoop:是一款开源的工具,其实就是 SQL to Hadoop,主要用于在Hadoop(Hive) 与传统的数据库(MySQL,postgresql...)之间进行数据的传递,实现关系型数据库与HDFS数据的转换。

sqoop原先是Hadoop的一个组件。
sqoop1与sqoop2是两个版本,推荐使用一版本,因为2版本仅仅是测试,不投入生产环境中。

2. Sqoop原理

将导入或者导出命令翻译成MapReduce程序来实现。

在翻译出来的MapReduce中,主要是对inputformat 以及 outputformat 进行定制。

3. Sqoop的简单实用案例

3.1 导入数据

在	sqoop中,导入是指:从非大数据集群(RDBMS) 向大数据集群(HDFS,HIVE,HBASE)中传输数据

与参数位置没有关系

使用关键字 import

3.1.1 RDBMS 到 HDFS

3.1.1.1 Mysql准备数据
(1)开启MySQL服务,登录mysql,在mysql准备数据,
    sudo systemctl start mysqld

在这里插入图片描述

(2)创建数据库company
create database company;
show databases;

在这里插入图片描述

(3)创建数据表staff
  use company ;                                   //使用数据库company

  create table company.staff(id int(4) primary key not null auto_increment,name varchar(255),sex varchar(255));           //创建表staff     

  show tables;                                    //查看company数据库中的全部表

在这里插入图片描述
在这里插入图片描述

(4) 向数据表是staff插入数据
 insert into staff(name,sex) values('Thomas','Male');
 insert into staff(name,sex) values('Mary','Female');
 
 SELECT *FROM staff;     //查看数据表staff

3.1.1.2 全部导入HDFS
先测试JDBC连接是否成功
------------------------
 bin/sqoop list-databases --connect jdbc:mysql://hadoop102:3306/ --username root --password xxxxx
(1)执行import命令
 bin/sqoop import \
> --connect jdbc:mysql://hadoop102:3306/company \
> --username root \
> --password xxxxxx \
> --table staff \
> --target-dir /user/company \
> --delete-target-dir \
> --num-mappers 1 \
> --fields-terminated-by "\t"

在这里插入图片描述

遇到错误:NameNode处于safeMode安全模式

在这里插入图片描述

解决方法:
退出安全模式
hadoop dfsadmin -safemode leave
重新执行sqoop import 操作

在这里插入图片描述
在这里插入图片描述
提交到ResourceManager,需要等待片刻

(2) Web端口查看
进入NameNode
点击Utilities ->点击Browse the file system
搜索 文件夹/user/company 
点击part-m-000000 
点击download
可以看到我们插入在staff中的两条数据
说明导入数据成功啦!!!!!!!!!!!!!!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.1.3 查询导入HDFS(用的多)
查询导入指定表中数据
select 语句,where过滤条件中必须加上$CONDITIONS
因为正常业务中,有多个map读取数据,数据是有序导入HDFS,$CONDITIONS用来传递参数,保证写入HDFS的数据顺序和Mysql中顺序一致。
(1) 执行sqoop import命令
-----------------------------------------
//第一种
 bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password xxxxxx \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'

-----------------------------------------
第二种
 bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password xxxxxx \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--query 'select name,sex from staff where id <=1 and $CONDITIONS;'
--------------------------------------------------------------------------
两种效果一致,区别在于,如果select语句使用双引号,则必须在$CONDITIONS前面加上 斜杠转移符,防止shell识别为自己的变量,否则执行的时候依旧会报错提示需要加$CONDITIONS。

在这里插入图片描述

(2) 	Web端查看结果,完美!!!!!!!!!!!!

在这里插入图片描述

3.1.1.4 导入指定列
(1) 执行import 命令
 bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password XXXxxxx \
--columns id,sex \        
--table staff \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" 
------------------------------------------------
--columns id,sex \         是指定id和性别这两列
上面这些都是参数,位置是可以调整的,尽量把mysql参数放在一起,HDFS参数放在一起

在这里插入图片描述

(2) 	Web端查看结果

在这里插入图片描述

3.1.1.5 Sqoop关键字筛选查询导入HDFS
(1)  执行import命令
----------------------------------------------------------------
 bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 666666 \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--where "id=1"
----------------------------------------------
where关键字查询还可以加上--columns id,sex  指定列
 bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password xxxxxx \
--target-dir /user/company \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by "\t" \
--table staff \
--columns id,sex  \
--where "id=1"

输出的是id为1的那条记录的id列以及性别列,没有name姓名列。

在这里插入图片描述

(2) 	Web端查看结果

在这里插入图片描述

3.1.2 导入数据到Hive

(1)执行import命令
-------------------------------------------
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password xxxxxx \
--table staff \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "\t" \
--hive-overwrite \
--hive-table staff_hive
--------------------------------------------
当前hive没有这张表staff_hive
操作分为两步
一是把数据导入到HDFS,默认的临时目录是/user/atguigu/表名(因为我的HDFS是在atguigu用户)
二是从HDFS迁移到Hive
hive有自己的import

在这里插入图片描述

出现错误: ERROR tool.BaseSqoopTool: Error parsing arguments for import:是因为有个空格没有出现,改正就好了,重新执行

在这里插入图片描述

出现错误:
解决:

在这里插入图片描述
在这里插入图片描述

(2)进入NameNode查看atguihu中有任务在执行
   当执行结束后就消失了
   证明sqoop导入数据到Hive中确实是分为两步,先导入到HDFS中在迁移到Hive中。要等很久,速度比较慢
   Hive中查看数据表

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
里面有数据导入到了HDFS
在这里插入图片描述

开始导入数据到hive
在这里插入图片描述

 出现错误:
 ERROR tool.ImportTool: Import failed: java.io.IOException: Hive exited with status 64
libthrift jar 包不兼容

解决办法:
将hive lib文件夹中的libthrift-0.9.2.jar 拷贝到sqoop的lib文件夹中
注意再次执行任务,需先把HDFS中已经存在的默认路径文件/user/atguigu/表名  删除
------------------------
 sudo cp /opt/module/hive/lib/libthrift-0.9.3.jar /opt/module/sqoop/lib/

 hadoop fs -rm -r  /user/atguigu

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.3 导入数据到HBase

(1) 执行import命令
----------------------------------------------
bin/sqoop import \
--connect jdbc:mysql://hadoop102:3306/company \
--username root \
--password 666666 \
--table staff \
--columns "id,name,sex" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_staff" \
--num-mappers 1 \
--split-by id
---------------------------------------
需要注意的是:
由于版本兼容问题,hbase无法自动创建表hbase_staff
需要我们手动在hbase中创建这个表,再执行import命令
----------------------------
create 'hbase_staff','info'

在这里插入图片描述

(2) 进入Hbase查看表是否导入
scan  'hbase_staff'

3.1.4 死锁问题

 kernel:BUG: soft lockup - CPU#1 stuck for 22s! [khugepaged:298]

在这里插入图片描述

查看了一些网友的经验,这是软死锁,系统会自动重启,影响还是挺大的,虽然我的进程还是完成了,不过是因为它比较小
解决办法:
echo 30 > /proc/sys/kernel/watchdog_thresh 
sysctl -w kernel.watchdog_thresh=30
vi /etc/sysctl.conf
kernel.watchdog_thresh=30

在这里插入图片描述

程序媛叽叽歪歪

呜呜呜,导入hive出现错误,还没有解决好,解决好再补充一下啦!写博客的目的其实就是在做笔记啦,方便拿出来看看背背
后面也不用sqoop,真的太慢了,超级超级慢,等的人向敲桌子,嘿嘿,回见!
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值