本文为您整理应用MaxCompute Lightning过程中的常见问题。

MaxCompute Lightning查询连接数是否有限制?

单个MaxCompute项目的Lightning查询并发数上限为20。

如何使用Lightning,有WEB控制台可以使用吗?

Lightning没有提供WEB控制台,可以通过SQL客户端、BI工具等连接Lightning的JDBC/ODBC接口,即可访问对应的MaxCompute项目。

还没有建表的情况下,能够使用MaxCompute Lightning查询什么数据?

使用阿里云账号,通过MaxCompute Lightning能够访问指定MaxCompute项目中的数据表。

如果项目中没有数据表,您需要通过DataWorks或者MaxCompute客户端,在MaxCompute项目中创建表并加载、加工数据。再通过MaxCompute Lightning连接到该项目,就可以对项目内有读权限的数据表进行查询。

MaxCompute Lightning是否限制查询的数据量?查询多大规模的数据性能较好?

目前每次查询对单表的扫描数据量限制为1TB,数据量越小查询性能越好。
说明 建议不要扫描超过100GB的表数据。超过100GB的表数据虽然可查询,但查询性能会随数据规模增长逐渐下降。如果需要扫描量超过100GB的数据表,建议您考虑使用MaxCompute SQL。

使用BI工具,通过拖拽方式选择一张分区表进行分析时,提示报错为AXF Exception,怎么处理?

详细报错信息如下。
ERROR: AXF Exception: specified partitions count in odps table: <project_name.table_name> is: xxx, exceeds the limitation of xxx, please add stricter partition filter

MaxCompute Lightning为保障查询性能,限制了分区表可以查询的分区数。一次查询单表所扫描的最大分区数不能超过1024个。由于部分BI工具使用拖拽方式选择表直接进行分析,不能BI前端指定分区条件,导致请求扫描的分区数超限制、触发了Lightning限制而提示报错。

建议您先对查询的数据表进行加工处理,处理为非分区表或分区数小于1024的表再进行分析。

连接时提示创建数据连接失败ERROR: SSL required,怎么处理?

MaxCompute Lightning要求SSL连接服务,需要第三方客户端指定以SSL方式连接。如果使用第三方客户端工具没有SSL连接相关选项,可以在JDBC URL连接串中增加SSL参数,例如jdbc:postgresql://lightning.cn-shanghai.maxcompute.aliyun.com:443/myproject?ssl=true

使用Workbench/J客户端查询时提示报错当前事务被中止,怎么处理?

  • 问题现象:详细报错信息如下。
    rror:current transaction is aborted,commands ignored until end of transaction block.
  • 解决办法:Workbench/J客户端请勾选Autocommit选项。

请求连接时返回提示报错,是什么原因?

  • 问题现象:详细报错信息如下。
    ERROR: Failed to login the project: <project name>. Lightning service has not been activated for your project, please contact the administrator
  • 问题原因:MaxCompute项目还没有开通Lightning服务,需要申请开通后使用。

MaxCompute项目名称大小写敏感吗?

Lightning服务连接时,MaxCompute项目名称大小写敏感。连接时的项目名称请全部使用小写。

是否推荐直接通过Lightning拉取全量明细数据?

不推荐。通过SQL客户端工具、BI工具对数据量大的表执行全量查询(SELECT * FROM table;)时,大量数据需要从服务端抽取到客户端,从而导致查询时间延长。

因此建议您尽量在服务端对明细数据进行分析,返回过滤后的较少量的数据至客户端,以降低端到端的查询时延,减少或避免直接通过Lightning拉取明细数据。

Lightning如何处理数字开头的字段?

MaxCompute支持以数字开头的字段,例如1_day_active_users。Lightning使用的Postgres的SQL语法,不支持数字开头的字段。遇到MaxCompute中数字开头的字段时,在Lightning的SQL查询中可以对该字段增加双引号进行查询。例如:select bizdate,"1_day_active_users","7_day_active_users" from t_active_users;

在应用程序中使用JDBC连接MaxCompute Lightning服务时建议如何配置?

在应用程序中使用JDBC连接MaxCompute Lightning服务时,建议配置prepareThreshold=0autocommit=True

是否可以通过Psycopg2来连接访问Lightning?

可以,请参考如下示例。
#!/usr/bin/env python
# coding=utf-8

import psycopg2
import sys

def query_lightning(lightning_conf, sql):
    """Query data through Lightning by sql

    Args:
        lightning_conf: a map contains settings of 'dbname', 'user', 'password', 'host', 'port'
        sql:  query submit to Lightning

    Returns:
        result: the query result in format of list of rows
    """
    result = None
    conn = None
    conn_str = None
    try:
        conn_str = ("dbname={dbname} "
                    "user={user} "
                    "password={password} "
                    "host={host} "
                    "port={port}").format(**lightning_conf)
    except Exception, e:
        print >> sys.stderr, ("Invalid Lightning' configuration "
                              "{}".format(e))
        sys.exit(1)

    try:
        conn = psycopg2.connect(conn_str)
        conn.set_session(autocommit=True)  # This will disable transaction
        # started with keyword BEGIN,
        # which is currently not
        # supported by Lightning' public service

        cur = conn.cursor()
        # execute Lightning' query
        cur.execute(sql)
        # get result
        result = cur.fetchall()
    except Exception, e:
        print >> sys.stderr, ("Failed to query data through "
                              "Lightning: {}".format(e))
    finally:
        if conn:
            conn.close()

    return result

if __name__ == "__main__":
    # step1. setup configuration
    lightning_conf = {
        "dbname": "project",
        "user": "accessId",  # AccessId
        "password": "accessKey",  # AccessKey
        "host": "lightning.cn-shanghai.maxcompute.aliyun-inc.com", # Lightning Endpoint
        "port": 443
    }

    # step2. issue a query
    result = query_lightning(lightning_conf, "select count(1) from dual")
    # step3. print result
    if result:
        for i in xrange(0, len(result)):
            print
            "Got %d row from Lightning:%s" % (i + 1, result[i])

使用MaxCompute Lightning有哪些性能优化建议?

  • 查询分区表时,指定分区减少扫描的数据量。
  • 查询中只对需要列进行查询,减少对不必要列的查询。例如select * from table; 修改为 select a,b from table;
  • 对于数据量较大的表,查询以等值查询(例如select id,value from table where id=123;)为主要查询场景时,建议可以创建或者将原表修改为Hash Clustering表,利用CLUSTERED字段加速该字段的过滤效率。
  • 对于数据量不大但查询时间较长的表,需要判断是否存在数据倾斜问题。可以通过ANALYZE EXPLAIN方式查看执行计划,获取诊断信息。

运行时报错ConnectionException,是什么原因?

  • 问题现象:运行时报错如下。
    ConnectionException: HikariPool-2 - Connection is not available, request timed out after 10018ms
  • 问题原因:报错为网络连接超时,可能是网络波动导致的。