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 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
指定输出路径、指定数据分隔符
–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后面使用的是双引号,那么需要在 CONDITIONS这个参数必须加上而且存在单引号与双引号的区别,如果−−query后面使用的是双引号,那么需要在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
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 数据所在位置
参考: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
然后报以下错误:
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
3、查看HDFS
此时该文件 /sqoop/studentToHive 是不存在(前面也可以不设置的),而是存进了hive的数据仓库里
hadoop fs -lsr /
4、查看Hive
show databases;
use default;
show tables;
select * from student2;
目的:将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"
成功!