Sqoop与Shell脚本数据迁移实战

2024-06-01 05:52

本文主要是介绍Sqoop与Shell脚本数据迁移实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、sqoop实战示例
    • 1. 获取所有数据库
    • 2. 获取指定数据库的所有表
    • 3. 查询数据
    • 4. 把指定数据库的所有表导入指定hive数据库
    • 5. 把指定表导入hive数据库的指定表
    • 6. 查询数据导入到指定表
  • 二、shell脚本实战示例
    • 1. shell脚本
    • 2. 解释
  • 总结


前言

在数据驱动的时代,高效准确地迁移数据是每个数据工程师不可或缺的技能。本教程将深入探讨如何使用Sqoop工具和Shell脚本,实现从关系型数据库到Hadoop生态系统的数据迁移。通过实战示例,我们将一步步展示如何配置和执行数据导入,确保您能够快速掌握这些关键技术,提升数据处理效率。


一、sqoop实战示例

1. 获取所有数据库

sqoop list-databases \--connect "jdbc:mysql://127.0.0.1:3306/" \--username 'root' \--password 'root'

2. 获取指定数据库的所有表

sqoop list-tables \--connect "jdbc:mysql://127.0.0.1:3306/db_name?useSSL=false" \--username 'root' \--password 'root'

3. 查询数据

sqoop eval \--connect "jdbc:mysql://127.0.0.1:3306/db_name?useSSL=false" \--username 'root' \--password 'root' \--query "select * from tb_name limit 10"

4. 把指定数据库的所有表导入指定hive数据库

sqoop import-all-tables \--connect "jdbc:mysql://127.0.0.1:3306/db_name?useSSL=false" \--username 'root' \--password 'root' \--hive-import \--hive-overwrite \--hive-database 'hive_db_name' \--as-parquetfile \--fields-terminated-by '\0001' \--lines-terminated-by '\n' \--hive-drop-import-delims \--compress

5. 把指定表导入hive数据库的指定表

sqoop import \--connect "jdbc:mysql://127.0.0.1:3306/db_name?useSSL=false" \--username 'root' \--password 'root' \--table 'tb_name' \--as-parquetfile \--hive-import \--hive-overwrite \--compress \--hive-database 'hive_db_name' \--hive-table 'hive_tb_name' \--fields-terminated-by '\0001' \--lines-terminated-by '\n' \--hive-drop-import-delims \--null-string '\\N' \--null-non-string '\\N' \-m 1

6. 查询数据导入到指定表

sqoop import \--connect "jdbc:mysql://127.0.0.1:3306/db_name?useSSL=false" \--username 'root' \--password 'root' \--query "select * from tb_name where \$CONDITIONS" \--hcatalog-database 'hive_db_name' \--drop-and-create-hcatalog-table \--hcatalog-table 'hive_tb_name' \--compress \--fields-terminated-by '\0001' \--lines-terminated-by '\n' \--hive-drop-import-delims \--null-string '\\N' \--null-non-string '\\N' \-m 1

二、shell脚本实战示例

1. shell脚本

#!/bin/bashDB_DATABASE=''
DB_TABLE=''
DB_HOST=''
DB_PORT=''
DB_CONNECTOR="jdbc:sqlserver://$BS_DB_HOST:$BS_DB_PORT;database=$BS_DB_DATABASE"
DB_USER=''
DB_PASSWORD=''
HIVE_DATABASE='ods_'
HIVE_TABLE="ods_${BS_DB_TABLE}_df"
IMPALA_CMD='impala-shell'
##########################################################################################
FIELDS=''
##########################################################################################
# 创建Impala表
create_impala_table() {echo "Executing DDL for table $1.$2:"# 构建Impala建表语句create_table_sql="CREATE TABLE IF NOT EXISTS $1.$2 (${FIELDS//,/ STRING,} STRING)WITH SERDEPROPERTIES ('serialization.format'='1')STORED AS PARQUETTBLPROPERTIES ('DO_NOT_UPDATE_STATS'='true', 'parquet.compression'='snappy');"echo "$create_table_sql"# 创建表$IMPALA_CMD -q "$create_table_sql"
}
##########################################################################################
# 函数:清空表数据
truncate_table() {$IMPALA_CMD -q "TRUNCATE TABLE $1.$2"
}
##########################################################################################
# 刷新hive元数据
hive_table_refresh() {$IMPALA_CMD -q "REFRESH $1.$2"
}
##########################################################################################
# 获取hive表字段
get_hive_table_fields() {$IMPALA_CMD --quiet -q "DESCRIBE $1.$2;" | awk 'NR>3{print $2}' | paste -sd, | sed '$ s/,$//'
}
##########################################################################################
# 把sqlserver数据导入hive
db_import_to_hive() {local db_connector=$1local db_user=$2local db_pw=$3local table_name=$4local hive_dbname=$5local hive_tbname=$6sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \--connect "$db_connector" \--username "$db_user" \--password "$db_pw" \--query "select $FIELDS from ${table_name} where \$CONDITIONS" \--hcatalog-database "$hive_dbname" \--hcatalog-table "$hive_tbname" \--fields-terminated-by '\0001' \--lines-terminated-by '\n' \--hive-drop-import-delims \--null-string '\\N' \--null-non-string '\\N' \-m 1
}
##########################################################################################
# 如果表不存在则创建表
create_impala_table $HIVE_DATABASE $HIVE_TABLE
# 比较Impala表的字段与脚本字段是否一样
# 开启不区分大小写
#hive_fields=$(get_hive_table_fields $HIVE_DATABASE $HIVE_TABLE)
#shopt -s nocasematch
#if [ "$FIELDS" == "$hive_fields" ]; then
#    echo "字符串内容一致(忽略大小写)"
#else
#    echo "字符串内容不一致"
#fi
# 关闭不区分大小写
#shopt -u nocasematch
# 清空表数据
truncate_table $HIVE_DATABASE $HIVE_TABLE
# 导入数据到hive
db_import_to_hive $DB_CONNECTOR $DB_USER $DB_PASSWORD $DB_TABLE $HIVE_DATABASE $HIVE_TABLE
# 刷新hive元数据
hive_table_refresh $HIVE_DATABASE $HIVE_TABLEexit 0

2. 解释

这个脚本是一个用于数据迁移的Bash脚本,其主要目的是将SQL Server数据库中的数据导入到Hive表中,适用于全量覆盖更新的数据导入。以下是该脚本的步骤和功能的详细解释:

  1. 变量初始化:脚本开始部分定义了一些变量,包括数据库和表的相关参数(如DB_DATABASE, DB_TABLE等),以及 Impala 的命令 IMPALA_CMD

  2. 创建Impala表:函数 create_impala_table 用于在 Impala 中创建一个表。这个表是根据 Hive 表的结构来定义的,使用了 Parquet 格式。

  3. 清空表数据:函数 truncate_table 用于删除 Impala 表中的所有数据。

  4. 刷新hive元数据:函数 hive_table_refresh 用于在 Impala 中刷新 Hive 表的元数据,可能是为了确保 Impala 表反映最新的 Hive 表信息。

  5. 获取hive表字段:函数 get_hive_table_fields 用于查询 Hive 表的字段,并返回字段列表。

  6. 数据库数据导入Hive:函数 db_import_to_hive 使用 Sqoop 工具从 SQL Server 数据库导入数据到 Hive 表中。这里使用了 --query 参数来指定要导入的数据,以及一些其他参数来定义字段分隔符和行分隔符等。

  7. 执行脚本

    • 首先检查 Impala 表是否存在,如果不存在则创建。
    • 清空 Impala 表的数据。
    • 导入 SQL Server 数据库的数据到 Hive 表。
    • 刷新 Impala 表的元数据,以确保数据一致性。

总结

通过本教程的学习,您已经了解了如何使用Sqoop和Shell脚本进行数据迁移的详细步骤和技巧。从基本的Sqoop命令到复杂的Shell脚本编写,每一步都旨在帮助您更高效地管理和迁移数据。希望这些知识能助您在数据处理的道路上更进一步,实现数据价值的最大化。

希望本教程对您有所帮助!如有任何疑问或问题,请随时在评论区留言。感谢阅读!

参考连接:

  • Sqoop用户指南

这篇关于Sqoop与Shell脚本数据迁移实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020160

相关文章

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片