SQOOP详细讲解

news2024/11/16 19:58:07

SQOOP安装及使用

SQOOP安装及使用SQOOP安装1、上传并解压2、修改文件夹名字3、修改配置文件4、修改环境变量5、添加MySQL连接驱动6、测试准备MySQL数据登录MySQL数据库创建student数据库切换数据库并导入数据另外一种导入数据的方式使用Navicat运行SQL文件导出MySQL数据库importMySQLToHDFS编写脚本,保存为MySQLToHDFS.conf执行脚本注意事项:MySQLToHive编写脚本,并保存为MySQLToHive.conf文件执行脚本--direct--e参数的使用MySQLToHBase编写脚本,并保存为MySQLToHBase.conf在HBase中创建student表执行脚本exportHDFSToMySQL编写脚本,并保存为HDFSToMySQL.conf先清空MySQL student表中的数据,不然会造成主键冲突执行脚本查看sqoop helpSqoop 在从HDFS中导出到关系型数据库时的一些问题问题一:问题二:问题三:**增量同步数据总结

SQOOP安装

1、上传并解压
tar -zxvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz -C /usr/local/soft/
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
# 复制配置文件并重命名
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.6/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.6/lib/
6、测试
# 打印sqoop版本
sqoop version

image.png

# 测试MySQL连通性
sqoop list-databases -connect jdbc:mysql://master:3306/ -username root -password 123456

image-20220617214338432

准备MySQL数据

登录MySQL数据库
mysql -u root -p123456;
创建student数据库
create database studentdb;
切换数据库并导入数据
# mysql shell中执行
use studentdb;
source /usr/local/soft/bigdata29/student.sql;
source /usr/local/soft/bigdata29/score.sql;
另外一种导入数据的方式
# linux shell中执行
mysql -uroot -p123456  studentdb < /usr/local/soft/shujia/student.sql
mysql -uroot -p123456  studentdb < /usr/local/soft/shujia/score.sql
使用Navicat运行SQL文件

也可以通过Navicat导入

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

import

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

MySQLToHDFS
编写脚本,保存为MySQLToHDFS.conf
sqoop执行脚本有两种方式:第一种方式:直接在命令行窗口中直接输入脚本;第二种方式是将命令封装成一个脚本文件,然后使用另一个命令执行
第一种方式:
sqoop import \
--append \
--connect jdbc:mysql://master:3306/studentdb \
--username root \
--password 123456 \
--table student \
--m 1 \
--split-by id \
--target-dir /bigdata29/sqoopdata/student1/ \
--fields-terminated-by '\t'
​
第二种方式:使用脚本文件的形式  mysql2hdfs.conf
import
--append
--connect
jdbc:mysql://master:3306/studentdb
--username
root
--password
123456
--table
student
--m
1
--split-by
id
--target-dir
/bigdata29/sqoopdata/student2/
--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任务 part-m-00000

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

MySQLToHive

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

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

编写脚本,并保存为MySQLToHive.conf文件
import
--connect
jdbc:mysql://master:3306/studentdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
123456
--table
student
--m
1
--hive-import
--hive-overwrite
--hive-database
bigdata29
--create-hive-table
--hive-table
sqoop_students1
--fields-terminated-by
','
执行脚本
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参数的使用

sqoop在导入数据时,可以使用--e搭配sql来指定查询条件,并且还需在sql中添加$CONDITIONS,来实现并行运行mr的功能。

只要有--e+sql,就需要加$CONDITIONS,哪怕只有一个maptask。

sqoop通过继承hadoop的并行性来执行高效的数据传输。 为了帮助sqoop将查询拆分为多个可以并行传输的块,需要在查询的where子句中包含$conditions占位符。 sqoop将自动用生成的条件替换这个占位符,这些条件指定每个任务应该传输哪个数据片。

# 需求:将学号1500100007学生从mysql查出来导入到hive中
select * from student where id=1500100007
​
​
​
import
--connect
jdbc:mysql://master:3306/studentdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
123456
--query
"select * from score where id=1500100007 and $CONDITIONS"
--target-dir
/shujia/history/score1
--m
1
--hive-import
--hive-overwrite
--hive-database
bigdata29
--create-hive-table
--hive-table
sqoop_score1
--fields-terminated-by
','
--direct
MySQLToHBase
编写脚本,并保存为MySQLToHBase.conf

sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自动创建 HBase 表的功能

import
--connect
jdbc:mysql://master:3306/studentdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
123456
--query
"select * from student where id<1500100003 and $CONDITIONS"
--target-dir
/shujia/history/hbase_student
--m
1
--hbase-create-table
--hbase-table
mysql2hbase1
--column-family
info
--hbase-row-key
id
--direct
在HBase中创建student表
create 'studentsq','cf1'
执行脚本
sqoop --options-file MySQLToHBase.conf
export
HDFSToMySQL
编写脚本,并保存为HDFSToMySQL.conf

在往关系型数据库中导出的时候我们要先在关系型数据库中创建好库以及表,这些sqoop不会帮我们完成。

export
--export-dir
/bigdata29/teachers/
--columns
id,name,grade,clazz
--fields-terminated-by
','
--connect
jdbc:mysql://master:3306/studentdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
123456
--table
sqoop_teacher
--num-mappers
1
先清空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
1、并行度不能太高,就是 -m
2、如果没有主键的时候,-m 不是1的时候就要指定分割字段,不然会报错,如果有主键的时候,-m 不是1 可以不去指定分割字段,默认是主键,不指定 -m 的时候,Sqoop会默认是分4个map任务。
export
--export-dir
/user/hive/warehouse/bigdata29.db/t_movie1/
--columns
id,name,types
--fields-terminated-by
','
--connect
jdbc:mysql://master:3306/bigdata29?useUnicode=true&characterEncoding=UTF-8&useSSL=false
--username
root
--password
123456
--table
sqoop_movie
--num-mappers
1
--direct

Sqoop 在从HDFS中导出到关系型数据库时的一些问题
问题一:

在上传过程中遇到这种问题:

ERROR tool.ExportTool: Encountered IOException running export job: java.io.IOException: No columns to generate for ClassWriter

image-20220617224448899

驱动版本的过低导致的,其实在尝试这个方法的时候我们可以先进行这样:加一行命令,--driver com.mysql.jdbc.Driver \  然后问题解决!!!
​
如果添加命令之后还没有解决就把jar包换成高点版本的。
问题二:

依旧是导出的时候,会报错,但是我们很神奇的发现,也有部分数据导入了。这也就是下一个问题。

Caused by: java.lang.NumberFormatException: For input string: "null"

image-20220617224545528

解决方式:因为数据有存在null值得导致的
​
在命令中加入一行(方式一中的修改方式,方式二也就是转换一下格式):--input-null-string '\\N' \  
​
--input-null-string 
'\\N'
问题三:**

java.lang.RuntimeException: Can't parse input data: '1998/5/11'

image-20220617224626703

出现像这样的问题,大多是因为HDFS上的数据与关系型数据库创建表的字段类型不匹配导致的。仔细对比修改后,就不会有这个报错啦!!

增量同步数据

我们之前导入的都是全量导入,一次性全部导入,但是实际开发并不是这样,例如web端进行用户注册,mysql就增加了一条数据,但是HDFS中的数据并没有进行更新,但是又再全部导入一次又完全没有必要。

所以,sqoop提供了增量导入的方法。

1、数据准备:

image-20220618155134464

CREATE TABLE sqoop_stu2(
id int,
name STRING,
age int,
gender STRING,
clazz STRING,
last_mod TIMESTAMP
)row format delimited fields terminated by ','

2、将其先用全量导入到HDFS(hive)中去

3、先在mysql中添加一条数据,在使用命令进行追加

4、根据时间进行大量追加(不去重)

#前面的案例中,hive本身的数据也是存储在HDFS上的,所以我今后要做增量操作的时候,需要指定HDFS上的路径
import
--connect
jdbc:mysql://master:3306/student
--username
root
--password
123456
--table
student
--target-dir
/user/hive/warehouse/testsqoop.db/from_mysql_student
--fields-terminated-by
'\t'
--incremental 
append
--check-column
id
--last-value
3
​

结果:但是我们发现有两个重复的字段

img

5、往往开发中需要进行去重操作:sqoop提供了一个方法进行去重,内部是先开一个map任务将数据导入进来,然后再开一个map任务根据指定的字段进行合并去重

结果:

img

之前有重复的也进行合并去重操作,最后生成一个结果。

总结:

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

总结

RDBMS-->HDFS     import
HDFS--->RDBMS    export
​
Mysql--->HDFS(hive)
要知道你要数据的来源和数据的目的地
mysql:
--connect
jdbc:mysql://master:3306/student
--username
root
--password
123456
--table
student
​
hdfs:
--target-dir
/user/hive/warehouse/sqooptest.db/from_mysql_student
--fields-terminated-by
'\t'
​
hive:
1)
--hive-import
--hive-overwrite
--create-hive-table  (如果表不存在,自动创建,如果存在,报错,就不需要这个参数)
--hive-database
testsqoop
--hive-table
from_mysql_student
--fields-terminated-by
'\t'
2)
--target-dir
/user/hive/warehouse/bigdata29.db/sqoop_stu2
--fields-terminated-by
','
# 增量需要添加的参数=================================================
--incremental 
append 
--check-column
id
--last-value
3
(或者是)------------------------------------------------------------
--fields-terminated-by
'\t'
--check-column (hive的列名)
last_mod
--incremental
lastmodified
--last-value
"2022-06-18 16:40:09"
--m
1
========================================================================
# 如果需要去重,请先搞清楚根据什么去重,否则结果可能不是你想要的
--merge-key
name   (这里是根据姓名去重,你可以改成自己的去重列名)
# 经过实践得出,如果要追加导入到hive中并且要进行去重的话,建议最好使用lastmodified以时间戳的方式追加,以写入hdfs的路径方式追加,这样可以实现追加的同时并且去重。
​
​
hbase:(如果hbase导入要创建表的话,需要将--hbase-create-table参数放到hbase参数的第一个才会生效)
--hbase-create-table
--hbase-table
studentsq
--column-family
cf1
--hbase-row-key
id  (mysql中的列名)
--m
1
​
​
​
HDFS--->mysql
​
hdfs:
--columns
id,name,age,gender,clazz
--export-dir
/shujia/bigdata17/sqoopinput/
--fields-terminated-by
','
# 如果数据分割出来的字段值有空值,需要添加以下参数(面试可能会面到)
--null-string 
'\\N' 
--null-non-string 
'\\N'

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业必看:镭速教你如何测试内网文件传输效率和稳定问题

在现代商业运作中&#xff0c;企业内部文件传输的效率和稳定性对于数据管理和业务流程极为重要。无论是远程工作还是团队协作&#xff0c;高效的文件传输都能显著提升工作效率。今天镭速小编就教你如何测试内网文件传输效率和稳定问题。 1、磁盘性能&#xff0c;即硬盘的读取和…

JVM从1%到99%【精选】-运行时数据区

目录 1.总览运行时数据区 2.内存溢出 3. 程序计数器 4.虚拟机栈 5.本地方法栈 6.堆 7.方法区 8.直接内存 1.总览运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。运行时数据区可以分为方法区、堆、虚拟机栈、本地方法栈、程序计数器…

分享一些关于软件测试的面试问题

由于最近在面试软件测试工程师的岗位&#xff0c;遇到了一些面试的问题以及我的答案&#xff0c;希望对正在找工作的同行有些帮助&#xff0c;仅仅作为软件测试行业&#xff0c;求职者看问题就行&#xff0c;大佬可以探讨一下答案。 1.提交了bug&#xff0c;开发不认为是bug怎么…

JavaScript的综合案例

案例要求&#xff1a; 实现一个表单验证 1.当输入框失去焦点时&#xff0c;验证输入的内容是否符合要求 2.当点击注册按钮时&#xff0c;判断所有输入框的内容是否都符合要求&#xff0c;如果不符合要求阻止表单提交 简单的页面实现 <!DOCTYPE html> <html lang&…

凸优化理论学习三|凸优化问题(一)

系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题&#xff08;一&#xff09;标准形式的优化问题&#xff08;二&#xff09;可行点和最优点&#xff08;三&#xff09;局部最优点&#xff08;四…

【万字面试题】Redis

文章目录 常见面试题布隆过滤器原理和数据结构&#xff1a;特点和应用场景&#xff1a;缺点和注意事项&#xff1a;在python中使用布隆过滤器 三种数据删除策略LRU (Least Recently Used)工作原理&#xff1a;应用场景&#xff1a; LFU (Least Frequently Used)工作原理&#x…

振弦式应变计的灵敏系数k范围探讨

振弦式应变计是一种广泛应用于工程结构健康监测的重要设备&#xff0c;其灵敏系数k是衡量其性能的关键指标。本文将探讨振弦式应变计的灵敏系数k的一般范围&#xff0c;并分析影响灵敏系数的因素。 一、振弦式应变计的工作原理 振弦式应变计通过测量振弦在受力作用下的振动频率…

屡被约谈的货拉拉三闯IPO,CEO周胜馥IPO前套现11亿

近日&#xff0c;货运巨头货拉拉第三次闯关IPO。虽然其实现首次年度盈利&#xff0c;但光鲜数据背后的盈利模式却频遭诟病。 货拉拉的创始人周胜馥从美国高校毕业后&#xff0c;曾供职于贝恩咨询公司&#xff0c;并在期间对创业产生了浓厚兴趣。抛开履历中的高学历好工作的部分…

Amesim基础篇-表格类型设置与读取

前言 在Amesim仿真中,不可避免需要应用到表格。如新能源动力电池中内阻、充电倍率的调取,压缩机的机械效率、容积效率等,水泵的效率,管路的压降等等。本文将介绍如何对表格类型的选择与参数输入。 1 进入表格设置界面 如下图所示,在Amesim界面的右上角Table Editor进入…

EEL中 python端的函数名是如何传递给js端的

python端的函数名是如何传递给js端的 核心步骤&#xff1a;将函数名列表注入到动态生成的 eel.js 中&#xff0c;这样前端一开始引用的eel.js本身已经包含有py_function的函数名列表了。你打开开发者工具看看浏览器中的 eel.js文件源代码就知道了。 具体实现&#xff1a; # 读…

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint&#xff1f;2. 为什么要使用 Flask Blueprint&#xff1f;3. 如何使用 Flask Blueprint&#xff1f;4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时&#xff0c;保持代码的组织结构清晰…

etcd单机部署和集群部署

1、etcd单实例部署 对于平常的学习&#xff0c;其实搭建一个单机节点是够了的。接下来就讲讲怎么搭建单机节点。 本次部署是在 centos7 系统&#xff0c;cpu 为amd64 上面进行的。 部署是直接使用官方编译好的二进制文件&#xff0c;大家也可以直接看 ectd-releases 界面选择…

linux 环境下 分布式文件搭建fastDFS

1.软件信息 地址&#xff1a;happyfish100 (YuQing) GitHub 1.fastdfs-master.zip 2.fastdfs-nginx-module-master.zip 3.libfastcommon-master.zip 4.libserverframe-master.zip yum install make cmake gcc gcc-c perl 2.安装libfastcommon unzip libfastcommon-mast…

CPU利用率使用教程

本文主要参考&#xff1a; 一文让你学到 nmon最详尽的用法 Linux性能监控命令_nmon 安装与使用 如果你是在Ubuntu上安装nmon&#xff0c;使用&#xff1a; apt install nmon安装好后&#xff0c;直接运行 $:nmon #运行如果是后台抓数据&#xff1a; -f 参数: 生成文件,文件…

北京玻色量子携手赛氪网举办长三角高校数学建模竞赛巡回讲座

2024年5月13日下午&#xff0c;一场聚焦数学建模与量子计算前沿的讲座在中国计量大学隆重举行。此次讲座作为第四届长三角高校数学建模竞赛的巡回宣讲活动之一&#xff0c;由北京玻色量子科技有限公司与竞赛组委会成员赛氪网共同举办&#xff0c;旨在向广大师生介绍量子计算的应…

企业如何利用美国多IP服务器来提升网站的安全性?

企业如何利用美国多IP服务器来提升网站的安全性? 在当前网络环境下&#xff0c;网站安全性日益成为企业面临的重要挑战。为了有效应对各种潜在威胁&#xff0c;越来越多的企业选择利用美国多IP服务器来提升其网站的安全性。这种服务器配置能够通过一系列策略来增加网站的安全…

滚珠螺杆在精密机械设备中如何维持精度要求?

滚珠螺杆在精密设备领域中的运用非常之广泛&#xff0c;具有精度高、效率高的特点。为了确保滚珠螺杆在生产设备中能够发挥最佳性能&#xff0c;我们必须从多个维度进行深入考量&#xff0c;并采取针对性的措施&#xff0c;以确保其稳定、精准地服务于现代化生产的每一个环节。…

基于springboot的医护人员排班系统

springboot002基于springboot的医护人员排班系统 亲测完美运行带论文&#xff1a;获取源码&#xff0c;私信评论或者v:niliuapp 运行视频 包含的文件列表&#xff08;含论文&#xff09; 数据库脚本&#xff1a;db.sql论文&#xff1a;开题报告springboot002基于springboot…

nginx 发布静态资源

一. nginx 发布静态资源 在nginx中nginx.conf配置文件中添加内容如下&#xff1a; server {listen 90;server_name localhost;# 配置静态资源文件&#xff0c;就可以访问了location / {root /home/fooie-shop;index index.html;}# 配置音频和图片资源location /imoo…

Compose容器编排示例

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录如下&#xff1a; 一、从源代码开始构建、部署和管理应用程序 1.1、创建项目目录并准备应用程序的代码及其依赖 1.2、创建Dockerfile 1.3、在…