• 基础使用指南
    • 1. 创建用户
      • 1.1 Root用户登录与密码修改
      • 1.2 创建cluster (可选,如果需要使用palo的多租户功能)
      • 1.3 创建新用户
        • 1.3.1 使用多租户

    Palo采用mysql协议进行通信,用户可通过mysql client或者JDBC连接到Palo集群。选择mysql client版本时建议采用5.1之后的版本,因为5.1之前不能支持长度超过16个字符的用户名。本文以mysql client为例,通过一个完整的流程向用户展示Palo的基本使用方法。

    基础使用指南

    1. 创建用户

    1.1 Root用户登录与密码修改

    Palo内置root用户,密码默认为空,启动完Palo程序之后,可以通过root用户连接到Palo集群。 假如mysql客户端和Palo FE程序部署在同一台机器,使用默认端口,下面命令即可登录Palo。

    1. mysql -h 127.0.0.1 -P9030 -uroot

    修改root密码

    1. set password for 'root' = PASSWORD('root');
    1.2 创建cluster (可选,如果需要使用palo的多租户功能)

    如果需要使用多租户功能,则在部署的时候需要按照安装文档3.2节中提示的方法添加be。在多租户模式下,用户以及相关的数据库都在cluster之下。修改完root用户密码之后,紧接着需要创建cluster,创建cluster时会为cluster创建一个superuser用户,创建cluster的命令如下](https://github.com/baidu/palo/blob/master/docs/admin_guide/install.md)3.2节中提示的方法添加be。在多租户模式下,用户以及相关的数据库都在cluster之下。修改完root用户密码之后,紧接着需要创建cluster,创建cluster时会为cluster创建一个superuser用户,创建cluster的命令如下):

    1. CREATE CLUSTER example_cluster PROPERTIES("instance_num"="1") IDENTIFIED BY 'superuser';

    上述命令创建了一个example_cluster的cluster,密码为superuser的superuser用户,properties中的instance_num表示这个cluster运行在一个BE节点之上。

    此时可使用root用户登录Palo,并进入example_cluster。

    1. mysql -h 127.0.0.1 -P9030 -uroot -proot
    2. enter example_cluster;
    1.3 创建新用户

    如果使用多租户则按照1.3.1,没使用则按照1.3.2。

    1.3.1 使用多租户

    进入到指定cluster之后,可以在里面创建新的用户。

    1. create user 'test' identified by 'test';

    后续登录时就可以通过下列连接命令登录到指定cluster

    1. mysql -h FE_HOST -P QUERY_PORT -uUSERNAME@CLUSTER_NAME -pPASSWORD
    • FE_HOST: 部署FE的机器。

    • QUERY_PORT: 在fe.conf中进行配置,默认配置为9030。

    • USERNAME: 用户名。

    • CLUSTER_NAME: 创建的cluster名称。

    • PASSWORD: 创建用户时指定的密码。

    使用root登录Palo集群,并进入example_cluster。

    1. mysql -h 127.0.0.1 -P9030 -uroot@example_cluster -proot

    当然,root账户依然可以采用先登录Palo集群,后enter到指定cluster的方式;而其他用户登录必须显示指名cluster的名称。

    使用superuser登录Palo集群,并进入example_cluster。

    1. mysql -h 127.0.0.1 -P9030 -usuperuser@example_cluster -psuperuser

    使用test登录Palo集群,并进入example_cluster。

    1. mysql -h 127.0.0.1 -P9030 -utest@example_cluster -ptest
    2. ====== 1.3.2 不使用多租户
    3. 通过下面的命令创建一个普通用户。

    create user 'test' identified by 'test';

    1. 也可以创建一个管理员superuser用户,指定密码的方式如1.1节描述。

    create user 'test' superuser;

    1. 后续登录时就可以通过下列连接命令登录。

    mysql -h FE_HOST -P QUERY_PORT -uUSERNAME -pPASSWORD

    1. - FE_HOST: 部署FE的机器。
    2. - QUERY_PORT: fe.conf中进行配置,默认配置为9030
    3. - USERNAME: 用户名。
    4. - PASSWORD: 创建用户时指定的密码。
    5. 使用root登录Palo集群。

    mysql -h 127.0.0.1 -P9030 -uroot -proot

    1. 使用test登录Palo集群。

    mysql -h 127.0.0.1 -P9030 -utest -ptest

    1. === 2 数据表的创建与数据导入
    2. ===== 2.1 创建数据库
    3. Palo中只有root账户和superuser账户有权限建立数据库,使用rootsuperuser用户登录,建立example_db数据库:
    4. CREATE DATABASE example_db;
    5. - 所有命令都可以使用'HELP your_command'查看到详细的中文帮助
    6. - 如果不清楚命令的全名,可以使用'help 命令某一字段' 进行模糊查询。
    7. 如键入'HELP CREATE',可以匹配到CREATE DATABASE, CREATE TABLE, CREATE USER三个命令
    8. 数据库创建完成之后,可以通过show databases查看数据库信息。
    9. mysql> show databases;
    10. +--------------------+
    11. | Database |
    12. +--------------------+
    13. | test |
    14. | information_schema |
    15. +--------------------+
    16. 2 rows in set (0.00 sec)
    17. information_schema是为了兼容mysql协议而存在,实际中信息可能不是很准确,所以关于具体数据库的信息建议通过直接查询相应数据库而获得。
    18. ===== 2.2 账户授权
    19. example_db创建完成之后,可以通过root账户或者superuser账户将example_db读写权限授权给test账户, 授权之后采用test账户登录就可以操作example_db数据库了。

    grant all on example_db to test;

    1. ===== 2.3 建表
    2. 使用CREATE TABLE命令建立一个表(Table)。更多详细参数可以查看:
    3. HELP CREATE TABLE;
    4. 首先切换数据库:
    5. USE example_db;
    6. Palo支持支持单分区和复合分区两种建表方式。
    7. 在复合分区中:
    8. - 第一级称为Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间类型的列),并指定每个分区的取值范围。
    9. - 第二级称为Distribution,即分桶。用户可以指定某几个维度列(或不指定,即所有KEY列)以及桶数对数据进行HASH分布。
    10. 以下场景推荐使用复合分区
    11. - 有时间维度或类似带有有序值的维度:可以以这类维度列作为分区列。分区粒度可以根据导入频次、分区数据量等进行评估。
    12. - 历史数据删除需求:如有删除历史数据的需求(比如仅保留最近N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送DELETE语句进行数据删除。
    13. - 解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列。
    14. 用户也可以不使用复合分区,即使用单分区。则数据只做HASH分布。
    15. 下面以聚合模型为例,分别演示两种分区的建表语句。
    16. ===== 单分区
    17. 建立一个名字为table1的逻辑表。使用全hash分桶,分桶列为siteid,桶数为10
    18. 这个表的schema如下:
    19. - siteid:类型是INT4字节), 默认值为10
    20. - cidy_code:类型是SMALLINT2字节)
    21. - username:类型是VARCHAR, 最大长度为32, 默认值为空字符串
    22. - pv:类型是BIGINT8字节), 默认值是0; 这是一个指标列, Palo内部会对指标列做聚合操作, 这个列的聚合方法是求和(SUM
    23. 建表语句如下:

    CREATE TABLE table1 ( siteid INT DEFAULT '10', citycode SMALLINT, username VARCHAR(32) DEFAULT '', pv BIGINT SUM DEFAULT '0' ) AGGREGATE KEY(siteid, citycode, username) DISTRIBUTED BY HASH(siteid) BUCKETS 10 PROPERTIES("replication_num" = "1");

    1. ===== 复合分区
    2. 建立一个名字为table2的逻辑表。
    3. 这个表的 schema 如下:
    4. - event_day:类型是DATE,无默认值
    5. - siteid:类型是INT4字节), 默认值为10
    6. - cidy_code:类型是SMALLINT2字节)
    7. - username:类型是VARCHAR, 最大长度为32, 默认值为空字符串
    8. - pv:类型是BIGINT8字节), 默认值是0; 这是一个指标列, Palo 内部会对指标列做聚合操作, 这个列的聚合方法是求和(SUM
    9. 我们使用event_day列作为分区列,建立3个分区: p1, p2, p3
    10. - p1:范围为 [最小值, 2017-06-30)
    11. - p2:范围为 [2017-06-30, 2017-07-31)
    12. - p3:范围为 [2017-07-31, 2017-08-31)
    13. 每个分区使用siteid进行哈希分桶,桶数为10
    14. 建表语句如下:

    CREATE TABLE table2 ( event_day DATE, siteid INT DEFAULT '10', citycode SMALLINT, username VARCHAR(32) DEFAULT '', pv BIGINT SUM DEFAULT '0' ) AGGREGATE KEY(event_day, siteid, citycode, username) PARTITION BY RANGE(event_day) ( PARTITION p1 VALUES LESS THAN ('2017-06-30'), PARTITION p2 VALUES LESS THAN ('2017-07-31'), PARTITION p3 VALUES LESS THAN ('2017-08-31') ) DISTRIBUTED BY HASH(siteid) BUCKETS 10 PROPERTIES("replication_num" = "1");

    1. 表建完之后,可以查看example_db中表的信息:
    2. mysql> show tables;
    3. +----------------------+
    4. | Tables_in_example_db |
    5. +----------------------+
    6. | table1 |
    7. | table2 |
    8. +----------------------+
    9. 2 rows in set (0.01 sec)
    10. mysql> desc table1;
    11. +----------+-------------+------+-------+---------+-------+
    12. | Field | Type | Null | Key | Default | Extra |
    13. +----------+-------------+------+-------+---------+-------+
    14. | siteid | int(11) | Yes | true | 10 | |
    15. | citycode | smallint(6) | Yes | true | N/A | |
    16. | username | varchar(32) | Yes | true | | |
    17. | pv | bigint(20) | Yes | false | 0 | SUM |
    18. +----------+-------------+------+-------+---------+-------+
    19. 4 rows in set (0.00 sec)
    20. mysql> desc table2;
    21. +-----------+-------------+------+-------+---------+-------+
    22. | Field | Type | Null | Key | Default | Extra |
    23. +-----------+-------------+------+-------+---------+-------+
    24. | event_day | date | Yes | true | N/A | |
    25. | siteid | int(11) | Yes | true | 10 | |
    26. | citycode | smallint(6) | Yes | true | N/A | |
    27. | username | varchar(32) | Yes | true | | |
    28. | pv | bigint(20) | Yes | false | 0 | SUM |
    29. +-----------+-------------+------+-------+---------+-------+
    30. 5 rows in set (0.00 sec)
    31. **注意事项**:
    32. - 上述表通过设置replication_num建的都是单副本的表,Palo建议用户采用默认的3副本设置,以保证高可用。
    33. - 可以对复合分区表动态的增删分区。详见'HELP ALTER TABLE' PARTITION相关部分。
    34. - 数据导入可以导入指定的partition。详见'HELP LOAD'
    35. - 可以动态修改表的Schema
    36. - 可以对Table增加上卷表(Rollup)以提高查询性能,这部分可以参见高级使用指南关于Rollup的描述。
    37. ===== 2.4 导入数据
    38. Palo 支持两种数据导入方式:
    39. - 小批量导入:针对小批量数据的导入。详见'HELP MINI LOAD'
    40. - 批量导入:支持读取HDFS文件,部署不同broker可以读取不同版本HDFS数据。详见 'HELP LOAD'
    41. 我们这里分别提供两种导入方式的操作示例,为快速完成导入建议使用方采用小批量导入进行数据导入的测试。
    42. ===== 小批量导入
    43. 小批量导入: 主要用于让用户可以不依赖HDFS,导入本地目录文件。
    44. 小批量导入是Palo中唯一不使用mysql-client执行的命令,采用http协议完成通信。**小批量导入的端口是fe.conf中配置的http port。**
    45. 示例1:以 "table1_20170707"Label,使用本地文件table1_data导入table1表。
    46. curl --location-trusted -u test:test -T table1_data http://127.0.0.1:8030/api/example_db/table1/_load?label=table1_20170707
    47. 本地table1_data\t作为数据之间的分隔,具体内容如下:
    48. 1 1 'jim' 2
    49. 2 1 'grace' 2
    50. 3 2 'tom' 2
    51. 4 3 'bush' 3
    52. 5 3 'helen' 3
    53. 示例2: "table2_20170707"Label,使用本地文件table2_data导入table2表。
    54. curl --location-trusted -u test:test -T table2_data http://127.0.0.1:8030/api/example_db/table2/_load?label=table2_20170707
    55. 本地table2_data\t作为数据之间的分隔,具体内容如下:
    56. 2017-07-03 1 1 'jim' 2
    57. 2017-07-05 2 1 'grace' 2
    58. 2017-07-12 3 2 'tom' 2
    59. 2017-07-15 4 3 'bush' 3
    60. 2017-07-12 5 3 'helen' 3
    61. **注意事项**:
    62. - 小批量导入单批次导入的数据量限制为1GB,用户如果要导入大量数据,需要自己手动拆分成多个小于1GB的文件,分多个批次导入,或者采用批量导入。
    63. - 每一批导入数据都需要取一个LabelLabel 最好是一个和一批数据有关的字符串,方便阅读和管理。Palo基于Label 保证在一个Database内,同一批数据只可导入成功一次。失败任务的Label可以重用。
    64. - 该方式可以支持用户同时向多个表进行导入,并且多表间原子生效。用法请参阅:'HELP MULTI LOAD'
    65. - 导入label建议采用表名+时间的方式。
    66. - 如果使用了多租户上面的用户名的格式需要是test@example_cluster
    67. ===== 批量导入
    68. 示例:以 "table1_20170707"Label,使用HDFS上的文件导入table1

    LOAD LABEL table1_20170707 ( DATA INFILE("hdfs://your.namenode.host:port/dir/table1_data") INTO TABLE table1 ) WITH BROKER hdfs ("username"="hdfs_user", "password"="hdfs_password") PROPERTIES ( "timeout"="3600", "max_filter_ratio"="0.1" );

    1. 示例:以 "table2_20170707"Label,使用HDFS上的文件导入table2

    LOAD LABEL table1_20170707 ( DATA INFILE("hdfs://your.namenode.host:port/dir/table2_data") INTO TABLE table2 ) WITH BROKER hdfs ("username"="hdfs_user", "password"="hdfs_password") PROPERTIES ( "timeout"="3600", "max_filter_ratio"="0.1" );

    1. **注意事项**:
    2. - 该方式导入Palo的源数据文件必须在HDFS上,并且部署过broker
    3. - Label 的使用同小批量导入。
    4. - timeout表示本次导入的超时时间。
    5. - max_filter_ratio表示本次导入可以过滤的不符合规范的数据比例。
    6. - 更多参数的设置可以参考'HELP LOAD'
    7. ===== 2.5 查询导入任务的状态
    8. 导入任务是异步执行的。执行导入命令后,需要通过SHOW LOAD 命令查询导入任务的状态。
    9. 更多详细参数可以查看:
    10. HELP SHOW LOAD;
    11. 导入任务的主要信息为:
    12. - State:导入状态
    13. 1. **pending** 导入任务尚未被调度执行
    14. 2. **etl** 正在执行 ETL 计算, Palo 内部状态
    15. 3. **loading** 正在进行加载, Palo 内部状态
    16. 4. **finished** 导入任务成功完成
    17. 5. **cancelled** 导入任务被取消或者失败
    18. - Progress:导入进度
    19. - ETL:阶段的作业信息
    20. 1. **dpp.abnorm.ALL** 输入数据中被过滤掉的非法数据条数
    21. 2. **dpp.norm.ALL** 输入数据中合法的数据条数
    22. - TaskInfo:本次导入作业的参数信息
    23. - ErrorMsg:导入任务失败原因
    24. - CreateTime:任务创建时间
    25. - EtlStartTimeETL 开始时间
    26. - EtlFinishTimeETL 结束时间
    27. - LoadStartTime:加载开始时间
    28. - LoadFinishTime:加载结束时间
    29. - URL: 导入失败后的错误日志地址
    30. 示例1:显示当前数据库内以"table1_20170707"Label 的所有任务的状态的详细信息
    31. SHOW LOAD WHERE LABEL = "table1_20170707";
    32. 示例2:显示当前正在做ETL的所有任务的状态信息
    33. SHOW LOAD WHERE STATE = "ETL";
    34. 示例3:显示当前数据库内最后20个导入任务的状态
    35. SHOW LOAD ORDER BY CreateTime DESC LIMIT 20;
    36. **注意事项**:
    37. - 如果任务失败,[常见问题](./FAQ.md)中的导入任务失败原因。
    38. ===== 2.6 取消导入任务
    39. 使用CANCEL LOAD命令取消一个正在执行的导入任务。
    40. 被取消的任务数据不会导入Palo
    41. 已经处于cancelledfinished状态的任务无法被取消。
    42. 示例:取消当前数据库中Label"table1_20170707"的任务
    43. CANCEL LOAD WHERE LABEL = "table1_20170707";
    44. === 3 数据的查询
    45. ===== 3.1 简单查询
    46. 示例:
    47. mysql> select * from table1 limit 3;
    48. +--------+----------+----------+------+
    49. | siteid | citycode | username | pv |
    50. +--------+----------+----------+------+
    51. | 2 | 1 | 'grace' | 2 |
    52. | 5 | 3 | 'helen' | 3 |
    53. | 3 | 2 | 'tom' | 2 |
    54. +--------+----------+----------+------+
    55. ===== 3.2 order by查询
    56. 示例:
    57. mysql> select * from table1 order by citycode;
    58. +--------+----------+----------+------+
    59. | siteid | citycode | username | pv |
    60. +--------+----------+----------+------+
    61. | 2 | 1 | 'grace' | 2 |
    62. | 1 | 1 | 'jim' | 2 |
    63. | 3 | 2 | 'tom' | 2 |
    64. | 4 | 3 | 'bush' | 3 |
    65. | 5 | 3 | 'helen' | 3 |
    66. +--------+----------+----------+------+
    67. 5 rows in set (0.07 sec)
    68. **注意事项**:
    69. 鉴于order by的特殊性,order by后面建议一定要加入limit,如果未加 limit,系统当前默认会自动为你添加limit 65535
    70. ===== 3.3 带有join的查询
    71. 示例:
    72. mysql> select sum(table1.pv) from table1 join table2 where table1.siteid = table2.siteid;
    73. +--------------------+
    74. | sum(`table1`.`pv`) |
    75. +--------------------+
    76. | 12 |
    77. +--------------------+
    78. 1 row in set (0.20 sec)
    79. ===== 3.4 带有子查询的查询
    80. 示例:
    81. mysql> select sum(pv) from table2 where siteid in (select siteid from table1 where siteid > 2);
    82. +-----------+
    83. | sum(`pv`) |
    84. +-----------+
    85. | 8 |
    86. +-----------+
    87. 1 row in set (0.13 sec)
    88. == 高级使用指南
    89. === 1 数据表的创建和导入相关
    90. ===== 1.1 修改Schema
    91. 使用ALTER TABLE命令可以修改表的Schema,包括如下修改:
    92. * 增加列
    93. * 删除列
    94. * 修改列类型
    95. * 改变列顺序
    96. 以下举例说明。
    97. 原表table1Schema如下:
    98. +----------+-------------+------+-------+---------+-------+
    99. | Field | Type | Null | Key | Default | Extra |
    100. +----------+-------------+------+-------+---------+-------+
    101. | siteid | int(11) | Yes | true | 10 | |
    102. | citycode | smallint(6) | Yes | true | N/A | |
    103. | username | varchar(32) | Yes | true | | |
    104. | pv | bigint(20) | Yes | false | 0 | SUM |
    105. +----------+-------------+------+-------+---------+-------+
    106. 我们新增一列uv,类型为BIGINT,聚合类型为SUM,默认值为0:
    107. ALTER TABLE table1 ADD COLUMN uv BIGINT SUM DEFAULT '0' after pv;
    108. 提交成功后,可以通过以下命令查看:
    109. SHOW ALTER TABLE COLUMN;
    110. 当作业状态为FINISHED,则表示作业完成。新的Schema 已生效。
    111. ALTER TABLE完成之后, 可以通过desc table查看最新的schema
    112. mysql> desc table1;
    113. +----------+-------------+------+-------+---------+-------+
    114. | Field | Type | Null | Key | Default | Extra |
    115. +----------+-------------+------+-------+---------+-------+
    116. | siteid | int(11) | Yes | true | 10 | |
    117. | citycode | smallint(6) | Yes | true | N/A | |
    118. | username | varchar(32) | Yes | true | | |
    119. | pv | bigint(20) | Yes | false | 0 | SUM |
    120. | uv | bigint(20) | Yes | false | 0 | SUM |
    121. +----------+-------------+------+-------+---------+-------+
    122. 5 rows in set (0.00 sec)
    123. 可以使用以下命令取消当前正在执行的作业:
    124. CANCEL ALTER TABLE COLUMN FROM table1;
    125. **注意事项**:
    126. 请使用 HELP ALTER TABLE 查看更多详细信息。
    127. ===== 1.2 创建Rollup
    128. Rollup可以理解为Table的一个物化索引结构。**物化**是因为其数据在物理上独立存储,而**索引**的意思是,Rollup可以调整列顺序以增加前缀索引的命中率,也可以减少key列以增加数据的聚合度。
    129. 以下举例说明。
    130. 原表table1Schema如下:
    131. +----------+-------------+------+-------+---------+-------+
    132. | Field | Type | Null | Key | Default | Extra |
    133. +----------+-------------+------+-------+---------+-------+
    134. | siteid | int(11) | Yes | true | 10 | |
    135. | citycode | smallint(6) | Yes | true | N/A | |
    136. | username | varchar(32) | Yes | true | | |
    137. | pv | bigint(20) | Yes | false | 0 | SUM |
    138. | uv | bigint(20) | Yes | false | 0 | SUM |
    139. +----------+-------------+------+-------+---------+-------+
    140. 对于table1明细数据是siteid, citycode, username三者构成一个key,从而对pv字段进行聚合;如果业务方经常有看城市pv总量的需求,可以建立一个只有citycode, pvrollup
    141. ALTER TABLE table1 ADD ROLLUP rollup_city(citycode, pv);
    142. 提交成功后,可以通过以下命令查看:
    143. SHOW ALTER TABLE ROLLUP;
    144. 当作业状态为 FINISHED,则表示作业完成。
    145. Rollup建立完成之后可以使用desc table1 all查看表的rollup信息。
    146. mysql> desc table1 all;
    147. +-------------+----------+-------------+------+-------+--------+-------+
    148. | IndexName | Field | Type | Null | Key | Default | Extra |
    149. +-------------+----------+-------------+------+-------+---------+-------+
    150. | table1 | siteid | int(11) | Yes | true | 10 | |
    151. | | citycode | smallint(6) | Yes | true | N/A | |
    152. | | username | varchar(32) | Yes | true | | |
    153. | | pv | bigint(20) | Yes | false | 0 | SUM |
    154. | | uv | bigint(20) | Yes | false | 0 | SUM |
    155. | | | | | | | |
    156. | rollup_city | citycode | smallint(6) | Yes | true | N/A | |
    157. | | pv | bigint(20) | Yes | false | 0 | SUM |
    158. +-------------+----------+-------------+------+-------+---------+-------+
    159. 8 rows in set (0.01 sec)
    160. 可以使用以下命令取消当前正在执行的作业:
    161. CANCEL ALTER TABLE ROLLUP FROM table1;
    162. **注意事项**:
    163. - 请使用 HELP ALTER TABLE 查看更多详细信息。
    164. - Rollup建立之后查询不需要指定rollup进行查询,还是指定原有表进行查询就行,程序会自动判断是否应该使用ROLLUP。是否命中ROLLUP可以通过EXPLAIN SQL进行查看。
    165. === 2 数据表的查询
    166. ===== 2.1 内存限制
    167. * 为了防止用户的一个查询可能因为消耗内存过大,将集群搞挂,所以查询进行了内存控制,默认控制为落在没有节点上的执行计划分片使用不超过 2GB 内存。
    168. * 用户在使用时,如果发现报 memory limit exceeded 错误,一般是超过内存限制了。
    169. * 遇到内存超限时,用户应该尽量通过优化自己的sql语句来解决。
    170. * 如果确切发现2GB内存不能满足,可以手动设置内存参数。
    171. 显示查询内存限制:
    172. mysql> show variables like "%MEM_LIMIT%";
    173. +---------------+------------+
    174. | Variable_name | Value |
    175. +---------------+------------+
    176. | exec_mem_limit| 2147483648 |
    177. +---------------+------------+
    178. 1 row in set (0.00 sec)
    179. exec_mem_limit的单位是byte,可以通过set命令改变exec_mem_limit的值。
    180. set exec_mem_limit = 10;
    181. mysql> show variables like "%MEM_LIMIT%";
    182. +---------------+--------+
    183. | Variable_name | Value |
    184. +---------------+--------+
    185. | exec_mem_limit| 10 |
    186. +---------------+--------+
    187. 1 row in set (0.00 sec)
    188. mysql> select * from table1;
    189. ERROR:
    190. Memory limit exceeded
    191. ===== 2.2 查询超时
    192. 当前默认查询时间设置为最长为300秒,如果一个查询在300 秒内没有完成,则查询会被 Palo系统cancel掉。用户可以通过这个参数来定制自己应用的超时时间,实现类似 wait(timeout) 的阻塞方式。
    193. 查看当前超时设置:
    194. mysql> show variables like "%QUERY_TIMEOUT%";
    195. +---------------+-------+
    196. | Variable_name | Value |
    197. +---------------+-------+
    198. | QUERY_TIMEOUT | 300 |
    199. +---------------+-------+
    200. 1 row in set (0.00 sec)
    201. 修改超时时间到1分钟:
    202. set QUERY_TIMEOUT = 60;
    203. **注意事项**:
    204. 当前超时的检查间隔为5秒,所以小于5秒的超时不会太准确。这个未来会将精度提高到秒级别。
    205. ===== 2.3 broadcast join shuffle join
    206. 系统默认实现join的方式,是将小表进行条件过滤后,将其广播到大表所在的各个节点上,形成一个内存hash表,然后流式读出大表的数据进行hash join。但是如果当小表过滤后的数据量无法放入内存的话,此时join 将无法完成,通常的报错应该是首先造成内存超限。
    207. 如果遇到上述情况,建议使用shuffle join的方式,也被称作partitioned join。即将小表和大表都按照joinkey进行hash,然后进行分布式的 join。这个对内存的消耗就会分摊到集群的所有计算节点上。
    208. 使用broadcast join(默认):
    209. mysql> select sum(table1.pv) from table1 join table2 where table1.siteid = 2;
    210. +--------------------+
    211. | sum(`table1`.`pv`) |
    212. +--------------------+
    213. | 10 |
    214. +--------------------+
    215. 1 row in set (0.20 sec)
    216. 使用 broadcast join(显式指定):
    217. mysql> select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 2;
    218. +--------------------+
    219. | sum(`table1`.`pv`) |
    220. +--------------------+
    221. | 10 |
    222. +--------------------+
    223. 1 row in set (0.20 sec)
    224. 使用shuffle join:
    225. mysql> select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 2;
    226. +--------------------+
    227. | sum(`table1`.`pv`) |
    228. +--------------------+
    229. | 10 |
    230. +--------------------+
    231. 1 row in set (0.15 sec)
    232. ===== 2.4 failover load balance
    233. **第一种**
    234. 自己在应用层代码进行重试和负载均衡。比如发现一个连接挂掉,就自动在其他连接上进行重试。应用层代码重试需要应用自己配置多个palo前端节点地址。
    235. **第二种**
    236. 如果使用 mysql jdbc connector 来连接Palo,可以使用 jdbc 的自动重试机制:
    237. jdbc:mysql://[host:port],[host:port].../[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...
    238. **第三种**
    239. 应用可以连接到和应用部署到同一机器上的mysql proxy,通过配置mysql proxyfailoverloadbalance功能来达到目的。
    240. http://dev.mysql.com/doc/refman/5.6/en/mysql-proxy-using.html
    241. **注意事项**:
    242. - 无论你是否使用Palo,还是普通的mysql,应用都需要对连接进行错误检测,并且出错后要进行重试。
    243. - 第一种:在有failover时,需要重试其他节点。
    244. - 第二种和第三种:failover 时,也只需要简单重试,不需要在应用层明确地选择重试节点。

    原文: http://doris.apache.org/guides/getting-start.html