写点什么

大数据 -23 Sqoop 数据 MySQL 到 HDFS(部分) JDBC ETL MapReduce

作者:武子康
  • 2025-06-27
    美国
  • 本文字数:2358 字

    阅读完需:约 8 分钟

大数据-23 Sqoop 数据MySQL到HDFS(部分) JDBC ETL MapReduce

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI 篇持续更新中!(长期更新)

目前 2025 年 06 月 16 日更新到:AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!📐🤖

💻 Java 篇正式开启!(300 篇)

目前 2025 年 06 月 26 日更新到:Java-55 深入浅出 分布式服务 分布式一致性 强一致、弱一致、单调读一致、最终一致 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!目前 2025 年 06 月 13 日更新到:大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解


章节内容

上一节我们完成了如下的内容:


  • 编写一个 SQL 脚本生成数据

  • 启动我们的依赖服务:HDFS、Hive、YARN

  • Sqoop 将数据 全量 导入 Hive

  • 查看 MapReduce 状态、查看 HDFS 结果

背景介绍

这里是三台公网云服务器,每台 2C4G,搭建一个 Hadoop 的学习环境,供我学习。


  • 2C4G 编号 h121

  • 2C4G 编号 h122

  • 2C2G 编号 h123


注意事项

Apache Sqoop 于 2021 年 6 月迁入 Attic。Apache Sqoop 的使命是创建和维护与 Apache Hadoop 和结构化数据存储相关的大规模数据传输软件。虽然项目已经可能过时,但是如果你的时间充裕的话,可以适当地学习一下,可能会对你有一定的帮助的!!!

基本介绍

Apache Sqoop 是一款专为在 关系型数据库(如 MySQL)与 Hadoop(如 HDFS、Hive、HBase) 之间高效传输数据而设计的工具。


  • 主要用于**批量导入(Import)和批量导出(Export)**数据。

  • 架构上依赖于 MapReduce,每个导入任务默认使用多个 Map 任务并发执行,提高传输效率。


核心用途

  • 数据导入:将关系数据库的数据导入 HDFS、Hive、HBase 等

  • 数据导出:将 Hadoop 系统中的数据导出回 RDBMS

  • 批量传输:支持大批量并行传输,提高效率

  • 数据仓库同步:与 Hive 集成,方便大数据分析

核心流程图

MySQL表 --> Sqoop调度器(生成MapReduce Job)--> 多个Mapper任务并发抓取数据 --> 写入HDFS
复制代码

ETL

ETL 全称:Extract(抽取)、Transform(转换)、Load(加载),是指从多个数据源提取数据,进行清洗、格式转换、聚合等操作,最后加载到目标系统(如数据仓库、数据湖或分析平台)中的过程。


为什么需要 ETL?


  • 整合异构系统数据(如 MySQL、Excel、日志、API 数据等)

  • 保障数据质量(清洗异常值、统一格式)

  • 支撑数据分析、报表、机器学习模型训练等下游需求

ETL 三个阶段

Extract 抽取

从各种来源系统中提取原始数据:


  • 数据源类型:关系型数据库(MySQL、Oracle)、NoSQL(MongoDB)、CSV 文件、REST API、日志文件等

  • 技术示例:JDBC、API 拉取、日志监听、消息队列(Kafka)


⚠️ 重点在于高效、准确、不丢数据

Transform 转换

对提取的数据进行处理,确保数据可用、准确、一致:


  • 清洗:空值填充、重复数据处理、异常值识别

  • 格式转换:日期格式统一、编码统一(如 UTF-8)

  • 衍生字段:如从订单数据中计算用户生命周期价值(LTV)

  • 业务规则应用:如收入必须为正数、时间不能晚于当前时间

  • 数据汇总:如按照天/周/月聚合销售数据


✅ 转换阶段是提升数据“质量”和“可用性”的关键

Load 加载

将转换后的数据写入目标系统(如数据仓库或数据湖):


  • 批量导入:如将每日销售数据加载到 Hive、ClickHouse、Snowflake

  • 增量加载:仅加载新增或变更部分(节省资源)

  • 覆盖式加载:全量覆盖旧数据


⚠️ 需关注目标系统的写入能力、负载压力和一致性保障

基本导入命令

sqoop import \  --connect jdbc:mysql://localhost:3306/dbname \  --username root \  --password password \  --table user_table \  --target-dir /user/hdfs/user_table \  --num-mappers 4 \  --as-textfile \  --fields-terminated-by '\t'
复制代码


参数说明:


  • --connect:JDBC 连接字符串

  • --username / --password:数据库账户

  • --table:要导入的 MySQL 表名

  • --target-dir:在 HDFS 上的输出目录

  • --num-mappers:Mapper 数量,默认 4,可控制并发度

  • --as-textfile:导入为纯文本文件(也可以选 --as-parquetfile、--as-avrodatafile)

  • --fields-terminated-by:字段分隔符,默认,,可以用 \t 表示 TSV

部分导入: --query

执行脚本

sqoop import \--connect jdbc:mysql://h122.wzk.icu:3306/sqoop \--username hive \--password hive@wzk.icu \--target-dir /root \--append \-m 1 \--fields-terminated-by "\t" \--query 'select gname, serialNumber, price, stock_number,create_time from goodtbl where price>88 and $CONDITIONS;'
复制代码


上述参数的解释:


  • 查询语句的 where 中必须包含 '$CONDITIONS'

  • 如果 query 后使用双引号 则 $CONDITIONS 前必须加转移符号,防止 shell 认为是自己的变量

分配任务

可以观察到 Sqoop 开始了 MapReduce 的任务


等待执行

此时任务已经开始分配了 Map -> Reduce


查看结果

可以看到任务执行完毕


部分导入: 指定列

执行脚本

sqoop import \--connect jdbc:mysql://h122.wzk.icu:3306/sqoop \--username hive \--password hive@wzk.icu \--target-dir /root \--delete-target-dir \--num-mappers 1 \--fields-terminated-by "\t" \--columns gname,serialNumber,price \--table goodtbl
复制代码


上述参数的解释:


  • columns 中如果涉及到多个列,用逗号分隔,不能添加空格!!!

分配任务

与上述的内容一致,就不放重复的内容了,只截取部分。


部分导入: --where

执行脚本

sqoop import \--connect jdbc:mysql://h122.wzk.icu:3306/sqoop \--username hive \--password hive@wzk.icu \--target-dir /root \--delete-target-dir \-m 1 \--fields-terminated-by "\t" \--table goodtbl \--where "price>=68"
复制代码

分配任务

与上述一致,内容结果等基本重复,也不放了。



发布于: 刚刚阅读数: 5
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-23 Sqoop 数据MySQL到HDFS(部分) JDBC ETL MapReduce_Apache_武子康_InfoQ写作社区