CentOS7 Sqoop 安装和使用

CentOS7 Sqoop 安装和使用

一、概述
sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。
核心的功能有两个:
导入、迁入
导出、迁出
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等 Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
sqoop:
工具:本质就是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序
hive
工具,本质就是执行计算,依赖于HDFS存储数据,把SQL转换成MR程序

二、安装步骤

  1. 上传软件包并解压
    tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /home/hadoop/
    mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop
  2. 修改配置文件
    cd /home/hadoop/sqoop/conf
    mv sqoop-env-template.sh sqoop-env.sh
    vi sqoop-env.sh

#Set path to where bin/hadoop is available
export HADOOP_COMMON_HOME=/home/hadoop/hadoop-2.7.7

#Set path to where hadoop-*-core.jar is available
export HADOOP_MAPRED_HOME=/home/hadoop/hadoop-2.7.7

#set the path to where bin/hbase is available
export HBASE_HOME=/home/hadoop/hbase

#Set the path to where bin/hive is available
export HIVE_HOME=/home/hadoop/hive

#Set the path for where zookeper config dir is
export ZOOCFGDIR=/home/hadoop/zookeeper/conf

3.加入mysql驱动包
cp mysql-connector-java-5.1.40.jar /home/hadoop/sqoop/lib/
3. 配置环境变量

#set java environment
export JAVA_HOME=/home/hadoop/jdk1.8.0_40
export JRE_HOME=/home/hadoop/jdk1.8.0_40/jre
export CLASSPATH=.: J R E H O M E / l i b / r t . j a r : JRE_HOME/lib/rt.jar: JREHOME/lib/rt.jar:JAVA_HOME/lib/dt.jar: J A V A H O M E / l i b / t o o l s . j a r e x p o r t P A T H = JAVA_HOME/lib/tools.jar export PATH= JAVAHOME/lib/tools.jarexportPATH=PATH: J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:JRE_HOME/bin
#set hadoop environment
export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
export HADOOP_LOG_DIR= H A D O O P H O M E / l o g s e x p o r t Y A R N L O G D I R = HADOOP_HOME/logs export YARN_LOG_DIR= HADOOPHOME/logsexportYARNLOGDIR=HADOOP_LOG_DIR
export PATH= H A D O O P H O M E / b i n : HADOOP_HOME/bin: HADOOPHOME/bin:HADOOP_HOME/sbin:$PATH

#set pig env
export PIG_HOME=/home/hadoop/pig
export PIG_CLASSPATH= H A D O O P H O M E / c o n f e x p o r t P A T H = HADOOP_HOME/conf export PATH= HADOOPHOME/confexportPATH=PATH:$PIG_HOME/bin

#set hbase,hive,zk
ZK_HOME=/home/hadoop/zookeeper
HBASE_HOME=/home/hadoop/hbase
HIVE_HOME=/home/hadoop/hive
export SQOOP_HOME=/home/hadoop/sqoop
export HADOOP_CLASSPATH= ( ( (HADOOP_HOME/bin/hadoop classpath): H I V E H O M E / l i b / ∗ ( 也 可 以 把 h i v e − s i t e . x m l 放 入 到 s q o o p 的 c o n f 目 录 下 ) e x p o r t P A T H = HIVE_HOME/lib/* (也可以把hive-site.xml放入到sqoop的conf目录下) export PATH= HIVEHOME/lib/(hivesite.xmlsqoopconf)exportPATH=PATH: P I G H O M E / b i n : PIG_HOME/bin: PIGHOME/bin:ZK_HOME/bin: H B A S E H O M E / b i n : HBASE_HOME/bin: HBASEHOME/bin:HIVE_HOME/bin:$SQOOP_HOME/bin

测试
sqoop version

回到顶部
三、Sqoop的基本命令
基本操作
首先,我们可以使用 sqoop help 来查看,sqoop 支持哪些命令

然后得到这些支持了的命令之后,如果不知道使用方式,可以使用 sqoop command 的方式 来查看某条具体命令的使用方式,比如:
View Code
示例
列出MySQL数据有哪些数据库
See ‘sqoop help COMMAND’ for information on a specific command.
[hadoop@hadoop ~]$ sqoop list-databases --connect jdbc:mysql://hadoop:3306/ --username root --password 123456
Warning: /home/hadoop/sqoop/…/hcatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /home/hadoop/sqoop/…/accumulo does not exist! Accumulo imports will fail.
Please set A C C U M U L O H O M E t o t h e r o o t o f y o u r A c c u m u l o i n s t a l l a t i o n . 19 / 05 / 0517 : 20 : 46 I N F O s q o o p . S q o o p : R u n n i n g S q o o p v e r s i o n : 1.4.719 / 05 / 0517 : 20 : 46 W A R N t o o l . B a s e S q o o p T o o l : S e t t i n g y o u r p a s s w o r d o n t h e c o m m a n d − l i n e i s i n s e c u r e . C o n s i d e r u s i n g − P i n s t e a d . 19 / 05 / 0517 : 20 : 46 I N F O m a n a g e r . M y S Q L M a n a g e r : P r e p a r i n g t o u s e a M y S Q L s t r e a m i n g r e s u l t s e t . i n f o r m a t i o n s c h e m a h i v e m y s q l p e r f o r m a n c e s c h e m a t e s t [ h a d o o p @ h a d o o p   ] ACCUMULO_HOME to the root of your Accumulo installation. 19/05/05 17:20:46 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 19/05/05 17:20:46 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 19/05/05 17:20:46 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. information_schema hive mysql performance_schema test [hadoop@hadoop ~] ACCUMULOHOMEtotherootofyourAccumuloinstallation.19/05/0517:20:46INFOsqoop.Sqoop:RunningSqoopversion:1.4.719/05/0517:20:46WARNtool.BaseSqoopTool:Settingyourpasswordonthecommandlineisinsecure.ConsiderusingPinstead.19/05/0517:20:46INFOmanager.MySQLManager:PreparingtouseaMySQLstreamingresultset.informationschemahivemysqlperformanceschematest[hadoop@hadoop ]
列出MySQL中的某个数据库有哪些数据表:
[hadoop@hadoop3 ~]$ sqoop list-tables \

–connect jdbc:mysql://hadoop:3306/mysql
–username root
–password 123456

创建一张跟mysql中的help_keyword表一样的hive表hk:

sqoop create-hive-table --connect jdbc:mysql://hadoop:3306/test --username root --password 123456 --table fw --hive-table fw

报错是因为hive与sqoop的jar包存在冲突,则把hive的jar包重复替换到sqoop中
rm $SQOOP_HOME/lib/jackson*.jar
cp $HIVE_HOME/lib/jackson*.jar $SQOOP_HOME/lib/

提示报错:

这个时候其实不影响sqoop执行,但是为了解决这个问题,特意百度了下,需要修改jre下的文件
在tomcat所用的jre/lib/security/java.policy文件中新增
permission javax.management.MBeanTrustPermission “register”;

至此问题解决。

五、Sqoop的数据导入
“导入工具”导入单个表从 RDBMS 到 HDFS。表中的每一行被视为 HDFS 的记录。所有记录 都存储为文本文件的文本数据(或者 Avro、sequence 文件等二进制数据)
1、从RDBMS导入到HDFS中
语法格式
sqoop import (generic-args) (import-args)
常用参数
–connect jdbc 连接地址
–connection-manager 连接管理者
–driver 驱动类
–hadoop-mapred-home

$HADOOP_MAPRED_HOME
–help help 信息
-P 从命令行输入密码
–password 密码
–username 账号
–verbose 打印流程信息
–connection-param-file 可选参数

示例
普通导入:导入mysql库中的fw的数据到HDFS上
导入的默认路径:/user/hadoop/help_keyword
sqoop import --connect jdbc:mysql://hadoop:3306/test --username root --password 123456 --table fw -m 1
[hadoop@hadoop4 ~]$ hadoop fs -cat /user/hadoop/fw/part-m-00000

导入: 指定分隔符和导入路径
sqoop import
–connect jdbc:mysql://hadoop1:3306/test
–username root
–password 123456
–table fw
–target-dir /user/hadoop/fw33
–fields-terminated-by ‘\t’
-m 2
导入数据:带where条件
sqoop import
–connect jdbc:mysql://hadoop1:3306/test
–username root
–password 123456
–where "name=‘STRING’ "
–table fw
–target-dir /user/hadoop/fw22
-m 1

查询指定列
sqoop import
–connect jdbc:mysql://hadoop1:3306/test
–username root
–password 123456
–columns “name”
–where "name=‘STRING’ "
–table fw
–target-dir /user/hadoop/fw11
-m 1
select name from fw where name = “string”
导入:指定自定义查询SQL
sqoop import
–connect jdbc:mysql://hadoop:3306/
–username root
–password 123456
–target-dir /user/hadoop/fw1
–query ‘select id,name from test.fw where $CONDITIONS and name = “fw”’
–split-by id
–fields-terminated-by ‘\t’
-m 4

在以上需要按照自定义SQL语句导出数据到HDFS的情况下:
1、引号问题,要么外层使用单引号,内层使用双引号, C O N D I T I O N S 的 CONDITIONS的 CONDITIONS符号不用转义, 要么外层使用双引号,那么内层使用单引号,然后 C O N D I T I O N S 的 CONDITIONS的 CONDITIONS符号需要转义
2、自定义的SQL语句中必须带有WHERE $CONDITIONS
2、把MySQL数据库中的表数据导入到Hive中
Sqoop 导入关系型数据到 hive 的过程是先导入到 hdfs,然后再 load 进入 hive
普通导入:数据存储在默认的default hive库中,表名就是对应的mysql的表名:

sqoop import --connect jdbc:mysql://hadoop:3306/test
–username root
–password 123456
–table fw
–hive-import -m 1
导入过程
第一步:导入mysql.fw的数据到hdfs的默认路径
第二步:自动仿造mysql.fw去创建一张hive表, 创建在默认的default库中
第三步:把临时目录中的数据导入到hive表中
指定行分隔符和列分隔符,指定hive-import,指定覆盖导入,指定自动创建hive表,指定表名,指定删除中间结果数据目录

sqoop import --connect jdbc:mysql://hadoop:3306/test
–username root
–password 123456
–table fw
–split-by id
–fields-terminated-by “\t”
–lines-terminated-by “\n”
–hive-import
–hive-overwrite
–create-hive-table
–delete-target-dir
–hive-database myhive
–hive-table fw_hive

select * from myhive.fw_hive limit 10;

上面的导入语句等价于

sqoop import --connect jdbc:mysql://hadoop:3306/test
–username root
–password 123456
–table fw
–split-by id \

–fields-terminated-by “\t”
–lines-terminated-by “\n”
–hive-import
–hive-overwrite
–create-hive-table \
–hive-table myhive.fw_hive
–delete-target-dir

增量导入
执行增量导入之前,先清空hive数据库中的fw_hive表中的数据
truncate table fw_hive;

sqoop import --connect jdbc:mysql://hadoop:3306/test
–username root
–password 123456
–table fw
–target-dir /user/hadoop/myimport_add
–incremental append
–check-column id
–last-value 500 -m 1

3、把MySQL数据库中的表数据导入到hbase
普通导入

sqoop import --connect jdbc:mysql://hadoop:3306/test
–username root
–password 123456
–table fw
–hbase-table fw
–column-family person
–hbase-row-key id
-m 1
此时会报错,因为需要先创建Hbase里面的表,再执行导入的语句
hbase(main):001:0> create ‘fw’,‘person’
Created table fw
Took 3.2418 seconds
=> Hbase::Table - fw
hbase(main):002:0>
[hadoop@hadoop ~]$ cp hbase/conf/hbase-site.xml sqoop/conf/

如果报错,有可能是HBASE与Sqoop版本不匹配,后面要注意下。

你可能感兴趣的:(sqoop)