mongodb数据同步到hive

背景

用户需求: 需要将 mongodb 的数据同步到 hive 表,共 2 亿+条数据,总数据量约 30G

查阅一些博客后,大致同步方法有以下几种

  • 手动+离线

对于比较小的数据,可以先通过 mongoexport 将数据导出到本地 json 文件,再将 json 直接上传到 hdfs,创建 hive 表关联到这个文件即可

这种方式非常简单直接,但需要两次 读取到写入 的过程,而且如果 mongodb 中的数据很大,需要先导到本地的方式将会导致本地磁盘占用升高,不是很适合

参考: Mongoexport同步数据到Hive

  • 工具+离线

通过 datax / seatunnel 之类的数据同步服务,数据在内存中完成同步

datax-mongodbreader

datax-hdfswriter

seatunnel-connector-mongo

seatunnel-connector-hive

  • 实时

mongodb 在 3.6 版本支持了 change streamer,支持在客户端监听数据变更,实现实时更新

但这个同步逻辑需要依赖单独的程序去完成,这次用户需求也只要一次性的全量更新,不涉及增量更新,因此这一块就不具体看了

MongoDB Change Stream之一——上手及初体验原创

通过 datax 同步数据

任务定义

json 配置文件参考官方文档进行适配即可

注意: hdfswriter 的 defaultFS 如果指定的是集群地址,比如 hdfs://cluster_name,可能会遇到解析不了的问题,需要把 hdfs 的配置文件打入到 hdfswriter-0.0.1-SNAPSHOT.jar 包中去

参考issue

jar 打包指令参考

datax 任务定义:

{"job": {"content": [{"reader": {"name": "mongodbreader","parameter": {"address": ["host1:27017","host2:27017","host3:27017"],"collectionName": "collection_name","column": [{"index": 0,"name": "id","type": "string"},...],"dbName": "db","userName": "user","userPassword": "password"}},"writer": {"name": "hdfswriter","parameter": {"column": [{"name": "id","type": "string"}...],"compress": "SNAPPY","defaultFS": "hdfs://cluster_name","fieldDelimiter": "\u0001","fileName": "$table","fileType": "orc","path": "/user/hive/warehouse/db_name.db/table_name", // hdfs 路径需要先创建好"writeMode": "truncate"}}}],"setting": {"speed": {"channel": "2" // 任务并行度,可根据实际情况调大}}}
}

效果

启动任务

python bin/datax.py tmp/mongo_to_hive.json

等待同步完成后,查看 hdfs 对应表路径的数据,可以看到生成的 txt 文件

然后创建 hive 表关联这个路径即可

create external table table_name
(id string,...
)
COMMENT '同步表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS ORC -- 和 datax 任务中的 fileType 对应
LOCATION '/user/hive/warehouse/db_name.db/table_name'; -- 和 path 对应

通过 seatunnel 同步数据

环境准备

不同于 datax,seatunnel 的安装过程稍微复杂点,而且和 hive 相关的ja包需要手动导入,因此在这里特别说明

# 下载 seatunnel 后,需要先安装插件(即各个connector)
sh bin/install-plugin.sh 2.3.3# 下载 hive 2.3.9 版本 (主要是为了拿到 jar 包,也可以从 maven 仓库单独下载下面的每个 jar 包)
wget https://downloads.apache.org/hive/hive-2.3.9/apache-hive-2.3.9-bin.tar.gz# 解压后,把以下 jar 包拷贝到 seatunnel 的 lib 下seatunnel_home=/opt/modules/seatunnelcd /opt/modules/apache-hive-2.3.9-bin/libcp hive-metastore-2.3.9.jar ${seatunnel_home}/libcp hive-common-2.3.9.jar ${seatunnel_home}/libcp hive-exec-2.3.9.jar ${seatunnel_home}/libcp libthrift-0.9.3.jar ${seatunnel_home}/libcp libfb303-0.9.3.jar ${seatunnel_home}/lib

任务定义

配置示例如下:

env {execution.parallelism = 1job.mode = "BATCH"
}source {MongoDB {uri = "mongodb://user:password@host1,host2,host3"database = "db"collection = "collection"schema = {fields {id = stringcreate_time = stringupdate_time = stringname = string...}}}}sink {Hive {table_name = "db.table"metastore_uri = "thrift://metastore_host:9083"hdfs_site_path = "/etc/hadoop/conf/hdfs-site.xml" # 和 datax 的问题类似,添加 hdfs 配置用于解析 hdfs 集群地址}
}

效果

执行任务:

./bin/seatunnel.sh --config mongo_to_hive.conf -e local"

目前还存在 空值无法转换的问题,报错: Unable to convert to from nullable value null,需要等待社区解决

相关 issue: [Bug] [MongoDB-CDC] 数据中有字段值为 Null 直接异常. #5340

和 datax 的对比

  • 配置: 都是 hive reader 和 mongo writer 的配置思路

  • 写入方式: 两者都是把数据写入到 hdfs 路径,hive 表需要用户自己创建

seatunnel 的 hive connector 也是先从 hive 中读取 location,拿到 hdfs 的路径,参考: HiveSinkAggregatedCommitter 继承了 FileSinkAggregatedCommitter, HiveSink 继承了 BaseHdfsFileSink

  • 运行环境: datax 只能本地运行,seatunnel 还支持跑在 flink 、spark 上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/137558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仿mudou库one thread one loop式并发服务器

目录 1.实现目标 2.HTTP服务器 实现高性能服务器-Reactor模型 模块划分 SERVER模块: HTTP协议模块: 3.项目中的子功能 秒级定时任务实现 时间轮实现 正则库的简单使用 通⽤类型any类型的实现 4.SERVER服务器实现 日志宏的封装 缓冲区Buffer…

简单漂亮的登录页面

效果图 说明 开发环境&#xff1a;vue3&#xff0c;sass 代码 <template><div class"container"><div class"card-container"><div class"card-left"><span><h1>Dashboard</h1><p>Lorem ip…

HTTP 协议详解-上(Fiddler 抓包演示)

文章目录 HTTP 协议HTTP 协议的工作过程HTTP 请求 (Request)认识URL关于 URL encode认识 "方法" (method)GET 方法POST 方法其他方法请求 "报头" (header)请求 "正文" (body) HTTP 响应详解状态码响应 "报头" (header) HTTP 协议 HTT…

【编程语言发展史】Unity开发语言的历史发展

Unity开发前期版本时&#xff0c;使用的是一种名为UnityScript的类似JavaScript的语言。然而&#xff0c;随着时间的推移&#xff0c;开发者社区大多数人都倾向于使用C#进行开发&#xff0c;Unity决定将重点放在C#上&#xff0c;因为C#具有更强大的生态系统、更好的性能和更广泛…

Spring Boot 3.0正式发布及新特性解读

目录 【1】Spring Boot 3.0正式发布及新特性依赖调整升级的关键变更支持 GraalVM 原生镜像 Spring Boot 最新支持版本Spring Boo 版本版本 3.1.5前置系统清单三方包升级 Ref 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; 【1】Spring Boo…

data对象内新增属性,console.log()可以打印出来,不重新渲染

原因&#xff1a;受 ES5 的限制&#xff0c;Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter&#xff0c;所以属性必须在 data 对象上才能让 Vue.js 转换它&#xff0c;才能让它是响应的&#xff1b; data(){newTitle:{title:’…

月销破30万辆后,比亚迪整了波大的

最近乘联会公布了 2023 年 10 月新能源乘用车厂商销量榜单。 其中最为亮眼犹如鹤立鸡群的榜首&#xff0c;没错依然是我们熟悉的那个迪子&#xff01; 单月销量超 30 万辆&#xff0c;相较去年同期暴涨 38.4%&#xff0c;创下了比亚迪有史以来新高。 同时也成为了国内首个月销…

element-ui的form校验失败

数值与字符串混淆 数值 <el-input type"number" v-model.number"form.averageFruitWeight" placeholder"请输入平均单果重"/>字符串 fruitDevelopmentStage: [{pattern: ^[-\\]?([0-9]\\.?)?[0-9]$, message: 输入必须为数字, trigge…

AD教程 (十一)封装的统一管理

AD教程 (十一)封装的统一管理 PCB封装添加 一个一个手动添加&#xff0c;效率太低&#xff0c;不建议使用 使用封装管理器快速添加&#xff0c;根据BOM表&#xff08;元器件清单&#xff09;&#xff0c;修改PCB封装 点击工具&#xff0c;选择封装管理器&#xff0c;进入封装…

耳机放大器的作用?HT97180 耳机放大器的作用又是什么?

耳机放大器是一种用于增强耳机音频信号的设备&#xff0c;它在提供更大音量、更好音质方面起到重要作用。它可以为耳机用户提供更好的音频体验&#xff0c;特别是对于高阻抗耳机和音频爱好者来说非常有用。 而HT97180为差分输入、可直接输出的耳机放大器。4.2V供电时&#xff0…

游戏缺失d3dx9_39.dll的5个修复方法,深度解析d3dx9_39.dll文件的作用

在当今的数字化时代&#xff0c;电子游戏已经成为了人们休闲娱乐的重要方式之一。然而&#xff0c;对于许多玩家来说&#xff0c;他们在享受游戏带来的乐趣的同时&#xff0c;也可能会遇到各种各样的问题&#xff0c;其中最常见的就是游戏无法正常运行。而这些问题中&#xff0…

【学术综述】-如何写出一篇好综述-写好综述要注意的问题

文章目录 1.前置1.1 SSD 的结构1.2 FTL的架构和作用 2 动机-why&#xff1f;3 做了什么【做了哪些方面的survey】&#xff1f;4 背景知识【上下文】5 研究的问题6 每个问题对应的解决方案 从昨天晚上【2023.11.09 22:00】到今天22:29的&#xff0c;花了一天的时间在读这篇surve…

Netty入门指南之NIO 网络编程

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言基础扫…

找不到模块“./App.vue”或其相应的类型声明。ts(2307)

先看报错信息&#xff1a; 这是我们初始创建是就自带的&#xff0c;怎么会错误呢&#xff0c;实际上是因为未定义 .vue文件的类型&#xff0c;导致 ts 无法解析其类型&#xff0c;在env.d.ts中定义后即可解决。 对于我们初学者来说&#xff0c;刚刚按照视频来创建的项目怎么啥…

【Delphi】Android 开发HTTP请求出错解决方案

目录 一、故障现象 二、原因及解决方案 一、故障现象 在android内建的WebBrowser浏览器中通过http访问一个网站&#xff08;注意不是https&#xff09;&#xff0c;出现如下错误提示&#xff1a; 在使用ntfy的时候&#xff0c;访问http定义的服务器地址&#xff08;注意不是…

【ATTCK】MITRE ATTCK 设计与哲学

MITRE ATT&CK™:设计与哲学 来源&#xff1a;MITRE ATT&CK™: Design and Philosophy 摘要 MITRE ATT&CK知识库描述了网络对手的行为&#xff0c;并为攻击和防御提供了一个通用的分类。它已成为跨许多网络安全领域的一个有用工具&#xff0c;用于传递威胁情报&…

SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩

redis整合redis的注解式开发及应用场景redis的击穿穿透雪崩 1.redis整合 mysql整合 pom配置&#xff1b; String-fmybatis.xml --> mybatis.cfg.xml: 包扫描&#xff1b; 注册了一个jdbc.properties(url/password/username/...)&#xff1b; 配置数据源&#xff08;数据库连…

docker部署redis6

前言&#xff1a;在离线服务器上&#xff08;无联网&#xff09;&#xff0c;部署redis的方式&#xff0c;采用docker是比较方便的。下面将描述如何使用docker部署单机版redis 环境&#xff1a;centos 7 redis&#xff1a;6.2.14 docker&#xff1a;20.10.9 1.下载 redis 镜像…

卡牌游戏类型定制开发微信卡牌小程序游戏

卡牌类型的游戏开发具有一些独特的特点和挑战&#xff0c;以下是一些主要的特点&#xff1a; 卡牌设计和平衡&#xff1a;卡牌游戏的核心是卡牌设计和平衡。开发团队需要设计各种卡牌&#xff0c;确保它们在游戏中相互平衡&#xff0c;以便提供有趣的游戏体验。卡牌的特性、效…

服务器数据恢复—误还原虚拟机快照后如何恢复之前的数据?

服务器数据恢复环境&#xff1a; vmfs文件系统&#xff0c;存放的是SqlServer数据库及其他办公文件。 服务器故障&#xff1a; 工作人员误操作还原快照&#xff0c;导致了SqlServer数据库数据丢失。 服务器数据恢复过程&#xff1a; 1、拿到故障服务器的所有磁盘后&#xff0c…