Apache Sqoop数据采集问题

Sqoop数据采集格式问题

  • 一、Sqoop工作原理
  • 二、Sqoop命令格式
  • 三、Oracle数据采集格式问题
  • 四、Sqoop增量采集方案

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

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

一、Sqoop工作原理

  • 数据导入:Sqoop通过MapReduce任务来实现数据的并行导入。首先,它会将关系型数据库中的数据表按照一定的规则进行分区,然后为每个分区启动一个Map任务,同时从数据库中读取相应分区的数据,并将数据写入到HDFS或其他Hadoop存储系统中。这样可以充分利用Hadoop集群的分布式计算能力,提高数据导入的效率。

  • 导出过程:与导入类似,Sqoop也会将数据进行分区处理,然后通过Map任务将Hadoop中的数据读取出来,并按照目标关系型数据库的格式要求,将数据写入到数据库中。

Sqoop通过创建一个数据传输的MR程序,进而实现数据传输。

Sqoop安装:

  1. JAVA环境配置
  2. Hadoop环境配置
  3. 相关数据库驱动包

只要环境满足以上设置,直接解压Sqoop安装包即可安装,修改配置后即可使用。

二、Sqoop命令格式

基础使用语法:

sqoop import | export \
--数据库连接参数
--HDFS或者Hive的连接参数
--配置参数

数据传输常用参数:

选项参数
–connectjdbc:mysql://hostname:3306(数据库连接URL)
–username数据库用户名
–password数据库用户密码
–table指定数据表
–columns指定表列值
–where数据过滤条件
–e/–query自定义SQL语句
–driver指定数据库驱动
–delete-target-dir导入数据时,清空目标目录
–target-dir指定导入数据的目录(通常为HDFS路径)
–export-dir指定导出数据的源目录(通常为HDFS路径)

Sqoop命令的使用方法可以通过sqoop -h命令查看相关使用方法,此处不在赘述了

三、Oracle数据采集格式问题

场景:

  • Step1: 查看业务数据库中 CISS_SERVICE_WORKORDER 表的数据条数。

    select count(1) as cnt from CISS_SERVICE_WORKORDER;  178609
  • Step2: 采集CISS_SERVICE_WORKORDER的数据到HDFS上

    sqoop import \
    --connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \  
    --username ciss \
    --password 123456 \
    --table CISS4.CISS_SERVICE_WORKORDER \
    --delete-target-dir \
    --target-dir /test/full_imp/ciss4.ciss_service_workorder \
    --fields-terminated-by "\001" \   #指定数据分割符
    -m 1  #指定并行度
    
  • Step3: 使用Hive查看导入数据表的行数

    create external table test_text(
    line string # 将导入的数据一行作为表中的一列
    )
    location '/test/full_imp/ciss4.ciss_service_workorder';
    select count(*) from test_text;  195825

问题:
Sqoop采集完数据后,HDFS数据中存储的数据行数跟源数据库的数据量不符合。

原因:

  • sqoop以文本格式导入数据时,默认的换行符是特殊字符。
  • Oracle中的数据列中如果出现了\n、\r、\t等特殊字符,就会被划分为多行

Oracle数据:

idnameage
001zhang\nsan18

Sqoop转换后的数据:

001zhang
san18

Hive表中的数据:

idnameage
001zhang
san18

解决方法:

  • 方案一:
    • 删除或者替换数据中的换行符
    • Sqoop参数 --hive-drop-import-delims 删除换行符
    • Sqoop参数 --hive-delims-replacement char 替换换行符

    不建议使用,破坏原始数据结构,ODS层数据尽量抱持原结构

  • 方案二:
    • 采用特殊的存储格式,AVRO格式

常见的文件格式介绍:

类型介绍
TextFileHive默认的文件格式,最简单的数据格式,便于查看和编辑,耗费存储空间,I/O性能较低
SequenceFile含有键值对的二进制文件,优化磁盘利用率和I/O,并行操作数据,查询效率高,但存储空间消耗最大
AvroFile特殊的二进制文件,设计的主要目标是为了满足schema evolution,Schema和数据保存在一起
OrcFile列式存储,Schema存储在footer中,不支持schema evolution,高度压缩比并包含索引,查询速度非常快
ParquetFile列式存储,与Orc类似,压缩比不如Orc,但是查询性能接近,支持的工具更多,通用性更强

Avro格式特点

  • 优点
    • 二进制数据存储,性能好、效率高
    • 使用JSON描述模式,支持场景更丰富
    • Schema和数据统一存储,消息自描述(将表中的一行数据作为对象存储,并且Schema为元数据)
    • 模式定义允许定义数据的排序
  • 缺点
    • 只支持Avro自己的序列化格式
    • 少量列的读取性能比较差,压缩比较低
  • 场景:基于行的大规模结构化数据写入、列的读取非常多或者Schema变更操作比较频繁的场景

Sqoop使用Avro格式:

  sqoop import \-Dmapreduce.job.user.classpath.first=true \--connect jdbc:oracle:thin:@oracle.bigdata.cn:1521:helowin \--username ciss \--password 123456 \--table CISS4.CISS_SERVICE_WORKORDER \--delete-target-dir \--target-dir /test/full_imp/ciss4.ciss_service_workorder \--as-avrodatafile \    # 选择文件存储格式为AVRO--fields-terminated-by "\001" \-m 1

Hive建表指定文件的存储格式:

create external table test_avro(
line string
)
stored as avro
location '/test/full_imp/ciss4.ciss_service_workorder';

AVRO 数据以 二进制序列化 存储,字段通过预定义的 模式(Schema) 解析,而非依赖分隔符,即使字段内容包含逗号、换行符等特殊字符,也不会影响数据结构的正确性。
Schema 定义(JSON 格式),明确描述了字段名称、类型、顺序等信息。

四、Sqoop增量采集方案

Sqoop 支持两种增量模式:

  • append 模式:
    适用于 仅追加数据 的表(如日志表),基于 递增列(如自增主键 id)采集新数据。

  • lastmodified 模式:
    适用于 数据会更新 的表(如用户表),基于 时间戳列(如 last_update_time)采集新增或修改的数据。

append模式要求源数据表具备自增列,如建表时设置的自增id
lastmodified模式要求源数据表具有时间戳字段。

Append模式:

要求:必须有一列自增的值,按照自增的int值进行判断

特点:只能导入增加的数据,无法导入更新的数据

场景:数据只会发生新增,不会发生更新的场景

sqoop import \                                   # 执行数据导入操作--connect jdbc:mysql://node3:3306/sqoopTest \  # 连接MySQL数据库(地址:node3,数据库名:sqoopTest)--username root \                             # 数据库用户名:root--password 123456 \                           # 数据库密码:123456--table tb_tohdfs \                           # 要导入的源表:tb_tohdfs--target-dir /sqoop/import/test02 \           # HDFS目标目录(数据将写入此路径)--fields-terminated-by '\t' \                 # 字段分隔符为制表符(\t)--check-column id \                           # 指定增量检查列:id(通常是自增主键)--incremental append \                        # 增量模式为“append”(仅导入新数据)--last-value 0 \                              # 上次导入的id最大值(初始值为0,首次导入id>0的数据)-m 1                                          # 使用1个Map任务(单线程)

appebd模式使用last-value记录上次导入的数据id最大值,初次导入一般为全量导入,即id>0

此处的last_value需要手动填写,因此可以使用Sqoop的job管理进行自动记录。

sqoop job --create my_job -- import ... --incremental append --check-column id --last-value 0
sqoop job --exec my_job  # 自动更新 last-value

lastmodified模式:
要求:必须包含动态时间变化这一列,按照数据变化的时间进行判断

特点:既导入新增的数据也导入更新的数据

场景:表中的记录会新增或更新,且每次更新都会修改 lastmode 时间戳。一般无法满足要求,所以不用。

sqoop import \                                   # 执行数据导入操作--connect jdbc:mysql://node3:3306/sqoopTest \  # 连接MySQL数据库(地址:node3,数据库名:sqoopTest)--username root \                             # 数据库用户名:root--password 123456 \                           # 数据库密码:123456--table tb_lastmode \                         # 要导入的源表:tb_lastmode--target-dir /sqoop/import/test03 \           # HDFS目标目录(数据将写入此路径)--fields-terminated-by '\t' \                 # 字段分隔符为制表符(\t)--incremental lastmodified \                  # 增量模式为“lastmodified”(采集新增或修改的数据)--check-column lastmode \                     # 指定时间戳列:lastmode(记录数据的更新时间)--last-value '2021-06-06 16:09:32' \          # 上次导入的最大时间值(导入此时间之后的新增/修改数据)-m 1                                          # 使用1个Map任务(单线程)

lastmodified模式使用时间戳记载数据的更新线。

若同一条记录被多次更新,且 lastmode 时间超过 --last-value,Sqoop 会多次导入该记录。

解决方案:添加 --merge-key <主键列> 参数,合并新旧数据(基于主键去重):

 --merge-key id  # 假设 id 是主键列

自定义模式:
要求:每次运行的输出目录不能相同

特点:自己实现增量的数据过滤,可以实现新增和更新数据的采集

场景:一般用于自定义增量采集每天的分区数据到Hive

sqoop  import \
--connect jdbc:mysql://node3:3306/db_order \
--username root \
--password-file file:///export/data/sqoop.passwd \
--query "select * from tb_order where substring(create_time,1,10) = '2021-09-14' or substring(update_time,1,10) = '2021-09-14' and \$CONDITIONS " \
--delete-target-dir \
--target-dir /nginx/logs/tb_order/daystr=2021-09-14 \
--fields-terminated-by '\t' \
-m 1

自定义模式可以根据设置的sql进行数据导入,因此是最常用的场景。

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

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

相关文章

Grok发布了Grok Studio 和 Workspaces两个强大的功能。该如何使用?如何使用Grok3 API?

最近Grok又更新了几个功能&#xff1a;Grok Studio 和 Workspaces。 其中 Grok Studio 主要功能包括&#xff1a; 代码执行&#xff1a;在预览标签中运行 HTML 片段、Python、JavaScript 等。 Google Drive 集成&#xff1a;附加并处理 Docs、Sheets、Slides等文件。 协作工…

Vue选项式 API 与组合式 API

选项式 API 与组合式 API 选项式 API 选项式 API 是 Vue 2 中常用的开发方式&#xff0c;在 Vue 3 里依旧得到支持。它把组件逻辑划分为不同的选项&#xff0c;像 data、methods、computed 等。 <template><div><p>Count: {{ count }}</p><button…

SiamMask中的分类分支、回归分支与Mask分支,有何本质差异?

SiamMask中的分类分支、回归分支与Mask分支&#xff0c;有何本质差异&#xff1f; 一、引言二、分支定位与任务目标三、网络结构与感受野设计3.1 分类分支&#xff08;Classification Head&#xff09;3.2 回归分支&#xff08;Regression Head&#xff09;3.3 Mask分支&#x…

threejs学习day02

场景、相机、渲染器 一、创建3D场景 // 引入threejs import * as THREE from three// 创建一个三维场景scene const scene new THREE.Scene();// 给三维场景添加物品 const geometry new THREE.BoxGeometry(100,100,100) // 形状 const meterial new THREE.MeshBasicMat…

K8S Pod 常见数据存储方案

假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、理论介绍 1.1、Volumes 卷 Kubernetes 的卷是 pod 的⼀个组成部分&#xff0c;因此像容器⼀样在 pod 的规范&#xff08;pod.spec&#x…

【MySQL数据库】函数操作

目录 1&#xff0c;日期函数 2&#xff0c;字符串函数 3&#xff0c;数学函数 1&#xff0c;日期函数 样例&#xff1a; 获得年月日 select current_date(); 获取时分秒 select current_time(); 获得时间戳 select current_timestamp(); 在日期的基础上加日期 在2025年4月27…

【每日随笔】文化属性 ① ( 天机 | 强势文化与弱势文化 | 文化属性的形成与改变 | 强势文化 具备的特点 )

文章目录 一、文化属性1、天机2、文化属性的强势文化与弱势文化强势文化弱势文化 二、文化属性的形成与改变1、文化属性形成2、文化属性改变3、文化知识的阶层 三、强势文化 具备的 特点 一、文化属性 1、天机 如果想要 了解这个世界的 底层架构 , 就需要掌握 洞察事物本质 的能…

【Fifty Project - D18】

感觉自己就不是计划星球人&#xff0c;虽然fifty project要求每天早上完成一天的计划&#xff0c;但是对于一个p人脑子&#xff0c;强制自己按照计划行事真的太难了。我也理解在早晨花费时间做好一天的计划有很多好处&#xff0c;但是实际行动起来完成率极低。p人的世界里变动太…

Linux系统编程 day11 锁 (两天没有更新了,中期完就休息了)

锁的注意事项 1、尽量保证锁的粒度&#xff0c;越小越好。(访问共享数据前&#xff0c;加锁&#xff0c;访问结束后立即解锁) 2、互斥锁&#xff0c;本质是结构体&#xff0c;但是可以看成整数&#xff0c;初值为1。(pthread_mutex_init调用成功) 3、加锁&#xff1a; --操作…

【Maven】特殊pom.xml配置文件 - BOM

文章目录 特殊pom.xml配置文件 - BOM一、例子二、注意事项1.特殊的子pom.xml文件2.dependencyManagement 特殊pom.xml配置文件 - BOM 仅用于集中管理项目依赖版本 在 Maven 中&#xff0c;BOM 用于定义一个项目的依赖版本的集合&#xff0c;通常用于管理一组共享的依赖版本。这…

《代码整洁之道》第5章 格式 - 笔记

你应该选择一套管理代码格式的简单规则。如果是团队&#xff0c;应该选择一套团队一致同意采用的简单格式规则。 最重要的原则&#xff1a;一致性&#xff08;Consistency&#xff09;&#xff01; 没有完美的格式规范&#xff0c;但有统一的规范。 整个团队&#xff08;或者…

C++ 类与对象(中)—— 默认成员函数与运算符重载的深度解析:构造函数,析构函数,拷贝构造函数,赋值运算符重载,普通取地址重载,const取地址重载

在 C 中&#xff0c;类的默认成员函数是编译器自动生成的重要机制&#xff0c;合理利用这些函数可以简化代码编写&#xff0c;同时避免资源管理错误。本文将从构造函数、析构函数、拷贝构造函数、赋值运算符重载等核心内容展开&#xff0c;结合具体案例深入解析。 一、默认成员…

【KWDB创作者计划】_企业级多模数据库实战:用KWDB实现时序+关系数据毫秒级融合(附代码、性能优化与架构图)

一、技术背景与行业痛点 1.1 多模数据融合挑战 场景痛点&#xff1a; 工业物联网设备每秒产生百万级传感器数据&#xff08;时序数据&#xff09;。需关联设备档案&#xff08;关系数据&#xff09;生成设备健康报告&#xff0c;传统方案需多数据库跳转&#xff0c;延迟>5…

w~嵌入式C语言~合集4

我自己的原文哦~ https://blog.51cto.com/whaosoft/13870376 一、STM32怎么选型 什么是 STM32 STM32&#xff0c;从字面上来理解&#xff0c;ST是意法半导体&#xff0c;M是Microelectronics的缩写&#xff0c;32表示32位&#xff0c;合起来理解&#xff0c;STM32就是指S…

Multisim使用教程详尽版--(2025最新版)

一、Multisim14前言 1.1、主流电路仿真软件 1. Multisim&#xff1a;NI开发的SPICE标准仿真工具&#xff0c;支持模拟/数字电路混合仿真&#xff0c;内置丰富的元件库和虚拟仪器&#xff08;示波器、频谱仪等&#xff09;&#xff0c;适合教学和竞赛设计。官网&#xff1a;艾…

分布式理论和事务

微服务和分布式 微服务 是一种软件架构风格&#xff0c;它将应用程序拆分成一系列小型、独立的服务&#xff0c;每个服务专注于单一功能&#xff0c;彼此通过轻量级通信机制&#xff08;如 API&#xff09;进行交互。微服务通常是松耦合的&#xff0c;可以独立开发、部署和扩展…

JAVA:红黑树应用的技术指南

&#x1f333; 1、简述 红黑树是一种自平衡二叉查找树&#xff08;Self-Balancing Binary Search Tree&#xff09;&#xff0c;被广泛应用于操作系统调度、Java集合、数据库索引等核心模块中。本文将从 基本原理 入手&#xff0c;结合 实际应用场景与代码实例&#xff0c;带你…

【Pandas】pandas DataFrame rfloordiv

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…

【数据可视化-26】基于人口统计与社会经济数据的多维度可视化分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

WinForm真入门(18)——DateTimePicker‌控件解析

一、基本概念‌ ‌DateTimePicker‌ 是 Windows 窗体中用于选择日期和时间的控件&#xff0c;支持以下交互方式&#xff1a; 通过下拉日历选择日期通过上下按钮调整时间直接输入日期或时间 适用于需要规范日期格式、限制日期范围或快速输入的场景&#xff08;如预约系统、数据…