IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> day 54 Sqoop -> 正文阅读

[大数据]day 54 Sqoop


I know, i know
地球另一端有你陪我




一、Sqoop

Apache开源软件,主要用于在HADOOP(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递。

数据吞吐量大:依赖hadoop集群(mapreduce)可进行大批量数据集成。

操作有技术要求:sqoop操作没有可视化设计器,对使用人员有较专业的技术要求。

多种交互方式:命令行,web UI,rest API。

部署不方便:sqoop依赖大数据集群,使用sqoop要求数据传输的的源要与大数据集群的所有节点能进行通信。

适用场景:适用于能与大数据集群直接通信的关系数据库间的大批量数据传输。

1、SQOOP安装

1 上传并解压

tar -zxvf sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/local/soft/

2 修改文件夹名字

mv sqoop-1.4.7.bin__hadoop-2.6.0/ sqoop-1.4.7

3 修改配置文件

# 切换到sqoop配置文件目录
cd /usr/local/soft/sqoop-1.4.7/conf
# 复制配置文件并重命名
cp 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.7/bin
# vim configure-sqoop 修改配置文件,注释掉没用的内容(就是为了去掉警告信息)
image.png

4 修改环境变量

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

5 添加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.7/lib/

6 测试

# 打印sqoop版本
sqoop version
image.png
# 测试MySQL连通性
sqoop list-databases -connect jdbc:mysql://master:3306?useSSL=false -username root -password 123456

准备MySQL数据

登录MySQL数据库
注意,密码是紧跟着-p的

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文件

导出MySQL数据库

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

箭头即为指向



2、import

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

2.1 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
/bdtools/sqoop/sqltoHDFS
--delete-target-dir
--fields-terminated-by
','

执行脚本

sqoop --options-file MySQLToHDFS.conf

注意事项:

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

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

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

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的方式,所以当数据量大的时候,mapreduce启动会很慢,并且受限于mySQL,当数据量过大后读取会较慢,效率不是很高

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

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

10、如果不指定切分对象,却依然分配多个map task,会默认使用主键进行切分

11、可以在每一行的后面加上“/”可以让代码直接在shell命令行中执行

2.2 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-database
testsqoop
--hive-table
score
--delete-target-dir
--direct

在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.7/conf/

执行脚本

sqoop --options-file MySQLToHIVE.conf

–direct

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

由于 mapreduce 是在 namenode 中执行的,因此需要分发到 namenode

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

scp /usr/bin/mysqldump node1:/usr/bin/
scp /usr/bin/mysqldump node2:/usr/bin/

-e参数的使用

执行查询语句,import部分数据

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" 
--target-dir
/testQ
--hive-import 
--hive-overwrite 
--create-hive-table 
--hive-database 
testsqoop 
--hive-table 
score2

2.3 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 'student','cf1'

执行脚本

sqoop --options-file MySQLToHBase.conf

3、export

3.1 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
/bdtools/sqoop/sqltoHDFS/
--fields-terminated-by 
','

先清空MySQL student表中的数据,不然会造成主键冲突

执行脚本

sqoop --options-file HDFSToMySQL.conf

4、查看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

5、增量导入

–check-column
检查字段是否自增(数据唯一),和关系型数据库中的自增字段及时间戳类似.

注意:这些被指定的列的类型不能使任意字符类型,
如char、varchar等类型都是不可以的,同时–check-column可以去指定多个列

–incremental
用来指定增量导入的模式,两种模式分别为 Append 和 Lastmodified

–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任务进行去重)

建表

create table student
(
id int(10) not null AUTO_INCREMENT,
name char(5),
age int,
gender char(2),
clazz char(4),
primary key (id),
last_mod timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) DEFAULT CHARSET=utf8;

此处的时间戳即默认按修改时间更新为修改时间

append

sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--password 123456 \
--table student \
--target-dir /sqoop/data/test1 \
--split-by id \
--m 1 \
--fields-terminated-by ',' \
--incremental append \
--check-column id \
--last-value 1500100996

append 即保留原数据文件,每次执行都会追加新的数据文件


### last_mod
sqoop import \
--connect 'jdbc:mysql://master:3306/student?useSSL=false' \
--username root \
--driver com.mysql.jdbc.Driver \
--password 123456 \
--table student \
--target-dir /sqoop/data/student6 \
--split-by id \
--m 1 \
--fields-terminated-by ',' \
--incremental lastmodified \
--check-column last_mod \
--last-value "2021-12-07 21:14:00" \
--merge-key \
id

导入–check-column指定last_mod列

–last-value “2021-12-06 16:46:00” :值大于等于

如果不加 --append 或 --merge-key,会因为路径冲突报错
–append 会保留源文件进行追加
–merge-key 会在导入之后在做去重
二者都是依赖 reduce 进行的

总结

1、sql 存在删除表和截断表,区别在于:
删除表,表完全删除,但是可以通过日志进行恢复
截断表,等同于 truncate,无法恢复记录

2、sql 可视化界面中导入表,右键 — 执行 sql 文件

3、输入(import)和输出(export)是针对 HDFS 来描述的,类比流

4、shell 查询命令位置:where is 命令

5、ETL:萃取(Extract)、转换(Transform)、加载(Load)

6、开启 zk 时,尽量保持不要有复制的节点,否则部分节点可能连接不上

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:53:00  更:2021-12-08 13:55:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:45:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码