小菜鸟

java菜鸟号正在起航

Sqoop 导出:从 HDFS 推回 MySQL,全量覆盖、增量更新,两种策略怎么选

Sqoop 导出,就是把 HDFS 上的数据写回关系型数据库。

HDFS(分析结果) → Sqoop Export → MySQL(业务系统查询)

什么时候需要导出?

  • Hive 算完报表,要推回 MySQL 供业务系统查询
  • 数据清洗后的结果,要写回业务库
  • 跨系统数据同步

导出前准备:目标表要先建好

Sqoop 导出不会自动建表,目标表必须在 MySQL 里提前建好。

CREATE TABLE staff (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  age INT,
  sex TINYINT
);

关键: 表的字段数、顺序、类型必须跟 HDFS 数据对得上。对不上就报错。

基础导出:从 HDFS 到 MySQL

sqoop export \
  --connect jdbc:mysql://localhost:3306/company \
  --username root \
  --password 123456 \
  --table staff \
  --export-dir /user/hive/warehouse/staff_hive \
  --input-fields-terminated-by "\t" \
  --num-mappers 1 \
  --batch

关键参数:

参数 说明
--export-dir HDFS 数据目录(Hive 表对应的目录)
--table MySQL 目标表
--input-fields-terminated-by HDFS 文件的分隔符,必须跟数据一致
--num-mappers 并行度,默认 4,根据数据库负载调整
--batch 批量提交,提升效率
阅读全文 »

Sqoop 导入:从 MySQL 到 HDFS,全量、增量、过滤、入 Hive,四种场景一套命令

Sqoop 导入,就是从关系型数据库往 Hadoop 搬数据。

四种常见场景,按复杂度从低到高:

场景 命令关键词 适合什么时候
全量导入 --table 第一次导入,把整张表拉过来
条件导入 --where / --query 只要部分行或部分列
增量导入 --incremental 每天只导新增数据
直入 Hive --hive-import 省掉中间步骤,直接进 Hive

全量导入:整张表拉到 HDFS

最基础的用法,把 MySQL 的一张表完整导入 HDFS。

sqoop import \
  --connect jdbc:mysql://localhost:3306/company \
  --username root \
  --password 123456 \
  --table staff \
  --target-dir /user/sqoop/company \
  --delete-target-dir \
  --fields-terminated-by "\t" \
  --num-mappers 1

关键参数:

参数 说明
--table 要导的表名
--target-dir HDFS 目标目录
--delete-target-dir 目录存在就先删,避免报错(全量覆盖用)
--fields-terminated-by 字段分隔符(默认逗号)
--num-mappers 并行度,1 最稳,大表可调大

数据去哪了:

/user/sqoop/company/
  └── part-m-00000    数据文件

条件导入:只导需要的数据

全量导入把整张表都拉过来,但有时候只需要部分行或部分列。

2.1 按行过滤(--where

sqoop import \
  --table staff \
  --where "sex = 0 AND age > 18" \
  --target-dir /user/sqoop/company_filter

只导满足条件的行。

2.2 按列过滤(--columns

sqoop import \
  --table staff \
  --columns "name, age, sex" \
  --target-dir /user/sqoop/company_columns
阅读全文 »

Sqoop:Hadoop 和 MySQL 之间的”数据搬运工”

Sqoop 就干一件事:Hadoop 和关系型数据库之间搬数据。

  • 导入(Import):MySQL/PostgreSQL → HDFS/Hive/HBase
  • 导出(Export):HDFS/Hive → MySQL/PostgreSQL

业务数据在 MySQL 里,要拉到 Hive 做离线分析 → 用 Sqoop Import。
分析结果在 HDFS 上,要推回 MySQL 供业务系统用 → 用 Sqoop Export。

数据导入(Import):从 MySQL 到 HDFS

最常用的操作——把业务数据库的表导入 HDFS。

1. 全量导入:整张表一次性拉过来

sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table user_info \
  --target-dir /user/hadoop/user_info \
  --m 4
参数 说明
--connect 数据库连接地址
--username / --password 数据库账号密码
--table 要导入的表名
--target-dir HDFS 目标目录
-m 4 用 4 个 Map 任务并行

2. 增量导入:只导新增或变化的数据

全量导入只适合第一次,后续需要增量同步。

方式一:按递增列(Append 模式)

sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table user_info \
  --target-dir /user/hadoop/user_info \
  --incremental append \
  --check-column id \
  --last-value 1000

只导入 id > 1000 的数据,适合自增 ID 的场景。

方式二:按时间戳(LastModified 模式)

sqoop import \
  --connect jdbc:mysql://localhost:3306/testdb \
  --username root \
  --password 123456 \
  --table orders \
  --target-dir /user/hadoop/orders \
  --incremental lastmodified \
  --check-column update_time \
  --last-value "2024-01-01 00:00:00"
阅读全文 »

Sqoop 配置:配环境变量 + 装驱动 + 测连接,三步跑通

Sqoop 配置就三件事:

  • sqoop-env.sh(Hadoop 路径)
  • 装数据库 JDBC 驱动
  • 测连接(sqoop list-databases

必配:sqoop-env.sh——告诉 Sqoop Hadoop 在哪

cd $SQOOP_HOME/conf
cp sqoop-env-template.sh sqoop-env.sh
vim sqoop-env.sh
# Hadoop 公共组件路径(HDFS、YARN 等)  
export HADOOP_COMMON_HOME=/usr/local/myself/hadoop-3.3.0  

# MapReduce 路径(Sqoop 依赖 MapReduce 执行数据同步)  
export HADOOP_MAPRED_HOME=/usr/local/myself/hadoop-3.3.0  

# Hive 路径(若需与 Hive 交互,如导入数据到 Hive 表)  
export HIVE_HOME=/usr/local/myself/apache-hive-3.1.2-bin  

# ZooKeeper 路径(若依赖 ZooKeeper,如与 HBase 交互)  
export ZOOKEEPER_HOME=/usr/local/myself/apache-zookeeper-3.6.1-bin  
export ZOOCFGDIR=/usr/local/myself/apache-zookeeper-3.6.1-bin/conf  

# HBase 路径(若需与 HBase 交互)  
export HBASE_HOME=/usr/local/myself/hbase-2.2.7

必配: HADOOP_COMMON_HOMEHADOOP_MAPRED_HOME,Sqoop 底层跑的是 MapReduce,没有这两项任务提交不了。

选配:

变量 什么时候需要
HIVE_HOME 要用 --hive-import 直接导到 Hive
HBASE_HOME 要导到 HBase
ZOOKEEPER_HOME 连接 HBase 时需要

新手只配 Hadoop 路径就够了,用到 Hive/HBase 的时候再补。

装驱动:Sqoop 本身不带数据库驱动

Sqoop 通过 JDBC 连数据库,但驱动要自己装

# 下载 MySQL 驱动
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar

# 放到 Sqoop 的 lib 目录
cp mysql-connector-java-8.0.28.jar $SQOOP_HOME/lib/

版本匹配:

MySQL 版本 推荐驱动
MySQL 5.7 mysql-connector-java-5.1.x.jar
MySQL 8.0 mysql-connector-java-8.0.x.jar

驱动版本不对会报 No suitable driver found for jdbc:mysql

其他数据库:

阅读全文 »

MySQL SQL 语句执行顺序详解

MySQL 执行 SQL 语句时,并不是按照代码的书写顺序执行的,而是遵循一套固定的逻辑流程。理解执行顺序对于编写高效 SQL、排查查询问题至关重要。

完整执行顺序

MySQL 对 SQL 语句的执行顺序如下(按序号依次执行):

  1. FROM 及关联操作
    • 首先确定查询的数据源,包括主表(FROM <left_table>)和关联表(<join_type> JOIN <right_table>)。
    • 通过 ON <join_condition> 过滤关联条件,生成临时数据集(包含两表匹配的记录)。
  2. WHERE 过滤
    • FROM 阶段生成的临时数据集进行行级过滤,仅保留满足 <where_condition> 的记录。
    • 注意:此时还不能使用 SELECT 中定义的别名,也不能使用聚合函数(如 SUM()COUNT())。
  3. GROUP BY 分组
    • <group_by_list> 指定的字段对数据进行分组,相同分组的记录会被合并为一行。
    • 分组后,后续操作(如 HAVINGSELECT)只能针对分组后的结果进行处理。
  4. HAVING 过滤
    • GROUP BY 分组后的结果进行过滤,仅保留满足 <having_condition> 的分组。
    • WHERE 的区别:HAVING 可使用聚合函数(如 HAVING COUNT(*) > 10),而 WHERE 不行。
  5. SELECT 字段筛选
    • 从前面的结果集中筛选出 <select_list> 指定的字段或计算结果(如 SELECT name, age+1 AS new_age)。
    • 此时可以使用别名(如 new_age)。
  6. DISTINCT 去重
    • SELECT 阶段的结果进行去重,保留唯一的记录。
  7. ORDER BY 排序
    • <order_by_condition> 对结果集进行排序(如 ORDER BY age DESC)。
    • 可以使用 SELECT 中定义的别名(如 ORDER BY new_age)。
  8. LIMIT 限制结果
    • <limit_number> 截取结果集的前 N 行(如 LIMIT 10 取前 10 行,LIMIT 5,10 从第 5 行开始取 10 行)。

关键阶段解析

阅读全文 »
0%