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