聊聊一種讀取億級(jí)Doris數(shù)據(jù)庫(kù)的方法
- 工作中,常常需要將線上doris同步至集市。讀取doris數(shù)據(jù)同讀取常規(guī)mysql基本相同。如果數(shù)據(jù)行小于千萬,比較簡(jiǎn)單的方式直接單節(jié)點(diǎn)連接、讀取和存儲(chǔ)。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 # 存儲(chǔ)格式可以自行控制
cursor.close()
connect.close()
return result
- 如果數(shù)據(jù)量比較大,超過千萬,甚至過億,單節(jié)點(diǎn)讀取會(huì)遇到超時(shí)以及時(shí)效過低的問題。可以使用spark.read.jdbc分布式多節(jié)點(diǎn)并發(fā)讀取。spark讀取支持兩種方式。
主要參數(shù)介紹:
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/數(shù)據(jù)庫(kù)名?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:控制并發(fā)節(jié)點(diǎn)個(gè)數(shù)
lowerBound+upperBound和properties二選一,控制每個(gè)節(jié)點(diǎn)讀取的數(shù)據(jù)范圍。
lowerBound+upperBound方式:指定讀取最低和最高值,spark會(huì)結(jié)合分區(qū)個(gè)數(shù)和最低最高邊界機(jī)械做分割。
如果數(shù)據(jù)分布有傾斜,可以通過predicates列表自行控制范圍。
作者:京東零售 趙奇猛
來源:京東云開發(fā)者社區(qū)