Sqoop的安装与使用(不常用)

Sqoop的安装与使用

目录

Sqoop

将关系数据库(oracle、mysql、postgresql等)数据与hadoop数据进行转换的工具

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

版本:(两个版本完全不兼容,sqoop1使用最多)
sqoop1:1.4.x
sqoop2:1.99.x

同类产品
DataX:阿里顶级数据交换工具

img

Sqoop架构

sqoop架构非常简单,是hadoop生态系统的架构最简单的框架。

sqoop1由 client 端直接接入 hadoop ,任务通过解析生成对应的 MapReduce 执行

img

sqoop 导入数据到hdfs

img

sqoop导出hdfs数据

img

Sqoop安装及使用

SQOOP安装

1、上传并解压

tar -xvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 

2、修改文件夹名字

mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop-1.4.6

3、修改配置文件

# 切换到sqoop配置文件目录
cd /usr/local/soft/sqoop-1.4.6/conf

# 复制配置文件并重命名
mv sqoop-env-template.sh sqoop-env.sh

# vim sqoop-env.sh 编辑配置文件,并增加以下内容
export HADOOP_COMMON_HOME=/usr/local/soft/hadoop-2.7.6
export HADOOP_MAPRED_HOME=/usr/local/soft/hadoop-2.7.6/share/hadoop/mapreduce
export HBASE_HOME=/usr/local/soft/hbase-1.4.6
export HIVE_HOME=/usr/local/soft/hive-1.2.1
export ZOOCFGDIR=/usr/local/soft/zookeeper-3.4.6/conf
export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6

# 切换到bin目录
cd /usr/local/soft/sqoop-1.4.6/bin
# vim configure-sqoop 修改配置文件,注释掉没用的内容(就是为了去掉警告信息)

img

4、修改环境变量

vim /etc/profile
# 将sqoop的bin目录加入环境变量
source /etc/profile

5、添加MySQL连接驱动

如果需要通过 Sqoop 连接 MySQL

# 从HIVE中复制MySQL连接驱动到$SQOOP_HOME/lib
cp /usr/local/soft/hive-1.2.1/lib/mysql-connector-java-5.1.49.jar /usr/local/soft/sqoop-1.4.6/lib/

6、测试

# 打印sqoop版本
sqoop version

#结果
[root@master sqoop-1.4.6]# sqoop version
22/04/03 15:44:40 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
Sqoop 1.4.6
git commit id c0c5a81723759fa575844a0a1eae8f510fa32c25
Compiled by root on Mon Apr 27 14:38:36 CST 2015

#如果输出的是找不到命令,说明环境变量配置错误

img

# 测试MySQL连通性,查看MySQL中的数据库
sqoop list-databases -connect jdbc:mysql://master:3306?useSSL=false -username root -password 123456

准备MySQL数据

登录MySQL数据库

mysql -u root -p123456;

创建student数据库

create database student;

切换数据库并导入数据

# mysql shell中执行
use student;
source /root/student.sql;
source /root/score.sql;

另外一种导入数据的方式

# linux shell中执行
mysql -u root -p123456 student</root/student.sql
mysql -u root -p123456 student</root/score.sql

使用Navicat运行SQL文件

也可以通过Navicat导入

导出MySQL数据库

mysqldump -u root -p123456 数据库名>任意一个文件名.sql

import

从传统的关系型数据库导入HDFS、HIVE、HBASE......

MySQLToHDFS

编写脚本,保存为MySQLToHDFS.conf
import
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
--m
2
--split-by
age
--target-dir	# 导入数据的目的地路径
/sqoop/data/student1
--fields-terminated-by	# 字段分割方式
','
执行脚本
sqoop --options-file MySQLToHDFS.conf
注意事项:

1、--m 表示指定生成多少个Map任务,不是越多越好,因为MySQL Server的承载能力有限

2、当指定的Map任务数>1,那么需要结合--split-by参数,指定分割键,以确定每个map任务到底读取哪一部分数据,最好指定数值型的列,最好指定主键(或者分布均匀的列=>避免每个map任务处理的数据量差别过大)

3、如果指定的分割键数据分布不均,可能导致数据倾斜问题

4、分割的键最好指定数值型的,而且字段的类型为int、bigint这样的数值型

5、编写脚本的时候,注意:例如:--username 参数,参数值不能和参数名同一行

--username root  // 错误的

// 应该分成两行
--username
root

6、运行的时候会报错InterruptedException,hadoop2.7.6自带的问题,忽略即可

21/01/25 14:32:32 WARN hdfs.DFSClient: Caught exception 
java.lang.InterruptedException
	at java.lang.Object.wait(Native Method)
	at java.lang.Thread.join(Thread.java:1252)
	at java.lang.Thread.join(Thread.java:1326)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.closeResponder(DFSOutputStream.java:716)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.endBlock(DFSOutputStream.java:476)
	at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:652)

7、实际上sqoop在读取mysql数据的时候,用的是JDBC的方式,所以当数据量大的时候,效率不是很高

8、sqoop底层通过MapReduce完成数据导入导出,只需要Map任务,不需要Reduce任务

9、每个Map任务会生成一个文件

MySQLToHive

先会将MySQL的数据导出来并在HDFS上找个目录临时存放,默认为:/user/用户名/表名

然后再将数据加载到Hive中,加载完成后,会将临时存放的目录删除

编写脚本,并保存为MySQLToHIVE.conf文件
import 
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
score
--fields-terminated-by	#列分割方式
"\t"
--lines-terminated-by 	#行分割方式
"\n"
--m
3
--split-by	#分割字段
student_id
--hive-import
--hive-overwrite	#覆盖
--create-hive-table	#自动创建hive中的表
--hive-database
testsqoop
--hive-table
score
--delete-target-dir	#自动删除目录
在Hive中创建testsqoop库
hive> create database testsqoop;
将HADOOP_CLASSPATH加入环境变量中
vim /etc/profile
# 加入如下内容
export HADOOP_CLASSPATH=$HADOOP_HOME/lib:$HIVE_HOME/lib/*

# 重新加载环境变量
source /etc/profile
将hive-site.xml放入SQOOP_HOME/conf/
cp /usr/local/soft/hive-1.2.1/conf/hive-site.xml /usr/local/soft/sqoop-1.4.6/conf/
执行脚本
sqoop --options-file MySQLToHIVE.conf
--direct

加上这个参数,可以在导出MySQL数据的时候,使用MySQL提供的导出工具mysqldump,加快导出速度,提高效率

需要将master上的/usr/bin/mysqldump分发至 node1、node2的/usr/bin目录下

scp /usr/bin/mysqldump node1:/usr/bin/
scp /usr/bin/mysqldump node2:/usr/bin/
-e参数的使用

增加过滤条件

$CONDITIONS 是一个动态的条件,因为指定的两个并行度中对于 student_id 的范围都不一样,所以需要加这个分割字段中的动态条件

import 
--connect 
jdbc:mysql://master:3306/student 
--username 
root 
--password 
123456 
--fields-terminated-by 
"\t" 
--lines-terminated-by 
"\n" 
--m 
2 
--split-by 
student_id 
--e 
"select * from score where student_id=1500100011 and $CONDITIONS"	
--hive-import 
--hive-overwrite 
--create-hive-table 
--hive-database 
testsqoop 
--hive-table 
score2

MySQLToHBase

编写脚本,并保存为MySQLToHBase.conf
import 
--connect 
jdbc:mysql://master:3306/student?useSSL=false
--username 
root 
--password 
123456
--table 
student
--hbase-table 
student
--hbase-create-table
--hbase-row-key 
id 
--m 
1
--column-family 
cf1
在HBase中创建student表
create 'student1','cf1'
执行脚本
sqoop --options-file MySQLToHBase.conf

export

HDFSToMySQL

编写脚本,并保存为HDFSToMySQL.conf
export
--connect
jdbc:mysql://master:3306/student?useSSL=false
--username
root
--password
123456
--table
student
-m
1
--columns
id,name,age,gender,clazz
--export-dir
/sqoop/data/student1/
--fields-terminated-by 
','
先清空MySQL student表中的数据,不然会造成主键冲突
执行脚本
sqoop --options-file HDFSToMySQL.conf

查看sqoop help

sqoop help

21/04/26 15:50:36 INFO sqoop.Sqoop: Running Sqoop version: 1.4.6
usage: sqoop COMMAND [ARGS]

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

See 'sqoop help COMMAND' for information on a specific command.
# 查看import的详细帮助
sqoop import --help

增量导入数据

之前我们做的Sqoop的导入导出都是全量的

那么如何做增量的数据导入呢?

–check-column
用来指定一些列,这些列在增量导入时用来检查这些数据是否作为增量数据进行导入,和关系型数据库中的自增字段及时间戳类似.
注意:这些被指定的列的类型不能使任意字符类型,如char、varchar等类型都是不可以的,同时–check-column可以去指定多个列
–incremental
用来指定增量导入的模式,两种模式分别为Append和Lastmodified
–last-value
指定上一次导入中检查列指定字段最大值

这里有两种组合

–check-column` 和 `–incremental
–incremental` 和 `last-value
Error during import: --merge-key or --append is required when using --incremental lastmodified and the output directory exists.
当--incremental lastmodified 并且输出的路径不为空,则需要加上 --append(追加) 或者 --merge-key(合并,当一个mapreduce任务运行完,还会启动另外一个mapreduce任务进行去重)

MySQL建表语句:

create table student
 (
     id int(10) not null AUTO_INCREMENT,
     name char(5),
     age int,
     gender char(2),
     clazz char(4),
     primary key (id),
     #CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 这是一个函数,会自动记录我们数据更新的时间
     last_mod timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP	
 ) DEFAULT CHARSET=utf8;

指定字段的取值范围,增量导数据

适用于表不断的有新数据插入

第一种:不使用上方 last_mod 字段

导入id大于等于last-value的数据,id必须是递增的字段,乱序的数据不能使用

只适合于不断的追加数据,id是递增的情况

下面是命令行中使用的命令,不用创建 .conf 结尾的文件了

sqoop import \
--connect 'jdbc:mysql://master:3306/bigdata?characterEncoding=UTF-8&useSSL=false' \
--username root \
--password 123456 \
--table student \
--target-dir /sqoop/data/student5 \
--split-by id \
--m 2 \
--fields-terminated-by ',' \
--incremental append \
--check-column id \
--last-value 1500100009

第二种:使用上方 last_mod 字段

导入--check-column指定的last_mod列的值大于等于--last-value "2021-04-26 12:00:00"

如果加上--merge-key 会在导入之后再做去重

sqoop import \
--connect 'jdbc:mysql://master:3306/bigdata?characterEncoding=UTF-8' \
--username root \
--password 123456 \
--table student \
--target-dir /sqoop/data/student1 \
--split-by id \
--m 2 \
--fields-terminated-by ',' \
--incremental lastmodified \
--check-column last_mod \
--last-value "2022-04-01 15:54:58" \
--merge-key id
posted @   阿伟宝座  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示