Sqoop学习详细介绍!!

一、Sqoop介绍

Sqoop是一款开源的工具,主要用于在Hadoop(HDFS/Hive/HBase)与传统的数据库(mysql、postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。

Sqoop项目开始于2009年,最早是作为Hadoop的一个第三方模块存在,后来为了让使用者能够快速部署,也为了让开发人员能够更快速的迭代开发,Sqoop独立成为一个Apache项目。

二、安装

1).解压
tar -zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /opt/installs
2).重命名
mv sqoop-1.4.6.bin__hadoop-2.0.4-alpha sqoop1.4.6
3).修改配置文件
cd /opt/installs/sqoop1.4.6/conf
mv sqoop-env-template.sh sqoop-env.sh
vi sqoop-env.sh
#增加配置,注意修改路径
export HADOOP_COMMON_HOME=/opt/installs/hadoop3.1.4
export HADOOP_MAPRED_HOME=/opt/installs/hadoop3.1.4
export ZOOCFGDIR=/opt/installs/zookeeper3.4.6
export HIVE_HOME=/opt/installs/hive3.1.2

4).将mysql的驱动jar复制到sqoop的lib目录下 (底层需要用JDBC操作MySQL数据库)
cp /opt/installs/hive3.1.2/lib/mysql-connector-java-8.0.26.jar /opt/installs/sqoop1.4.6/lib/

5).配置sqoop环境变量
export PATH=$PATH:/opt/installs/sqoop1.4.6/bin

三、sqoop-import

在Sqoop中,“导入”概念指:从非大数据集群(RDBMS)向大数据集群(HDFS,HIVE,HBASE)中传输数据,叫做:导入,即使用import关键字。

-- 测试数据库的表是否可以连接,显示库中的所有表
sqoop list-tables --connect jdbc:mysql://hadoop10:3306/test1 --username root --password 123456

1). RDBMS(mysql) -> HDFS

sqoop import \
--driver com.mysql.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_sex \
--num-mappers 4 \
--fields-terminated-by '\t' \
--target-dir /mysql/t_user \
--delete-target-dir

参数                                  作业
--driver                        mysql驱动
--connect                    数据库连接url  jdbc:mysql://ip:3306/数据库
--username                 连接mysql数据库用户名
--password                 连接mysql数据库密码
--table                         mysql中test1数据库中表名
--num-mappers           sqoop底层是mapreduce, 指定启动的maptask个数,海量数据可以并                                    行抽取
                                  解释:sqoop抽取任务会转换成mr作业,该mr作业由于不需要对数据进行聚合,所有只需要保留maptask阶段,没有reduceTasksqoop,需要依赖hadoop的HDFS和Yarn
--fields-terminated-by    数据写入HDFS存储到文件中,列与列之间的分隔符
--target-dir                     存储到HDFS的目标路径,配置的是目录,并且该目录应该不存在
--delete-target-dir          如果存在,则提前删除 

 mysql中的表:

运行1:

 查看:

yarn:

hdfs:


运行2: 

sqoop import \
--driver com.mysql.cj.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_sex \
--columns "id,name" \
--where "id > 2" \
--target-dir /mysql/t_user \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by ','

参数
--columns     指定列名
--where       指定查询条件

查看hdfs:


运行3:

 

sqoop import \
--driver com.mysql.cj.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--num-mappers 2 \
--split-by id \
--fields-terminated-by '\t' \
--query 'select id, name,sex from t_sex where $CONDITIONS and id > 2' \
--target-dir /mysql/t_user \
--delete-target-dir

参数             作用
--split-by      根据指定字段进行拆分,相当于datax的splitPK。根据这一列的值把数据分成几部分
--num-mappers   指定并行度,简写-m 
--query         查询语句。$CONDITIONS相当于占位符,写where条件必须有写这个

查看hdfs:

 

 2). RDBMS -> Hive

运行:

sqoop import \
--driver com.mysql.cj.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_sex \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "," \
--hive-overwrite \
--hive-database test_hive \
--hive-table hive_user

 --hive-import              代表将数据导入hive
--fields-terminated-by   导入hive后,存储在HDFS上文件的分隔符
--hive-database          hive的数据库
--hive-table             上边指定库下的表,可以不存在,会自动创建
--hive-overwrite         将表中数据覆盖

查看hive:

 四、sqoop-export

在Sqoop中,“导出”概念指:从大数据集群(HDFS,HIVE,HBASE)向非大数据集群(RDBMS关系型数据库)中传输数据,叫做:导出,即使用export关键字。

1). HDFS|hive -> RDBMS

① 准备数据,上传hdfs的sqoop目录下

vi a.txt 
# 在文件中添加如下内容
1 zhangsan true 20 2020-01-11
2 lisi false 25 2020-01-10
3 wangwu true 36 2020-01-17
4 zhaoliu false 50 1990-02-08
5 win7 true 20 1991-02-08


#在hdfs上创建sqoop目录(目录名称随意,不过需要和后边对应),将文件上传到sqoop目录下
hdfs dfs -mkdir /sqoop
hdfs dfs -put a.txt /sqoop

② 在mysql中创建表

注意:导出并不会自动创建对应的表,需要提前自己创建
create table t_user2(
        id int primary key auto_increment,
        name VARCHAR(32),
        sex boolean,
        age int,
        birthDay date
) CHARACTER SET=utf8;

 ③ 将hdfs上的数据导入mysql表中

sqoop export \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--export-dir /sqoop \
--input-fields-terminated-by ' ' \
--columns "id,name,sex,age,birthDay" \
--table t_user2 \
--update-key id \
--update-mode allowinsert

--export-dir   指定导出数据的目录
--table        mysql中的表名
--columns      字段名
--update-mode  如果是allowinsert,则允许不但能够导入新数据的时候,还可以更新之前的数据
               如果是updateonly,则只会更新以前的数据,不添加新数据
--update-key   如果指定列的值已经存在,则会触发修改操作,否则添加,一般指定主键列

查看mysql:

 五、sqoop应用问题汇总

1.sqoop在导入或者导出的时候,空值问题处理。

注意:不用直接通过工具界面修改表中的数据,制造空数据,需要重新添加一条
Hive 中的 Null 在底层是以“\N”来存储,而 MySQL 中的 Null 在底层就是 Null,为了保证数据两端的一致性。

导入数据时采用--null-string 和--null-non-string。
导出数据时采用--input-null-string 和--input-null-non-string 两个参数。

--null-string含义是 string类型的字段,当Value是NULL,替换成指定的字符
--null-string  '\\N'  替换为  \N

导入(mysql-->hive):

sqoop import \
--driver com.mysql.cj.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_user \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "," \
--hive-overwrite \
--hive-database test_hive \
--hive-table hive_user    \
--null-non-string   '\\N' \
--null-string  '\\N'

mysql表中有空数据: 

 查看hive表:

 

 

 导出(hive-->mysql):

sqoop export \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--export-dir /user/hive/warehouse/test_hive.db/dept \
--input-fields-terminated-by '\t' \
--columns "deptno,dname,loc" \
--table dept \
--update-key deptno \
--update-mode allowinsert \
--input-null-non-string   '\\N' \
--input-null-string   '\\N'

在hive表中插入空值数据:

 在mysql查看表:

2.将mysql数据导入到hive分区表中

sqoop import \
--driver com.mysql.cj.jdbc.Driver \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--table t_person2 \
--num-mappers 1 \
--hive-import \
--fields-terminated-by "," \
--hive-overwrite \
--hive-database test_hive \
--hive-table t_person2    \
--null-non-string   '\\N' \
--null-string  '\\N' \
--hive-partition-key dt \
--hive-partition-value 20231220

 查看mysql表:

查看hive表:

 3.将hive分区表导出到mysql

在mysql建表:

 

sqoop export \
--connect jdbc:mysql://hadoop10:3306/test1?characterEncoding=UTF-8 \
--username root \
--password 123456 \
--export-dir /user/hive/warehouse/test_hive.db/t_person2/dt=20231220 \
--input-fields-terminated-by ',' \
--table t_person2 \
--update-key dt \
--update-mode allowinsert \
--input-null-non-string   '\\N' \
--input-null-string   '\\N'

查看表:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706803.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

160. 相交链表 (Swift版本)

题目描述 最简单直接的解法 遍历 headA 的所有节点, 看 headB 中是否有相交的节点 /*** Definition for singly-linked list.* public class ListNode {* public var val: Int* public var next: ListNode?* public init(_ val: Int) {* self.val val*…

vs2019 c++20规范 STL 库中头文件 <atomic> 源码注释及探讨几个知识点

(1 探讨一) 模板类 atomic 的继承关系与数据结构如下: (2 探讨二 ) 可见 atomic 的 fetch_xx 函数,返回的都是 atomic 中存储的旧值。测试如下: 谢谢

MySQL千万级数据从190秒优化到1秒全过程

文章目录 一、性能问题的分析1. 问题背景2. 查询分析二、优化思路1. 添加索引2. 分区表3. 优化查询4. 查询缓存三、具体优化步骤1. 添加复合索引2. 对表进行分区3. 启用查询缓存4. 优化查询四、总结🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)…

2024年【北京市安全员-B证】模拟考试题及北京市安全员-B证操作证考试

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-B证模拟考试题考前必练!安全生产模拟考试一点通每个月更新北京市安全员-B证操作证考试题目及答案!多做几遍,其实通过北京市安全员-B证在线考试很简单。 1、【多选题】…

文案提取小帮手轻松将视频为转文字!而且不限时长

作为一个自媒体的资深用户总在一个一个的敲字真的太慢了,而且很多创作者都知道追热点是和时间赛跑。如果你嫌弃自己手抄效率太低,看视频又嫌时间太长。 今天叫教你一个可以将视频转文字的工具, 这个工具就叫文案提取小帮手,而且…

Golang的channel

目录 基本使用 channel 数据结构 阻塞的协程队列 协程节点 构建 channel 写流程 读流程 非阻塞与阻塞 closechan(关闭) 基本使用 创建无缓存 channel c : make(chan int) //创建无缓冲的通道 cc : make(chan int,0) //创建无缓冲的通道 c 创建有缓存 channel c : m…

2024年大数据、区块链与物联网国际会议(ICBDBLT 2024)

2024 International Conference on Big Data, Blockchain, and Internet of Things 【1】大会信息 会议简称:ICBDBLT 2024 大会地点:中国青岛 审稿通知:投稿后2-3日内通知 会议官网:www.icbdblt.com 【2】会议简介 即将召开的…

定档6.20,创邻科技图数据库先锋版发布会来了!

6月20日 14:00 ,创邻科技将重磅召开 2024 Galaxybase银河图数据库先锋版发布会,戳此预约! 书于竹帛,镂于金石,琢于盘盂。历史长河中,数据通过不同形态承载着人类文明,人们在数千年中始终保持着…

智能制造前沿:ARMxy工控机在机器人控制中

机器人控制系统正逐步成为现代制造业的核心引擎。在这个过程中,ARMxy工业计算机以其独特的优势,成为了驱动这一变革的关键力量。本文将以自动化装配线机器人为例,探讨ARMxy如何通过其低功耗、高性能特性,以及高度灵活性的设计&…

clodop去除水印

clodop 免费版本支持所有功能,但是打印出来的带有水印。 有偿提供注册服务,永久有效。

Sa-Token鉴权与网关服务实现

纠错: 在上一部分里我完成了微服务框架的初步实现,但是先说一下之前有一个错误,就是依赖部分 上次的学习中我在总的父模块下引入了spring-boot-dependencies(版本控制)我以为在子模块下就不需要再引用了,…

全新取图系统搭建,广泛应用,轻松解决找图难问题!

前言 在数字化高速发展的时代,图片已成为人们日常交流不可或缺的一部分。每个社交平台我们都需要头像、背景等去打造属于我们自己的一张名片。为了满足大众日益增长的需求,并创造更多的收益机会,搭建一款先进的取图系统真的很必要。 一、这款…

SQL Server 安装后,服务器再改名,造成名称不一致,查询并修改数据库服务器真实名称

SELECT SERVERNAME -- 1.查询旧服务器名称 SELECT serverproperty(servername) AS new --2.查询新服务器名称 -- 3.更新服务器名称 IF SERVERPROPERTY(servername) <> 新服务器名称替换 BEGIN DECLARE server_name NVARCHAR(128) SET server_name 新服务器…

警惕!这本SCIE正在被​“On Hold”!

【欧亚科睿学术】 近期&#xff0c;经小编查询&#xff0c;一本近乎百分百录用率、且生信友好的“毕业神刊”——JOURNAL OF BIOLOGICAL REGULATORS AND HOMEOSTATIC AGENTS被科睿唯安打上了“On Hold”标识。 图片来源&#xff1a;科睿唯安&#xff08;2024年6月13日查&#…

D 25章 进程的终止

D 25章 进程的终止 440 25.1 进程的终止&#xff1a;_exit()和exit() 440 1. _exit(int status)&#xff0c; status 定义了终止状态&#xff0c;父进程可调用 wait 获取。仅低8位可用&#xff0c; 调用 _exit() 总是成功的。 2.程序一般不会调用 _exit()&#xff0c; 而是…

做了2年前端,盘点前端技术栈!大佬轻喷~

前言 自己写了快两年前端&#xff0c;但是大致总结一下哈哈哈哈我觉得这个话题蛮有意思的&#xff0c;可以看看大家的技术广度&#xff0c;可以进行分享和学习以及讨论所以这里说一下我对我的前端技术&#xff0c;做一下盘点和总结因为我的开发年限有限&#xff0c;所以我觉得…

C++面试准备

变量作用&#xff1a;给一段指定的内存空间起名&#xff0c;方便操作这段内存。 常量&#xff1a;用于记录程序中不可更改的数据。 #include <iostream> using namespace std;#define DAY 7 int main() {cout << "一周有" << DAY << "…

设置systemctl start kibana启动kibana

1、编辑kibana.service vi /etc/systemd/system/kibana.service [Unit] DescriptionKibana Server Manager [Service] Typesimple Useres ExecStart/home/es/kibana-7.10.2-linux-x86_64/bin/kibana PrivateTmptrue [Install] WantedBymulti-user.target 2、启动kibana # 刷…

Vue 简单自定义标签

Vue 简单自定义标签 思路&#xff1a; 1、计算每个项离父级左侧宽 left 2、计算当前滑块的宽&#xff0c;绝对定位 3、下一个项的宽/2-滑块的宽/2下一项离父级左侧的宽 left 4、使用定位left&#xff08;性能较差一点&#xff09; 或 translate 移动距离 <template><…

实用软件下载:硕思LOGO设计师最新安装包及详细安装教程

​硕思Logo设计师是一款操作灵活简单&#xff0c;且功能强大的logo制作软件&#xff0c;它可以通过简单的点击就可以为网站、博客、论坛和邮件创建专业的logo、条幅、按钮、标题、图标和签名等。 该软件提供了很多精心设计的模板和丰富的资源&#xff0c;为更好的创建logo艺术…