大数据从0到1的完美落地之sqoop命令执行

news2025/1/6 18:41:07

Sqoop命令执行

常见命令执行参数

通过Sqoop加不同参数可以执行导入导出,通过sqoop help 可以查看常见的命令行

#常见Sqoop参数
[root@qianfeng01 sqoop-1.4.7] sqoop help
  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 mainframe datasets to HDFS
  list-databases     List available databases on a server
  list-tables        List available tables in a database
  version            Display version information
复制代码

直接执行命令

Sqoop运行的时候不需要启动后台进程,直接执行sqoop命令加参数即可.简单举例如下:

# #通过参数用下面查看数据库
[root@qianfeng01 sqoop-1.4.7] sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456;
复制代码

注意:可能会出现如下错误

image-20220412174503110

导入==commons-lang-2.6.jar==到lib下即可解决

通过文件传递参数(脚本)

在执行Sqoop命令时,如果每次执行的命令都相似,那么把相同的参数可以抽取出来,放在一个文本文件中,把执行时的参数加入到这个文本文件为参数即可. 这个文本文件可以用--options-file来指定,平时可以用定时任务来执行这个脚本,避免每次手工操作.

3.2章节中命令中的JDBC连接的参数一般是不变的,可以把它抽取出来放在一个文件中/.../sqoop-1.4.7/config.conf,如下:

list-databases
--connect
jdbc:mysql://localhost:3306
--username
root
--password
123456
复制代码

那么上面的执行的命令就可以变为:

[root@qianfeng01 sqoop-1.4.7] bin/sqoop --options-file config.conf
复制代码

为了让配置文件config.conf的可读性更强,可以加入空行和注释,不会影响文件内容的读取,如下:

# 指令: 列出mysql中的所有数据库
list-databases

# 指定连接字符串
--connect
jdbc:mysql://localhost:3306

--username
root

--password
123456

复制代码

Import 详解

import是从关系数据库导入到Hadoop,下面是一些通用参数介绍:

通用参数

如下:

ArgumentDescription
==--connect==指定JDBC连接字符串
--connection-manager 指定连接管理类
--driver 指定连接的驱动程序
-P从控制台读入密码(可以防止密码显示中控制台)
==--password==指定访问数据库的密码
==--username==指定访问数据库的用户名
连接数据库

Sqoop的设计就是把数据库数据导入HDFS,所以必须指定连接字符串才能访问数据库,这个连接字符串类似于URL,这个连接字符串通过--connect参数指定,它描述了连接的数据库地址和具体的连接数据库,譬如:

[root@qianfeng01 sqoop-1.4.7] sqoop import --connect jdbc:mysql://database.example.com/employees
#指定连接的服务器地址是database.example.com ,要连接的数据库是employees
复制代码

上面连接命令只是指定数据库,默认情况下数据库都是需要用户名和参数的,在这里可以用--username--password来指定,譬如:

#指定用户名和密码来连接数据库
[root@qianfeng01 sqoop-1.4.7] sqoop import --connect jdbc:mysql://localhost:3306/mysql --username root --password 123456;
复制代码
查看数据库

在Sqoop中,可以通过list-databases参数来查看MySql的数据库,这样在导入之前可以得到所有的数据库的名字,具体案例如下:

# 列出所有数据库
[root@qianfeng01 sqoop-1.4.7] sqoop list-databases --connect jdbc:mysql://localhost:3306 --username root --password 123456;
复制代码
查看所有表

在得到所有数据库的名字后,也可以查看当前数据库中的所有表,可以使用 list-tables参数来进行查看,查看的时候在url连接中一定要指定数据库的名字.

# 列出数据库中所有表
[root@qianfeng01 sqoop-1.4.7] sqoop list-tables --connect jdbc:mysql://localhost:3306/qfdb --username root --password 123456;
复制代码
Import的控制参数

常见import的控制参数有如下几个:

ArgumentDescription
--append通过追加的方式导入到HDFS
--as-avrodatafile导入为 Avro Data 文件格式
--as-sequencefile导入为 SequenceFiles文件格式
--as-textfile导入为文本格式 (默认值)
--as-parquetfile导入为 Parquet 文件格式
--columns 指定要导入的列
--delete-target-dir如果目标文件夹存在,则删除
--fetch-size 一次从数据库读取的数量大小
-m,--num-mappers m 用来指定map tasks的数量,用来做并行导入
-e,--query 指定要查询的SQL语句
--split-by 用来指定分片的列
--table 需要导入的表名
--target-dir HDFS 的目标文件夹
--where 用来指定导入数据的where条件
-z,--compress是否要压缩
--compression-codec 使用Hadoop压缩 (默认是 gzip)
指定表导入

数据准备

在本地MySql数据库中新建一个qfdb数据库,sql代码在data/qfdb.sql中,如下:

CREATE TABLE emp(
    empno        INT primary key,
    ename        VARCHAR(50),
    job        VARCHAR(50),
    mgr        INT,
    hiredate    DATE,
    sal        DECIMAL(7,2),
    comm        decimal(7,2),
    deptno        INT
) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
复制代码

文末扫码有惊喜

Sqoop的典型导入都是把关系数据库中的表导入到HDFS中,使用--table参数可以指定具体的表导入到HDFS,譬如用 --table emp,默认情况下是全部字段导入.如下:

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--table emp \
--target-dir hdfs://qianfeng01:8020/sqoopdata/emp \
--delete-target-dir
复制代码

注意:如果使用MySQL8.X版本可能会与到的问题

Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

---------------------------------------------------------------------------
解决:将mysql回收空闲连接的时间变长,mysql默认回收时间是8小时,可以在mysql目录下的/etc/my.cnf中增加下面配置,将时间改为1天。
打开 
[root@qianfeng01 sqoop-1.4.7]# vim /etc/my.cnf
# 添加如下两个参数
wait_timeout=31536000
interactive_timeout=31536000

重启服务,即可解决问题
[root@qianfeng01 sqoop-1.4.7]# service mysqld restart
复制代码

可以快速使用hdfs的命令查询结果

[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -cat /sqoopdata/emp/par*
复制代码
指定列导入

如果想导入某几列,可以使用 --columns,如下:

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--table emp \
--columns 'empno,mgr' \
--target-dir hdfs://qianfeng01:8020/sqoopdata/emp \
--delete-target-dir
复制代码

可以使用下面hdfs命令快速查看结果

[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -cat /sqoopdata/emp/par*
复制代码
指定条件导入

在导入表的时候,也可以通过指定where条件来导入,具体参数使用 --where,譬如要导入员工号大于7800的记录,可以用下面参数:

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--table emp \
--columns 'empno,mgr' \
--where 'empno>7800' \
--target-dir hdfs://qianfeng01:8020/sqoopdata/5 \
--delete-target-dir
复制代码

用命令查询结果:

[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -cat /sqoopdata/emp/par*
复制代码

结果如下:

7839,null
7844,7698
7876,7788
7900,7698
7902,7566
7934,7782
复制代码
指定Sql导入

上面的可以通过表,字段,条件进行导入,但是还不够灵活,其实Sqoop还可以通过自定义的sql来进行导入,可以通过--query 参数来进行导入,这样就最大化的用到了Sql的灵活性.如下:

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--query 'select empno,mgr,job from emp WHERE empno>7800 and $CONDITIONS' \
--target-dir hdfs://qianfeng01:8020/sqoopdata/emp \
--delete-target-dir \
--split-by empno \
-m 1
复制代码

注意:在通过--query来导入数据时,必须要指定--target-dir

如果你想通过并行的方式导入结果,每个map task需要执行sql查询语句的副本,结果会根据Sqoop推测的边界条件分区。query必须包含$CONDITIONS。这样每个Sqoop程序都会被替换为一个独立的条件。同时你必须指定--split-by.分区

-m 1 是指定通过一个Mapper来执行流程

查询执行结果

[root@qianfeng01 sqoop-1.4.7]# hdfs dfs -cat /sqoopdata/emp/par*
复制代码

结果如下:

7839,null,PRESIDENT
7844,7698,SALESMAN
7876,7788,CLERK
7900,7698,CLERK
7902,7566,ANALYST
7934,7782,CLERK
复制代码
单双引号区别

在导入数据时,默认的字符引号是单引号,这样Sqoop在解析的时候就安装字面量来解析,不会做转移:例如:

--query 'select empno,mgr,job from emp WHERE empno>7800 and $CONDITIONS'
复制代码

如果使用了双引号,那么Sqoop在解析的时候会做转义的解析,这时候就必须要加转义字符: 如下:

--query "select empno,mgr,job from emp WHERE empno>7800 and \$CONDITIONS"
复制代码
MySql缺主键问题

1如果MySql的表没有主键,将会报错:

19/12/02 10:39:50 ERROR tool.ImportTool: Import 
failed: No primary key could be found for table u1. Please specify one with 
-- split-  by or perform a sequential import with '-m 1
复制代码

解决方案:

通过 --split-by 来指定要分片的列
复制代码

代码如下:

[root@qianfeng01 sqoop-1.4.7]# bin/sqoop import --connect jdbc:mysql://localhost:3306/qfdb \
--username root --password 123456 \
--query 'select empno,mgr,job from emp WHERE empno>7800 and $CONDITIONS' \
--target-dir hdfs://qianfeng01:8020/sqoopdata/emp \
--delete-target-dir \
--split-by empno \
-m 1
复制代码
导入到Hive中
说明

​ Sqoop的导入工具的主要功能是将数据上传到HDFS中的文件中。如果您有一个与HDFS集群相关联的Hive,Sqoop还可以通过生成和执行CREATETABLE语句来定义Hive中的数据,从而将数据导入到Hive中。将数据导入到Hive中就像在Sqoop命令行中添加--hive-import选项。

​ 如果Hive表已经存在,则可以指定--hive-overwrite选项,以指示必须替换单元中的现有表。在将数据导入HDFS或省略此步骤之后,Sqoop将生成一个Hive脚本,其中包含使用Hive的类型定义列的CREATE表操作,并生成LOAD Data INPATH语句将数据文件移动到Hive的仓库目录中。

在导入Hive之前先要配置Hadoop的Classpath才可以,否则会报类找不到错误,在/etc/profile末尾添加如下配置:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*

#刷新配置
source /etc/profile
复制代码
参数说明

具体的参数如下:

ArgumentDescription
--hive-home 覆盖环境配置中的$HIVE_HOME,默认可以不配置
--hive-import指定导入数据到Hive中
--hive-overwrite覆盖当前已有的数据
--create-hive-table是否创建hive表,如果已经存在,则会失败
--hive-table 设置要导入的Hive中的表名
实际导入案例

具体导入演示代码如下:

提示: 为了看到演示效果,可以先在Hive删除emp表

[root@qianfeng01 sqoop-1.4.7] bin/sqoop import --connect jdbc:mysql://qianfeng01:3306/qfdb \
--username root \
--password 123456 \
--table emp \
--hive-import \
--hive-overwrite \
--hive-table "emp3" \
--hive-database db2 \
-m 1
复制代码

在Hive中查看表:

hive> show tables;
#结果如下:
OK
emp
复制代码

可以在Hive中查看数据是否导入:

select * from emp;
#结果如下:
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7499    ALLEN   SALESMAN        7698    1981-02-20      1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-02-22      1250.0  500.0   30
7566    JONES   MANAGER 7839    1981-04-02      2975.0  NULL    20
7654    MARTIN  SALESMAN        7698    1981-09-28      1250.0  1400.0  30
7698    BLAKE   MANAGER 7839    1981-05-01      2850.0  NULL    30
7782    CLARK   MANAGER 7839    1981-06-09      2450.0  NULL    10
7788    SCOTT   ANALYST 7566    1987-04-19      3000.0  NULL    20
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7844    TURNER  SALESMAN        7698    1981-09-08      1500.0  0.0     30
7876    ADAMS   CLERK   7788    1987-05-23      1100.0  NULL    20
7900    JAMES   CLERK   7698    1981-12-03      950.0   NULL    30
7902    FORD    ANALYST 7566    1981-12-03      3000.0  NULL    20
7934    MILLER  CLERK   7782    1982-01-23      1300.0  NULL    10

 更多大数据精彩内容欢迎B站搜索“千锋教育”或者扫码领取全套资料 

【千锋教育】大数据开发全套教程,史上最全面的大数据学习视频

 

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

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

相关文章

DC-DC降压恒流芯片 12-110V 9V/1A AP2400 LED汽车摩托车灯驱动IC

1,方案来源:深圳市世微半导体有限公司 2,产品BOM表:输入 12-100V 输出9V 0.9A 3,产品线路图:输入 12-100V 输出9V 0.9A 4,产品介绍 AP2400 是一款 PWM 工作模式, 率、外围简单、外驱功率管&#xff0…

Axure教程—复选框全选与反选

很多业务系统之中都会有以列表的形式展现数据的情况,那么问题来了,对列表选择时会出现多选、全选、反选的问题,今天就来介绍如何使用axure原型工具实现复选框的多选、全选和反选。 效果预览 预览地址:https://ddprtm.axshare.com…

FFmpeg流媒体处理的收流与推流

1. 简介 流媒体是使用了流式传输的多媒体应用技术。如下是维基百科关于流媒体概念的定义: 流媒体 (streaming media) 是指将一连串的媒体数据压缩后,经过网络分段发送数据,在网络上即时传输影音以供观赏的一种技术与过程,此技术使…

20亿元项目“落子”杭州,这家企业加速全栈智驾平台规模化交付

6月20日,在“幸会杭州”投资促进大会上,中国领先的智能驾驶解决方案服务商和产品供应商福瑞泰克与杭州市政府就在杭州市高新技术开发区(滨江)建设全球研发管理总部达成签约。福瑞泰克董事长兼首席执行官张林博士受邀出席大会&…

SSM摄影服务线上选购预约系统-计算机毕设 附源码83784

SSM摄影服务线上选购预约系统 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用SSM技…

网络安全|渗透测试入门学习,从零基础入门到精通—动态分析技术OllyDbg案例详情

目录 1、准备工作 2、加载目标文件进行调试 3、单步跟踪 4、设置断点 5、调试分析 1、准备工作 分析一个Windows程序要比分析一个DOS程序容易得多因为在Windows中只要API函数被使用了,再想对要寻找蛛丝马迹的人隐藏一些信息就比较困难了。因此,在分析…

软考高级系统架构设计师(七) 需求工程相关

目录 需求工程概述 需求工程-需求获取 需求开发-需求分析 需求分析-OOA OOA-UML-41视图 需求定义 需求验证 需求跟踪 需求变更管理 软件系统建模 结构化设计 面向对象设计 软件界面设计 需求工程概述 需求工程-需求获取 需求获取方法: 需求开发-需求分…

在 BI 工具 Tableau 中使用 databend

Tableau是一款流行的数据可视化和业务智能工具。它提供了直观、交互式的方式来探索、分析和呈现数据,帮助用户更好地理解数据的意义和洞察。 本教程帮助用户在 Tableau 中连接 databend 进行 BI 数据分析。 Databend jdbc Tableau 支持所有实现了 JDBC 协议的数据…

如何在 Spring Boot 中使用 WebFlux

如何在 Spring Boot 中使用 WebFlux 随着互联网应用的复杂度不断增加,传统的请求响应模型已经无法满足日益增长的需求。传统的 Web 应用使用 Servlet 容器,采用同步阻塞的方式来处理请求,请求需要等待相应的处理逻辑完成后才能返回结果。这种…

【C/C++实战项目】万年历

目录 项目分析 项目效果 头文件及全局变量 获取天数 打印月份、年份日历 main函数 项目分析 实现查询某一个年份、月份,以日历的格式打印为了观赏性利用符号对打印的每一个日期进行分格特殊节日日期能够在日历中标注出来万年历的起始日期是公元1年&#xff0…

[Orin Nx] 如何跑满GPU和CPU,观察温度和散热性能?

1、环境说明 硬件: Nvidia Orin NX 16GB 软件:Jetson Linux R35.3.1 2、工具安装部署 GPU的压力测试主要使用工具: https://github.com/anseeto/jetson-gpu-burn CPU的压力测试主要使用工具 stress 注意安装 jetson-gpu-burn需要在 /etc/apt/sourc…

SpringBoot 客户信息管理系统-计算机毕设 附源码80944

SpringBoot客户信息管理系统 摘 要 随着计算机技术的发展,特别是计算机网络技术与数据库技术的发展,使用人们的生活与工作方式发生了很大的改观。本课题研究的客户信息管理系统,主要功能模块包括统计图,系统用户(管理…

JS高级用法:像大神一样玩转JavaScript

大厂面试题分享 面试题库 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 众所周知,JavaScript是一种非常流行的编程语言,它已经成为了…

回收站如何添加到桌面?没有回收站的数据怎么恢复

最近收到很多这样的咨询: 咨询1:在网吧上网,不小心把照片删了,可恨的是这里没有回收站,请问怎么找回照片!!!急,谢谢了。 咨询2:在网吧上网,一删除…

emmylua+Rider 断点调试

1、下载安装并激活好rider(本次版本基于:JetBrains Rider 2023.1.3) 2、从插件商店中安装emmylua 3、打开项目 在unity中设置好,使用rider打开项目即可 4、Unity中打开相应的场景 (此场景基于Xlua官方Demo展示&…

初中生台灯如何选择?眼科专家推荐的学生台灯分享

保护视力一直是家长们经常提醒孩子们的一句话,但据统计青少年学生的近视率还是非常高,很多家长认为这是不良的用眼习惯导致的,却没想过可能是其他原因,因为孩子除了自身保持良好的用眼习惯外,在学习时用眼的光线也是十…

有哪些智能聊天ai机器人?这几种ai工具都能进行聊天

在当前ai技术日益成熟的时代,越来越多的ai聊天机器人开始走进我们的生活中,为我们带来更多乐趣和便利。这几款ai聊天机器人不仅可以陪伴我们度过孤独的夜晚,还可以为我们提供各种对话服务。它们能理解我们的话语,与我们进行自然对…

【Linux 系统编程】Linux背景介绍 及 基本指令详解(一)

文章目录 1. Linux背景1.1 发展史1.2 开源精神1.3 官网1.4 企业应用现状1.5 发行版本1.6 os概念,定位 2. Linux下基本指令2.1 几个常用基本命令演示2.2 某些概念的解释2.3 ls 指令2.4 pwd 指令2.5 cd 指令Linux的目录结构绝对路径与相对路径cd 常用快捷命令 2.6 tou…

【unity每日一记】transform类精华之珠

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

【Java】JVM学习(二)

JVM的内存区域 运行时数据区域 运行时数据区的定义: Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 Java 引以为豪的就是它的自动内存管理机制。相比于 C的手动内存管理、复杂难以理解的指针等,Java 程序写起来就方…