Sqoop的安装和使用

Sqoop的安装和使用

概述

Sqoop是一款开源的数据导入导出工具,可以将传统的关系型数据库导出至HDFS,也可以将HDFS中的数据导出至关系型数据库。

官网http://sqoop.apache.org/

原理:在Hadoop生态体系中,计算基本依赖于MR,那么Sqoop也是如此,Sqoop就是将Sqoop语句翻译成MR程序,来实现一个数据导入和导出的操作。那就不难理解到Sqoop就是一个对于InpuFormat和OutputFormat进行特殊定制的MR程序。

安装

下载
官方下载地址:http://www.apache.org/dyn/closer.lua/sqoop/1.4.7

解压
上传至Linux 服务器,解压在相关位置即可。

修改配置文件
将conf目录下的sqoop-env.template.sh改名

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.8.4

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

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

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

#Set the path for where zookeper config dir is
#export ZOOCFGDIR=

拷贝JDBC驱动
将Mysql或者其他使用到的数据的JDBC驱动拷贝到Sqoop根目录下lib目录。

验证启动

 sqoop-version
 预期的输出:
15/12/17 14:52:32 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6 git commit id 5b34accaca7de251fc91161733f906af2eddbe83
Compiled by abe on Fri Aug 1 11:19:26 PDT 2015
 ./sqoop-list-databases --connect jdbc:mysql://192.168.134.1:3306 --username root --password yhm1211.

预期输出:
18/10/23 17:09:44 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
18/10/23 17:09:44 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
18/10/23 17:09:45 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset.
information_schema
hive
mysql
performance_schema
shortvideo
test

使用

导出数据

导入数据使用export关键字,指的就是从大数据集群导入至传统的关系型数据库

HDFS 到RDBMS
这里以 MySQL 为例
准备数据
准备数据需要在Mysql中建立新表’

DROP TABLE IF EXISTS `logs`;
CREATE TABLE `logs` (
  `uuid` varchar(255) NOT NULL,
  `userid` varchar(255) DEFAULT NULL,
  `fromUrl` varchar(255) DEFAULT NULL,
  `dateString` varchar(255) DEFAULT NULL,
  `timeString` varchar(255) DEFAULT NULL,
  `ipAddress` varchar(255) DEFAULT NULL,
  `browserName` varchar(255) DEFAULT NULL,
  `pcSystemNameOrmobileBrandName` varchar(255) DEFAULT NULL,
  `systemVersion` varchar(255) DEFAULT NULL,
  `language` varchar(255) DEFAULT NULL,
  `cityName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

数据导出
这里数据是使用MR进行清洗后得到的数据

sqoop export \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--export-dir /clean01  \
--input-fields-terminated-by ' ' \
--m 1

导入数据

导入数据使用import关键字,指的就是从传统的关系型数据库导入至大数据集群
RDBMS 到 HDFS
准备数据
数据库中还是上述文档中创建的logs。将logs中的数据导入至HDFS
导入数据
(1)全部导入

sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /sqoop_test/clean01 \
--num-mappers 1 \
--fields-terminated-by " " \

(2)条件导入
通过手动指定查询条件导入数据 ,在查询语句中必须包含$CONDITIONS关键字

sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--target-dir /sqoop_test/clean03 \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by " "  \
--query 'select *  from logs  where  $CONDITIONS limit 1,5'

(3)导入指令列
其实和手动输入查询条件时一样的效果 注意: 多列之间使用逗号进行分割

sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /sqoop_test/clean05 \
--num-mappers 1 \
--fields-terminated-by " " \
--columns userid,cityName

RDBMS 到 Hive

准备数据
还是上述建表语句

导入数据

sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database default \
--hive-table logs \
--delete-target-dir 

填坑三部曲
在这里插入图片描述

解决办法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/

在这里插入图片描述

解决办法: cp /home/hive/apache-hive-1.2.1-bin/lib/hive-exec-1.2.1.jar /home/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/lib/ 

在这里插入图片描述
这里可以看出当前使用hive中logs是带有分区的,但是在导入的时候没有去指定具体是哪个分区,所以问题就在这里。
在这里插入图片描述
从 sqoop import --help 给出帮助指令可以看到sqoop也提供了相关的解决方案,那只需要在上述语句中加入相关字段即可:–hive-partition-key day|–hive-partition-value 19-06-20

sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--num-mappers 1 \
--hive-import \
--fields-terminated-by " " \
--hive-overwrite \
--hive-database default \
--hive-table logs \
--delete-target-dir \
--hive-partition-key day \
--hive-partition-value 19-06-20

hive到mysql

sqoop export \
--connect "jdbc:mysql://192.168.134.151:3306/logs?useUnicode=true&characterEncoding=UTF-8" \
--username root \
--password yhm1211. \
--table logs \
--export-dir /user/hive/warehouse/logs/day=18-10-18     \
--input-fields-terminated-by ' ' \

RDBMS 到 HBase

sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--columns "uuid,userid,fromurl" \
--column-family "log_basic" \
--hbase-create-table \
--hbase-row-key "uuid" \
--hbase-table "logs" \
--num-mappers 1 \
--split-by uuid

Mysql编码问题

在使用Sqoop导出数据的过程中,特别是从Linux到Win的数据库的过程中,很容易出现编码不一致的问题。

使用下面的文档将数据库编码更改为统一编码。

使用Sqoop1.4.7中可以在HBase1.2.4中自动建立相关表

一、mysql中的编码
mysql> show variables like 'collation_%';  
mysql> show variables like 'character_set_%';
  
缺省是latin1编码,会导致中文乱码。
修改库的编码:
mysql> alter database db_name character set utf8;
修改表的编码:
mysql> ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

可以在mysql中设置编码,单个设置 
mysql> set character_set_connection=utf8;
mysql> set character_set_database=utf8;
mysql> set character_set_results=utf8;
mysql> set character_set_server=utf8;
但重启后会失效。

可以修改配置文件:
[root@Hadoop48 ~]# vi /etc/my.cnf  
[mysql]  
default-character-set=utf8  
[client]  
default-character-set=utf8  
[mysqld]  
default-character-set=utf8  
character_set_server=utf8  
init_connect='SET NAMES utf8' 
重启mysql,这样确保缺省编码是utf8

连接命令
?useUnicode=true&characterEncoding=UTF-8

常见参数详解

https://blog.csdn.net/myrainblues/article/details/43673129

https://blog.csdn.net/wtzhm/article/details/81810159

顶级命令列举

来源 sqoop-help

命令说明
codegen数据生成Java并打包
create-hive-table获取数据库中某张表
eval查看SQL执行结果
export将集群数据导出
help打印sqoop帮助信息
import将数据导入到集群
import-all-tables导入某个数据库下所以表到HDFS中
import-mainframe将数据集从大型机服务器导入到HDFS
job用来生成一个 sqoop的任务,生成后,该任务并不执行,除非使用命令执行该任务。
list-databases列出所以数据库名
list-tables列出某个数据库下所以表
merge将HDFS中不同目录下面的数据合在一起,并存放在指定的目录中
metastore记录 sqoop job 的元数据信息,如果不启动 metastore 实例,则默认的元数据存储目录为:~/.sqoop,如果要更改存储目录,可以 在 配 置 文 件sqoop-site.xml中进行更改。
version打印sqoop版本信息

顶级命令详解
export是导出至RDBMS

  • 共用参数:数据库
参数说明
–connect连接关系型数据库的 URL
–connection-manager指定要使用的连接管理类
–driverHadoop根目录
–help打印帮助信息
–password连接数据库密码
–username连接数据库的用户名
–verbose在控制台打印出详情信息
  • 共用参数:import
参数说明
–enclosed-by 给字段值前加上指定的字符
–escaped-by 对字段中的双引号加转义符
–fields-terminated-by 设定每个字段是以什么符号作为结束,默认为逗号
–lines-terminated-by 设定每行记录之间的分隔符,默认是\n
–mysql-delimitersMysql 默认的分隔符设置,字段之间以逗号分隔,行之间以\n 分隔,默认转义符是\,字段值以单引号包裹
–optionally-enclosed-by 给带有双引号或单引号的字段值前后加上指定字符
  • 共用参数:export
参数说明
–input-enclosed-by 对字段值前后加上指定字符
–input-escaped-by 对含有转移符的字段做转义处理
–input-fields-terminated-by 字段之间的分隔符
–input-lines-terminated-by 行之间的分隔符
–input-optionally-enclosed-by 给带有双引号或单引号的字段前后加上指定字符
  • 共用参数:hive
参数说明
–hive-delims-replacement 用自定义的字符串替换掉数据中的\r\n和\013 \010等字符
–hive-drop-import-delims在导入数据到 hive 时,去掉数据中的\r\n\013\010 这样的字符
–map-column-hive 生成 hive 表时,可以更改生成字段的数据类型
–hive-partition-key创建分区,后面直接跟分区名,分区字段的默认类型为string
–hive-partition-value 导入数据时,指定某个分区的值
–hive-home hive 的安装目录,可以通过该参数覆盖之前默认配置的目录
–hive-import将数据从关系数据库中导入到 hive 表中
–hive-overwrite覆盖掉在 hive 表中已经存在的数据
–create-hive-table默认是 false,即,如果目标表已经存在了,那么创建任务失败
–hive-table后面接要创建的 hive 表,默认使用 MySQL 的表名

次级参数详解

次级参数值得就是使用导出或者导入时使用的相关参数,均可使用–help来获得

import
import导入命令在上述文档中已经提到过,在这里就不再列举基本的操作,而是对数据进行增量操作

增量导入
首先是增量导入数据至Hive,但是指的注意的是现在不能指定hive相关的参数,说白了就是使用导入HDFS的方式导入hive,在此基础上加上增量导入相关参数

准备数据

开始导入

sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table user01 \
--hive-import 
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20  \
--num-mappers 1 \
--fields-terminated-by " " \
--incremental append \
--check-column uuid \
-m 1
sqoop import \
--connect jdbc:mysql://192.168.134.1:3306/sqoop_test \
--username root \
--password yhm1211. \
--table logs \
--target-dir /user/hive/warehouse/logs/day=19-06-20  \
--num-mappers 1 \
--fields-terminated-by " " \
--append \
-m 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值