1.1 Root用户登录与密码修改
Palo内置root用户,密码默认为空,启动完Palo程序之后,可以通过root用户连接到Palo集群。 假如mysql客户端和Palo FE程序部署在同一台机器,使用默认端口,下面命令即可登录Palo。
修改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的命令如下):
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。
mysql -h 127.0.0.1 -P9030 -uroot -proot
enter example_cluster;
1.3 创建新用户
如果使用多租户则按照1.3.1,没使用则按照1.3.2。
1.3.1 使用多租户
进入到指定cluster之后,可以在里面创建新的用户。
create user 'test' identified by 'test';
后续登录时就可以通过下列连接命令登录到指定cluster
mysql -h FE_HOST -P QUERY_PORT -uUSERNAME@CLUSTER_NAME -pPASSWORD
QUERY_PORT: 在fe.conf中进行配置,默认配置为9030。
USERNAME: 用户名。
CLUSTER_NAME: 创建的cluster名称。
PASSWORD: 创建用户时指定的密码。
使用root登录Palo集群,并进入example_cluster。
当然,root账户依然可以采用先登录Palo集群,后enter到指定cluster的方式;而其他用户登录必须显示指名cluster的名称。
使用superuser登录Palo集群,并进入example_cluster。
mysql -h 127.0.0.1 -P9030 -usuperuser@example_cluster -psuperuser
使用test登录Palo集群,并进入example_cluster。
mysql -h 127.0.0.1 -P9030 -utest@example_cluster -ptest
====== 1.3.2 不使用多租户
通过下面的命令创建一个普通用户。
也可以创建一个管理员superuser用户,指定密码的方式如1.1节描述。
create user 'test' superuser;
后续登录时就可以通过下列连接命令登录。
mysql -h FE_HOST -P QUERY_PORT -uUSERNAME -pPASSWORD
- FE_HOST: 部署FE的机器。
- QUERY_PORT: 在fe.conf中进行配置,默认配置为9030。
- USERNAME: 用户名。
- PASSWORD: 创建用户时指定的密码。
使用root登录Palo集群。
mysql -h 127.0.0.1 -P9030 -uroot -proot
mysql -h 127.0.0.1 -P9030 -utest -ptest
=== 2 数据表的创建与数据导入
===== 2.1 创建数据库
Palo中只有root账户和superuser账户有权限建立数据库,使用root或superuser用户登录,建立example_db数据库:
CREATE DATABASE example_db;
- 所有命令都可以使用'HELP your_command'查看到详细的中文帮助
- 如果不清楚命令的全名,可以使用'help 命令某一字段' 进行模糊查询。
如键入'HELP CREATE',可以匹配到CREATE DATABASE, CREATE TABLE, CREATE USER三个命令
数据库创建完成之后,可以通过show databases查看数据库信息。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| test |
| information_schema |
+--------------------+
2 rows in set (0.00 sec)
information_schema是为了兼容mysql协议而存在,实际中信息可能不是很准确,所以关于具体数据库的信息建议通过直接查询相应数据库而获得。
===== 2.2 账户授权
example_db创建完成之后,可以通过root账户或者superuser账户将example_db读写权限授权给test账户, 授权之后采用test账户登录就可以操作example_db数据库了。
grant all on example_db to test;
===== 2.3 建表
使用CREATE TABLE命令建立一个表(Table)。更多详细参数可以查看:
HELP CREATE TABLE;
首先切换数据库:
USE example_db;
Palo支持支持单分区和复合分区两种建表方式。
在复合分区中:
- 第一级称为Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间类型的列),并指定每个分区的取值范围。
- 第二级称为Distribution,即分桶。用户可以指定某几个维度列(或不指定,即所有KEY列)以及桶数对数据进行HASH分布。
以下场景推荐使用复合分区
- 历史数据删除需求:如有删除历史数据的需求(比如仅保留最近N 天的数据)。使用复合分区,可以通过删除历史分区来达到目的。也可以通过在指定分区内发送DELETE语句进行数据删除。
- 解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列。
用户也可以不使用复合分区,即使用单分区。则数据只做HASH分布。
下面以聚合模型为例,分别演示两种分区的建表语句。
===== 单分区
建立一个名字为table1的逻辑表。使用全hash分桶,分桶列为siteid,桶数为10。
这个表的schema如下:
- siteid:类型是INT(4字节), 默认值为10
- cidy_code:类型是SMALLINT(2字节)
- username:类型是VARCHAR, 最大长度为32, 默认值为空字符串
- pv:类型是BIGINT(8字节), 默认值是0; 这是一个指标列, Palo内部会对指标列做聚合操作, 这个列的聚合方法是求和(SUM)
建表语句如下:
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");
===== 复合分区
建立一个名字为table2的逻辑表。
这个表的 schema 如下:
- event_day:类型是DATE,无默认值
- siteid:类型是INT(4字节), 默认值为10
- cidy_code:类型是SMALLINT(2字节)
- username:类型是VARCHAR, 最大长度为32, 默认值为空字符串
- pv:类型是BIGINT(8字节), 默认值是0; 这是一个指标列, Palo 内部会对指标列做聚合操作, 这个列的聚合方法是求和(SUM)
我们使用event_day列作为分区列,建立3个分区: p1, p2, p3
- p1:范围为 [最小值, 2017-06-30)
- p2:范围为 [2017-06-30, 2017-07-31)
- p3:范围为 [2017-07-31, 2017-08-31)
每个分区使用siteid进行哈希分桶,桶数为10
建表语句如下:
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");
表建完之后,可以查看example_db中表的信息:
mysql> show tables;
+----------------------+
| Tables_in_example_db |
+----------------------+
| table1 |
| table2 |
+----------------------+
2 rows in set (0.01 sec)
mysql> desc table1;
+----------+-------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-------+---------+-------+
| siteid | int(11) | Yes | true | 10 | |
| citycode | smallint(6) | Yes | true | N/A | |
| username | varchar(32) | Yes | true | | |
| pv | bigint(20) | Yes | false | 0 | SUM |
+----------+-------------+------+-------+---------+-------+
4 rows in set (0.00 sec)
mysql> desc table2;
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-------+---------+-------+
| siteid | int(11) | Yes | true | 10 | |
| citycode | smallint(6) | Yes | true | N/A | |
| username | varchar(32) | Yes | true | | |
| pv | bigint(20) | Yes | false | 0 | SUM |
+-----------+-------------+------+-------+---------+-------+
5 rows in set (0.00 sec)
**注意事项**:
- 上述表通过设置replication_num建的都是单副本的表,Palo建议用户采用默认的3副本设置,以保证高可用。
- 可以对复合分区表动态的增删分区。详见'HELP ALTER TABLE'中 PARTITION相关部分。
- 数据导入可以导入指定的partition。详见'HELP LOAD'。
- 可以动态修改表的Schema。
- 可以对Table增加上卷表(Rollup)以提高查询性能,这部分可以参见高级使用指南关于Rollup的描述。
===== 2.4 导入数据
Palo 支持两种数据导入方式:
- 小批量导入:针对小批量数据的导入。详见'HELP MINI LOAD'
- 批量导入:支持读取HDFS文件,部署不同broker可以读取不同版本HDFS数据。详见 'HELP LOAD'
我们这里分别提供两种导入方式的操作示例,为快速完成导入建议使用方采用小批量导入进行数据导入的测试。
===== 小批量导入
小批量导入: 主要用于让用户可以不依赖HDFS,导入本地目录文件。
小批量导入是Palo中唯一不使用mysql-client执行的命令,采用http协议完成通信。**小批量导入的端口是fe.conf中配置的http port。**
示例1:以 "table1_20170707"为Label,使用本地文件table1_data导入table1表。
curl --location-trusted -u test:test -T table1_data http://127.0.0.1:8030/api/example_db/table1/_load?label=table1_20170707
本地table1_data以\t作为数据之间的分隔,具体内容如下:
1 1 'jim' 2
2 1 'grace' 2
3 2 'tom' 2
4 3 'bush' 3
5 3 'helen' 3
示例2: 以"table2_20170707"为Label,使用本地文件table2_data导入table2表。
curl --location-trusted -u test:test -T table2_data http://127.0.0.1:8030/api/example_db/table2/_load?label=table2_20170707
本地table2_data以\t作为数据之间的分隔,具体内容如下:
2017-07-03 1 1 'jim' 2
2017-07-05 2 1 'grace' 2
2017-07-12 3 2 'tom' 2
2017-07-15 4 3 'bush' 3
2017-07-12 5 3 'helen' 3
**注意事项**:
- 小批量导入单批次导入的数据量限制为1GB,用户如果要导入大量数据,需要自己手动拆分成多个小于1GB的文件,分多个批次导入,或者采用批量导入。
- 每一批导入数据都需要取一个Label,Label 最好是一个和一批数据有关的字符串,方便阅读和管理。Palo基于Label 保证在一个Database内,同一批数据只可导入成功一次。失败任务的Label可以重用。
- 该方式可以支持用户同时向多个表进行导入,并且多表间原子生效。用法请参阅:'HELP MULTI LOAD'。
- 导入label建议采用表名+时间的方式。
- 如果使用了多租户上面的用户名的格式需要是test@example_cluster
===== 批量导入
示例:以 "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" );