一种读取亿级 doris 数据库的方法 | 京东云技术团队

[复制链接]
作者: opgozabeiyuu | 时间: 2024-5-6 05:18:43 | 其他|
0 159

4967

主题

4967

帖子

1万

积分

博士后

Rank: 11Rank: 11Rank: 11Rank: 11

积分
14903
发表于 2024-5-6 05:18:43| 显示全部楼层 |阅读模式
      
  • 工作中,常常需要将线上 doris 同步至集市。读取 doris 数据同读取常规 mysql 基本相同。如果数据行小于千万,比较简单的方式直接单节点连接、读取和存储。Python 示例如下:

def get_data(sql,host='',port=2000,user='',password='',db=''):
# 支持doris
import pymysql
connect = pymysql.connect(host=host,port=port,user=user,password=password,db=db,charset='utf8')
cursor = connect.cursor()
cursor.execute('SET query_timeout = 216000;') #单位秒
cursor.execute(sql)
result = cursor.fetchall()
for row in result:
pass # 存储格式可以自行控制
cursor.close()
connect.close()
return result
      
  • 如果数据量比较大,超过千万,甚至过亿,单节点读取会遇到超时以及时效过低的问题。可以使用 spark.read.jdbc 分布式多节点并发读取。spark 读取支持两种方式。
主要参数介绍:
read.jdbc(url=url,table=remote_table,column='item_sku_id',numPartitions=50,lowerBound=lowerBound, upperBound=upperBound,properties=prop)
url:格式如 'jdbc:mysql://**.jd.com:2000 / 数据库名?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai'
table:可以是表名,也可以是查询 sql (也即支持条件查询),如果是 sql,格式如 "(SELECT count (*) sku FROM rule_price_result where dt='2023-05-10') AS tmp"
numPartitions:控制并发节点个数
lowerBound+upperBound 和 properties 二选一,控制每个节点读取的数据范围。
lowerBound+upperBound 方式:指定读取最低和最高值,spark 会结合分区个数和最低最高边界机械做分割。
如果数据分布有倾斜,可以通过 predicates 列表自行控制范围。

  作者:京东零售 赵奇猛
  来源:京东云开发者社区


来源:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 返回顶部