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

相关文章

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1