数据回流upsert模式

背景

现有的数据回流方案中,为避免数据重复,有一些前置操作(delete/truncate)。在回流之前执行这些操作会对查询造成一些瞬时影响。

针对这种场景我们需要做一些优化(update or insert)。

适用场景

  • 准实时项目回流(数据回流频繁)

  • 数据累加型计算

  • 无需删除之前计算结果

要求

数据加工表中包含唯一业务字段

实现方式

原回流方式

#删除目标表当天数据,避免重复回流

delete_sql="truncate table $target_table;"

 echo "delete_sql=$delete_sql"

 sqoop eval --connect jdbc:mysql://$HOSTNAME:$PORT/$DBNAME --username $username --password $password -e "$delete_sql" &&

 #导出到MYSQL

 sqoop export --connect jdbc:mysql://$HOSTNAME:$PORT/$DBNAME?tinyInt1isBit=false --username $username --password $password --table $target_table  --fields-terminated-by '\001' --input-null-string '\\N' --input-null-non-string '\\N' --export-dir $hdfs_temp_dir &&

改造后

#导出到MYSQL

 sqoop export -Dsqoop.export.statements.per.transaction=200 \

 --connect jdbc:mysql://$HOSTNAME:$PORT/$DBNAME?tinyInt1isBit=false \

--username $username --password $password --table $target_table -m 1 --fields-terminated-by '\001' --input-null-string '\\N' \

--input-null-non-string '\\N' --export-dir $hdfs_temp_dir --update-key server_id --update-mode allowinsert &&

参数说明:

--update-key:设置更新唯一字段,可以设置多个,用逗号隔开
--update-mode:allowinsert允许插入

注:key需要添加唯一索引 ,如果是多个字段,添加组合唯一索引。

ps: 解决批量更新死锁问题,-m 1,设置回流并发度为1

异常信息 :

Caused by: java.sql.BatchUpdateException: Deadlock found when trying to get lock; try restarting transaction

 同时可设置以下任一参数,增加回流QPS。

-指定每个insert语句中插入的记录条数,默认值100
-Dsqoop.export.records.per.statement=100
--指定每个事务中插入的记录条数,默认值100
-Dsqoop.export.statements.per.transaction=100

# 2021.06.29 更新

不指定字段时,发现ID等字段也会更新,通过以下参数屏蔽不需要更新的字段

--columns: 指定mysql需要更新的字段,屏蔽如自增id,edit_time等不需要更新的字段

### 数据回流的方法与解决方案 数据回流是指将经过处理、分析后的数据重新存储到目标数据库或OLAP引擎中,以便后续查询或通过API服务于具体业务需求[^1]。这一过程通常涉及以下几个方面: #### 1. **数据回流的目标系统** 数据回流的主要目标是将加工完成的数据存入适合的存储系统中。这些系统可能包括但不限于关系型数据库(如MySQL、PostgreSQL)、NoSQL数据库(如MongoDB、Cassandra),以及专门用于高性能数据分析的OLAP引擎(如ClickHouse、Doris)。选择合适的存储系统取决于具体的业务场景和性能要求。 #### 2. **数据写入方式** 为了实现高效的数据回流,可以选择多种写入方式: - **批量加载**:适用于大规模静态数据集的导入操作。这种方法通常利用ETL工具(Extract, Transform, Load)来执行周期性的全量或增量数据迁移。 - **实时写入**:针对动态变化频繁的数据源,采用消息队列(Kafka、RabbitMQ等)配合流计算框架(Flink、Spark Streaming等)实现实时更新。 #### 3. **非结构化/半结构化数据的特殊处理** 当面对非结构化或半结构化的复杂数据类型时,传统的表格式存储难以满足需求。此时可借助文档解析技术和嵌入式表示学习方法(Embedding Vectorization),先将其转化为易于管理的形式后再实施索引建立及检索优化工作[^2]。例如,图片、音频文件可通过深度神经网络提取特征向量并保存至专用向量搜索引擎内供快速查找匹配之用。 #### 4. **接口封装和服务暴露** 最终阶段还需考虑如何便捷地让前端应用或其他微服务调用已准备好的结果集合。一般做法是设计RESTful风格Web Service API端点,并结合身份验证机制保障安全性的同时简化外部访问流程。 ```python import requests def call_data_service(api_url, params=None): response = requests.get(url=api_url, params=params) if response.status_code == 200: return response.json() else: raise Exception(f"Error calling service: {response.text}") ``` 上述代码片段展示了一个简单的函数用来请求远程数据服务API获取所需信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值