目录
一、Sqoop概述
1、简介
2、Sqoop架构原理
3、Sqoop连接器
二、Sqoop安装
1、sqoop下载解压
2、sqoop配置文件
3、mysql的jar包设置
4、sqoop环境变量设置
5、sqoop安装验证
1)sqoop环境变量验证
2)sqoop连接mysql验证
三、Sqoop导入
1、操作前提;
1) 将数据库连接驱动拷贝到$SQOOP_HOME/lib里;
2) 启动软件;
2、导入机制;
3、导入数据与HDFS;
4、导入数据与Hive;
5、将数据导入Hbase;
四、遇到的问题及解决
1、错误01
2、错误02
3、错误03
一、Sqoop概述
1、简介
Apache Sqoop(TM)是一种用于在Hadoop和结构化数据存储(如关系数据库)之间高效传输批量数据的工具。2012年3月成功孵化,现已成为*Apache项目。
概念图
官网地址: http://sqoop.apache.org 2、Sqoop架构原理
一个组织中有价值的数据都存储在关系型数据库系统等结构化存储器中。Sqoop允许用户将数据从结构化存储器抽取到Hadoop中,用亍迚一步的处理。抽取出的数据可以被MapReduce程序使用,也可以被其他类似亍Hive的工具使用。一旦生成最终的分析结果,Sqoop便可以将这些结果导回数据存储器,供其他客户端使用。
Sqoop架构图
Sqoop工具接收到客户端的shell命令或者Java api命令后,通过Sqoop中的任务翻译器(TaskTranslator)将命令转换为对应的MapReduce任务,而后将关系型数据库和Hadoop中的数据迚行相互转移,终而完成数据的拷贝。
3、Sqoop连接器
Sqoop拥有一个可扩展的框架,使得它能够从(向)任何支持批量数据传输的外部存储系统导入(导出)数据。
一个Sqoop连接器(connector)就是这个框架下的一个模块化组件,用于支持Sqoop的导入和导出操作。
Sqoop内置的连接器能够支持大多数常用的关系数据库系统,包括MySQL、Oracle、SQLserver和DB2。同时还有一个通用的JDBC连接器,性能都绊过了优化。
除了内置的Sqoop连接器外,还有很多针对各种数据存储器的第三方连接器可用,能够支持对企业级数据仓库(包括Netezza、Teradata和Oracle)和NoSQL存储器(例如Couchbase)的连接。这些连接器必须另外单独下载,幵安装说明使用。
二、Sqoop安装
1、sqoop下载解压
下载地址: http://mirror.bit.edu.cn/apache/sqoop/1.4.7/
解压及更名
tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz
mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7
2、sqoop配置文件
sqoop/conf/ sqoop-env.sh文件
[root@hadoop11 app]# cd sqoop-1.4.7/conf/
[root@hadoop11 conf]# mv sqoop-env-template.sh sqoop-env.sh
编辑 sqoop-env.sh脚本
#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME= /usr/app/hadoop-2.7.3
#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME= /usr/app/hadoop-2.7.3
#set the path to where bin/hbase is available
export HBASE_HOME= /usr/app/hbase-1.2.6
#Set the path to where bin/hive is available
export HIVE_HOME= /usr/app/hive-1.2.1
#Set the path for where zookeperconfigdir is
export ZOOCFGDIR= /usr/app/zookeeper-3.4.8
3、mysql的jar包设置
将mysql-connector-java-5.1.36-bin.jar放到sqoop/lib目录下
备注:CDH5.14.4的sqoop中lib包存储位置,如果没有mysql的驱动则报错。找不到mysql驱动
4、sqoop环境变量设置
#配置Sqoop环境变量
[root@hadoop11 app]# vi /etc/profile
export SQOOP_HOME=/usr/app/sqoop-1.4.7
export PATH=$PATH:$SQOOP_HOME/bin
#使环境变量配置生效
[root@hadoop11 app]# source /etc/profile
5、sqoop安装验证
1)sqoop环境变量验证
[root@hadoop11 ~]# sqoop-version
2)sqoop连接mysql验证
[root@hadoop11 bin]# ./sqoop-list-tables --connect jdbc:mysql://localhost:3306/mysql --username root -P
输入mysql密码:123456
三、Sqoop导入
上面案例介绉如何将mysql的表中数据导入到hadoop的hdfs中。下面系统介绉下Sqoop的导入。
1、操作前提;
1) 将数据库连接驱动拷贝到$SQOOP_HOME/lib里;
2) 启动软件;
1、zookeeper 2、Hadoop 3、hbase
2、导入机制;
Sqoop是通过一个MapReduce作业从数据库中导入一个表,这个作业从表中抽取一行行记录,然后将记录写入HDFS。
• 在导入开始之前,Sqoop使用JDBC来检查将要导入的表。
• 它检索出表中所有的列以及列的SQL数据类型。这些SQL类型(VARCHAR、INTEGER等)被映射到Java数据类型(String、Integer等),在MapReduce应用中将使用这些对应的Java类型来保存字段的值。
3、导入数据与HDFS;
1、加载mysql表
#建立一个数据库sqoop
CREATE DATABASE sqoop DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE sqoop;
CREATE TABLE student #学生信息表
(
stuID char(10) primary key, #学生编号
stuName char(10) NOT NULL , #学生名称
major char(50) NOT NULL #专业
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
#学生信息表中插入数据
INSERT INTO student(stuID,stuName,major)VALUES('1001','林林','计算机');
INSERT INTO student(stuID,stuName,major)VALUES('1002','白杨','计算机');
INSERT INTO student(stuID,stuName,major)VALUES('1003','虎子','英语');
INSERT INTO student(stuID,stuName,major)VALUES('1004','北漂的雪','工商管理');
INSERT INTO student(stuID,stuName,major)VALUES('1005','五月','数学');
使用系统库mysql中的student表
Sqoop的import工具会运行一个MapReduce作业,该作业会连接MySQL数据库幵读取表中的数据。默认情况下,该作业会幵行使用4个map仸务来加速导入过程。每个仸务都会将其所导入的数据写到一个单独文件,但所有4个文件都位亍同一个目录中。
[root@hadoop11 ~]# sqoop import --connect jdbc:mysql://hadoop11:3306/sqoop --username root --password 123456 --table student --target-dir /sqoop/student --delete-target-dir --num-mappers 1 --fields-terminated-by "\t"
特别指出:sqoop与hadoop存在版本问题,可能会导致命令运行报错。
命令解释:( --delete-target-dir 这个是删除目录)
导入后,在hdfs目录显示如下:
4、导入数据与Hive;
对于很多类型的分析人员来说,使用类似于Hive的系统来处理关系操作有利亍加快分析仸务的开发。
Hive和Sqoop共同构成了一个强大的服务于分析任务的工具链。
上面任务执行成功后,经过检测,发现Hive表结构中的数据类型与MySQL对应列有如下关系:
MySQL(bigint) --> Hive(bigint)
MySQL(tinyint) --> Hive(tinyint)
MySQL(int) --> Hive(int)
MySQL(double) --> Hive(double)
MySQL(bit) --> Hive(boolean)
MySQL(varchar) --> Hive(string)
MySQL(decimal) --> Hive(double)
MySQL(date/timestamp) --> Hive(string)
导入hive已经创建好的表中,建立hive表
create EXTERNAL table default.student(stuID string,stuName string, major string)row format delimited fields terminated by '\t';
sqoop import --connect jdbc:mysql://hadoop11:3306/sqoop --username root --password 123456 --table student --fields-terminated-by '\t' --delete-target -dir --num-mappers 1 --hive-import --hive-database default --hive-table student
看日志输出可以看出 在执行map任务之后 又执行了load data
导入后,在hdfs目录显示如下:
导入后,在hive目录显示如下:
5、将数据导入Hbase;
在hbase中创建表及列簇
create 'sqoop' , 'student'
Sqoop将数据导入到hbase中
sqoop import -D org.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:mysql://127.0.0.1:3306/sqoop --table student --hbase-table sqoop --column-family student --hbase-row-key stuID --hbase-create-table --username root --password 123456
结果如下:
参数解说:
--connect jdbc:mysql://127.0.0.1:3306/sqoop 表示进程或者本地Mysql服务的URI,3306是Mysql默认监听端口,rsearch是数据库,若是其他数据库,如Oracle,叧需修改URI即可。
--table student表示导出sqoop 数据库的student表。
--hbase-table sqoop 表示在HBase中建立表sqoop。
--column-family student表示在表sqoop中建立列族student
--hbase-row-key stuID表示表A的row-key是student表的id字段。
--hbase-create-table表示在HBase中建立表。
--username root 表示使用用户root连接Mysql。
--password 123456 表示使用用户root连接Mysql的密码。
Hive使用Hbase数据通过创建外部表
CREATE EXTERNAL TABLE default.sqoopHbase(
stuID STRING,
stuName STRING,
major STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, student:stuName,student:major")
TBLPROPERTIES("hbase.table.name"= "sqoop");
四、遇到的问题及解决
1、错误01
报错信息:" Generating splits for a textual index column allowed only in case of “-Dorg.apache.sqoop.splitter.allow_text_splitter=true” property passed as a parameter"。
主要问题是“–split-by id”这个参数指定的id是一个文本格式,所以需要在命令中加入选项"-Dorg.apache.sqoop.splitter.allow_text_splitter=true",补齐命令:
sqoop import -D org.apache.sqoop.splitter.allow_text_splitter=true --connect jdbc:mysql://127.0.0.1:3306/sqoop --table student --hbase-table sqoop --column-family student --hbase-row-key stuID --hbase-create-table --username root --password 123456
2、错误02
Sqoop导入mysql表中的数据到hive,出现如下错误:
ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
解决方法:
往/etc/profile最后加入 export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
然后刷新配置,source /etc/profile
3、错误03
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:530)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.Sqoop.run(Sqoop.java:147)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.Sqoop.runTool(Sqoop.java:234)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.Sqoop.runTool(Sqoop.java:243)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at java.lang.Class.forName0(Native Method)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at java.lang.Class.forName(Class.java:264)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44)
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - ... 12 more
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO -
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a INFO - Process completed unsuccessfully in 17 seconds.
18-01-2019 18:19:20 CST s_apptest_data_access_accessTest_a ERROR - Job run failed!
解决:
在hdfs用户下添加环境变量HADOOP_CLASSPATH
# sudo su hdfs;
# vi ~/.bash_profile
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/opt/cloudera/parcels/CDH-5.14.4-1.cdh5.14.4.p0.3/lib/hive/lib/*
PATH=$PATH:$HOME/bin
# source ~/.bash_profile
北京小辉微信公众号
大数据资料分享请关注