天天看点

MaxCompute的Lighting接口

一、简介

MaxCompute Lightning是MaxCompute产品的交互式查询服务,支持以PostgreSQL协议及语法连接访问Maxcompute项目。

正常情况下,我们使用MaxCompute表的数据是需要回流过程的,将数据回流到数据库中,然后查询数据库获取数据。然而在某些查询频率不高,查询周期不定的场景下,这种回流的方式其实不是特别适合。于是就有了交互式查询服务Lightning。

二、Lighting特点

2.1 兼容PostgreSQL语法

某种程度上,Lighting提供的就是类PostgreSQL的JDBC/ODBC接口,通过Lighting我们可以方便的像调用PostgreSQL那般调用MaxCompute的数据。

2.2 查询性能快

在小数据集下、并发场景下性能表现更好,比直接使用Maxcompute SQL走MapReduce流程快得多,接近直接调用数据库的速度。

注:按照官方工程师的说法,建议在单表1T数据量以内使用,在100GB内性能有很大提升,之后根据性能表现考虑使用Maxcompute SQL。

2.3 方便的权限管理

作为MaxCompute产品内的服务,通过Lighting接口调用数据的权限即你使用账号的权限范围。

2.4 没有维护成本,无需配置

只需为每次查询所实际处理的数据量付费,不查询时不产生费用。

三、jdbc配置

Maxcompute Lightning查询引擎基于PostgreSQL 8.2,当前仅支持对已有MaxCompute表进行SELECT查询。JDBC URL命名方式如下:

jdbc:postgresql://endpoint:port/database
参数 取值 说明
endpoint 所在区域不同网络环境下的Lightning访问域名 详情请参见访问域名,例如通过外网访问上海Region的服务使用lightning.cn-shanghai.maxcompute.aliyun.com
port 443
database 填写MaxCompute的项目名称
user 访问用户的Access Key ID
password 访问用户的Access Key Secret
ssl true MaxCompute Lightning服务端默认开启SSL服务,客户端需要使用SSL进行连接。
prepareThreshold 可选。需要使用JDBC PrepareStatement功能时, 建议设置prepareThreshold=0。

四、使用Python封装

为了方便使用,用Python封装该jdbc,暴露出一个连接方便使用。

在工程的合适位置新建一个

pylightning.py

,内容如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import psycopg2

class MCLightning:
    def __init__(self,db):
        self.endpoint = 'lightning.cn-shanghai.maxcompute.aliyun.com'
        self.user = 'LTAIlgIzdyWFxxxx'   #使用你申请到的账号的id和key,此处已脱敏
        self.password = 'A5GPxUYB477u5lf8i2PTltqEdvxxxx'
        self.port = '443'
        self.db = db

    def getLightningConn(self):
        conn = psycopg2.connect(host = self.endpoint,user = self.user,password = self.password,port = self.port, database = self.db)
        return conn

    #execute
    def execute(self, sql):
        try:
            conn = self.getLightningConn()
            cursor = conn.cursor()
            cursor.execute(sql)
            result = cursor.fetchall()
            cursor.close()
            conn.close()
            return result
        except Exception, e:
            raise Exception(e)

if '__main__' == __name__:
    print('请import使用')
           

使用时就很简单啦:

from src.common import pylightning

s_sql = 'select xxx from table where pt=xxx'
conn = pylightning.MCLightning('project') ##project为你拥有的odps项目空间
results = conn.execute(s_sql)

for r in results:
    do something