赞
踩
Sqoop:是一款开源的工具,其实就是 SQL to Hadoop,主要用于在Hadoop(Hive) 与传统的数据库(MySQL,postgresql...)之间进行数据的传递,实现关系型数据库与HDFS数据的转换。
sqoop原先是Hadoop的一个组件。
sqoop1与sqoop2是两个版本,推荐使用一版本,因为2版本仅仅是测试,不投入生产环境中。
将导入或者导出命令翻译成MapReduce程序来实现。
在翻译出来的MapReduce中,主要是对inputformat 以及 outputformat 进行定制。
在 sqoop中,导入是指:从非大数据集群(RDBMS) 向大数据集群(HDFS,HIVE,HBASE)中传输数据
与参数位置没有关系
使用关键字 import
(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
先测试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中的两条数据
说明导入数据成功啦!!!!!!!!!!!!!!
查询导入指定表中数据
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端查看结果,完美!!!!!!!!!!!!
(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端查看结果
(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端查看结果
(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
(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'
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,真的太慢了,超级超级慢,等的人向敲桌子,嘿嘿,回见!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。