Sqoop 快速入门指南(在关系型数据库之间高效批量传输数据)
Sqoop是Apache开源工具专用于关系型数据库如MySQL与HadoopHDFS/Hive间的数据传输。核心功能包括数据导入import支持全表导入、条件过滤WHERE、自定义SQL查询可指定分隔符和压缩格式数据导出export将HDFS数据写回关系库Hive集成直接导入数据到Hive表并自动建表增量导入支持基于ID递增append和时间戳lastmodified两种模式常用管理命令数据库/表查看、作业管理等典型应用场景MySQL→HDFS全量迁移HDFS→MySQL数据回写增量数据同步与Hive数据仓库集成注意事项需配置JDBC驱动、注意字符编码问题并行导入时需指定切分字段。通过-m参数控制并行度split-by指定分片键可显著提升传输效率。Sqoop 快速入门指南Sqoop 是 Apache 开源的数据迁移工具专门用于在关系型数据库如 MySQL和 HadoopHDFS/Hive之间高效批量传输数据。Sqoop 本身并没有官方的、专门为其开发的图形化操作界面软件。Sqoop 本质上是一个将导入/导出命令翻译成 MapReduce 程序的命令行工具。这个特点部分来自于其早期设计定位也与其运行机制每个任务都独立提交、没有服务端进程有关。不过在大数据生态中有几个优秀的工具可以通过图形化方式来操作和管理 Sqoop 任务。HueHadoop User Experience是一个开源的 Apache Hadoop UI 系统它集成了Sqoop 2 编辑器提供图形化界面来创建和管理数据迁移任务。配置太麻烦放弃Pentaho是一个大数据分析平台它的可视化设计工作室Visual Design Studio已将 Sqoop 功能集成到图形界面中。商用要钱Kettle 是绿色免安装的直接在 Windows 上解压就能用。推荐一、核心命令结构Sqoop 主要提供两个核心命令import导入到 HDFS/Hive和export导出到 MySQL。bash# 导入MySQL → HDFS/Hive sqoop import \ --connect jdbc:mysql://host:port/database \ --username user \ --password pass \ --table table_name \ --target-dir /hdfs/path # 导出HDFS/Hive → MySQL sqoop export \ --connect jdbc:mysql://host:port/database \ --username user \ --password pass \ --table table_name \ --export-dir /hdfs/path二、导入操作MySQL → HDFS1. 全量导入整个表将 MySQL 的employees表完整导入到 HDFSbashsqoop import \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password 123456 \ --table employees \ --target-dir /user/mumu/employees \ -m 4 \ --split-by id参数说明参数说明-m/--num-mappers并行 Map 任务数默认 4--split-by切分字段通常是主键用于并行导入--target-dirHDFS 目标目录--fields-terminated-by字段分隔符默认逗号2. 指定分隔符和压缩bashsqoop import \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ -P \ --table employees \ --target-dir /user/mumu/employees \ --fields-terminated-by \t \ --compress \ --compression-codec snappy \ -m 4-P会提示你交互式输入密码比直接在命令行写更安全。3. 条件导入WHERE 过滤只导入部门编号为 10 的员工bashsqoop import \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password 123456 \ --table employees \ --where dept_id 10 \ --target-dir /user/mumu/employees_dept104. 自定义 SQL 导入bashsqoop import \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password 123456 \ --query SELECT id, name, salary FROM employees WHERE salary 50000 AND \$CONDITIONS \ --split-by id \ --target-dir /user/mumu/high_salary注意使用--query时必须指定--target-dir且查询中必须包含\$CONDITIONS占位符。三、导入到 Hive直接导入到 Hive 表省去手动建表bashsqoop import \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password 123456 \ --table employees \ --hive-import \ --hive-table testdb.employees \ --create-hive-table \ -m 4参数说明参数作用--hive-import启用 Hive 导入--hive-table指定目标 Hive 表可带数据库名--create-hive-table自动创建 Hive 表--hive-overwrite覆盖已有数据四、导出操作HDFS → MySQL将 HDFS 中的数据写回 MySQLbashsqoop export \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password 123456 \ --table employees_backup \ --export-dir /user/mumu/employees \ --input-fields-terminated-by , \ -m 4参数说明参数说明--export-dirHDFS 数据目录--input-fields-terminated-byHDFS 文件的字段分隔符--update-key指定主键列执行更新而非插入--update-modeupdateonly或allowinsert五、增量导入1. Append 模式基于递增 IDbashsqoop import \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password 123456 \ --table orders \ --incremental append \ --check-column id \ --last-value 1000 \ --target-dir /user/mumu/orders只导入id 1000的新数据。2. LastModified 模式基于时间戳bashsqoop import \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password 123456 \ --table orders \ --incremental lastmodified \ --check-column update_time \ --last-value 2024-01-01 00:00:00只导入update_time晚于指定时间的数据。六、常用命令速查命令说明sqoop list-databases列出数据库sqoop list-tables列出表sqoop eval执行 SQL 并查看结果sqoop job --create创建保存的作业sqoop job --list列出已有作业sqoop job --exec执行作业示例列出数据库bashsqoop list-databases \ --connect jdbc:mysql://localhost:3306/ \ --username root \ --password 123456七、常见问题错误解决方案ClassNotFoundExceptionJDBC 驱动未放入$SQOOP_HOME/libConnection refused检查 MySQL 服务状态和网络连通性Access denied确认用户名和密码正确Hive 找不到表确认 Hive 已启动且表存在MySQL 乱码连接 URL 添加?useUnicodetruecharacterEncodingutf-8掌握上面的命令后你就能用 Sqoop 完成常见的数据迁移任务了。