天天看點

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