Sqoop的安装配置与使用

介绍与特点

Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

对于某些NoSQL数据库它也提供了连接器。Sqoop,类似于其他ETL工具,使用元数据模型来判断数据类型并在数据从数据源转移到Hadoop时确保类型安全的数据处理。Sqoop专为大数据批量传输设计,能够分割数据集并创建Hadoop任务来处理每个区块。

概述

sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。

导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统;

导出数据:从Hadoop的文件系统中导出数据到关系数据库mysql等。

工作机制

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

在翻译出的mapreduce中主要是对inputformat和outputformat进行定制。

安装与配置

1、下载上传并解压放到 /usr/local 文件夹下
最新版下载地址http://ftp.wayne.edu/apache/sqoop/1.4.6/

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/

2、修改配置目录中的文件sqoop-env.sh

到指定目录下:/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/conf

重命名配置文件

mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh

export HADOOP_COMMON_HOME=/usr/local/hadoop-2.7.7
export HADOOP_MAPRED_HOME=/usr/local/hadoop-2.7.7
export HIVE_HOME=/usr/local/apache-hive-1.2.2-bin

3、将mysql的驱动包mysql-connector-java-5.1.46-bin.jar复制到Sqoop安装目录下的lib文件夹中

4、配置环境变量

vi ~/.bashrc

#sqoop
export SQOOP_HOME=/usr/local/sqoop-1.4.7.bin__hadoop-2.6.0
export PATH=$PATH:$SQOOP_HOME/bin

source ~/.bashrc

查看是否配置成功及版本号

sqoop version

在这里插入图片描述

到这里,Sqoop的张哥安装过程就结束了!

Sqoop常用的命令操作
sqoop help

Available commands:
  codegen            Generate code to interact with database records
  create-hive-table  Import a table definition into Hive
  eval               Evaluate a SQL statement and display the results
  export             Export an HDFS directory to a database table
  help               List available commands
  import             Import a table from a database to HDFS
  import-all-tables  Import tables from a database to HDFS
  import-mainframe   Import datasets from a mainframe server to HDFS
  job                Work with saved jobs
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  merge              Merge results of incremental imports
  metastore          Run a standalone Sqoop metastore
  version            Display version information

5、测试sqoop到mysql的连通性

查看数据库

bin/sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456

显示的databases与mysql显示的databases一样

在这里插入图片描述

查看数据库mysql中存在的表

bin/sqoop list-tables --connect jdbc:mysql://localhost:3306/mysql --username root --password 123456

在这里插入图片描述

将数据库中的数据导入到HDFS

指定输出路径、指定数据分隔符

–fields-terminated-by ‘\t’

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456  --table student --target-dir /sqoop/mysql1 --fields-terminated-by '\t'

指定Map数量 -m

-m 2

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456  --table student --target-dir /sqoop/mysql2 --fields-terminated-by '\t' -m 2

增加where条件, 注意:条件必须用引号引起来

id大于3: --where ‘id>3’

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456  --table student --where 'id>3' --target-dir /sqoop/mysql3 --fields-terminated-by '\t'

增加query语句(使用 \ 将语句换行)

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 \
--query 'SELECT * FROM student where id > 2 AND $CONDITIONS' --split-by student.id --target-dir /sqoop/mysql4

注意:如果使用–query这个命令的时候,需要注意的是where后面的参数,AND C O N D I T I O N S 这 个 参 数 必 须 加 上 而 且 存 在 单 引 号 与 双 引 号 的 区 别 , 如 果 − − q u e r y 后 面 使 用 的 是 双 引 号 , 那 么 需 要 在 CONDITIONS这个参数必须加上 而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在 CONDITIONSquery使CONDITIONS前加上\即$CONDITIONS
如果设置map数量为1个时即-m 1,不用加上–split-by ${tablename.column},否则需要加上

先启动Hadoop

1、启动mysql,在test数据库下创建一个名为student的表(id int, name string)。

如果没有test数据库先创建一个数据库

create database test;
# 使用test数据库
use test
# 创建student表
create table student(id int primary key, name varchar(20));

并写入内容

insert into student values(1, "sartin"),(2, "board"),(3, "zhangsan"),(4, "lishi");

在这里插入图片描述

查看表结构:

desc student;

在这里插入图片描述

查看表数据:

select * from student;

在这里插入图片描述

2、退出mysql在sqoop目录下执行命令

执行命令将数据导入HDFS

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456  --table student --columns 'id, name' --target-dir /sqoop/mysql

参数含义:

--connect 链接mysql的URL直到数据库名
--username 用户名 
--password 密码  
--table 表名 
--columns '列名称' 
--target-dir 存取的HDFS目录,不需要提前创建

查看hadoop是否产生相应的文件夹:

由于有四行数据,做一存在四个part-m-0000X

在这里插入图片描述

查看数据结果,分别对应了我们插入的四行数据:
在这里插入图片描述
在这里插入图片描述

将HDFS上的数据导出到数据库中

1、启动mysql,在test数据库中创建一个新表hdfsinto,表结构和student一样

create table hdfsinto(id int primary key, name varchar(20));

在这里插入图片描述

2、退出mysql在sqoop目录下执行命令

执行命令将HDFS中原本的表student数据导入到表hdfsinto中

bin/sqoop export --connect "jdbc:mysql://localhost:3306/test" --username root --password 123456 --table hdfsinto --export-dir /sqoop/mysql/*

参数含义:

--table 数据导入所在表的表名
--export-dir 数据所在位置

3、回到mysql查看表hdfsinto数据
在这里插入图片描述

从MYSQL导出数据到hive(Sqoop: Import Data From MySQL to Hive)

参考:https://dzone.com/articles/sqoop-import-data-from-mysql-to-hive

目的:通过Sqoop将MySQL中已有的表student及数据导入到Hive
若没有表,可自行创建一个新表并写入数据,可参考上面的操作

1、查看mysql中的表student
在这里插入图片描述
2、退出mysql在sqoop目录下执行命令

bin/sqoop import --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --columns id,name --table student  --target-dir /sqoop/studentToHive --fields-terminated-by "\t" --hive-import --create-hive-table --hive-table default.student2 -m 1
Debug:

然后报以下错误:

20/06/10 21:20:57 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
20/06/10 21:20:57 ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
        at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:50)
        at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392)
        at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379)
        at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
        at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)
        ... 12 more

解决方法:

去到 {HIVE_HOME}/lib 目录下,而hive-common-1.2.2.jar这个jar还是自己查看以下自己的版本,每个人装的版本不一样

cp hive-common-1.2.2.jar /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/lib/

在这里插入图片描述
然后又报错

20/06/10 21:31:25 INFO hive.HiveImport: Loading uploaded data into Hive
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hive/shims/ShimLoader
        at org.apache.hadoop.hive.conf.HiveConf$ConfVars.<clinit>(HiveConf.java:371)
        at org.apache.hadoop.hive.conf.HiveConf.<clinit>(HiveConf.java:108)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:264)
        at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)
        at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392)
        at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379)
        at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
        at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
        at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:537)
        at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:628)
        at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.shims.ShimLoader
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
        ... 17 more

解决方法:
去到 {HIVE_HOME}/lib 目录下,拷贝这个jar包

cp hive-exec-1.2.2.jar /usr/local/sqoop-1.4.7.bin__hadoop-2.6.0/lib

然后再重新尝试执行sqoop的命令就成功了
在这里插入图片描述

3、查看HDFS
此时该文件 /sqoop/studentToHive 是不存在(前面也可以不设置的),而是存进了hive的数据仓库里

hadoop fs -lsr /

在这里插入图片描述

4、查看Hive

show databases;
use default;
show tables;
select * from student2;

在这里插入图片描述
MySQL中的数据成功导入到了HIve

从Hive导出数据到MySQL

目的:将hive中的表student2数据导入到mysql的表student2中

1、在MySQL中创建一个新表student2或者删除student表的中内容

create table student2(id int primary key, name varchar(20));

delete * from student;

2、确定你的Hive里存在这个表

3、到sqoop目录下执行命令

bin/sqoop export --connect jdbc:mysql://localhost:3306/test --username root --password 123456 --table student2 --export-dir /user/hive/warehouse/student2/ --fields-terminated-by "\t"

在这里插入图片描述

4、登录到mysql查看表student2是否导入数据
在这里插入图片描述

成功!

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值