Palo初体验

  |   5 评论   |   1,565 浏览

背景

Palo是一个面向多维分析的数据库,即A MPP-based Interactive Data Analysis SOL DB。主要场景为在线报表、多维分析、机器查询。[1]

Palo的名称来源:PALO < -> OLAP

其服务的百度统计,覆盖450w网站,每天查询量1500w,峰值QPS 2000+。使用不超过60台服务器。

日处理数据量10TB+,日输入数据量1TB+,导入频次5分钟,30ms平均查询延时。

末尾参考中的1-2是Palo的文字简介,3是视频简介。

安装

官方中文文档

docker安装(未完成)

下载docker镜像

Palo的docker镜像没有放在docker hub上,而是需要在其github页面上自动下载。

目前其github页面上的下载链接如下:

docker 镜像下载(20171213 update):

加载docker镜像

docker load -i palo-fe-0.8.0-docker-image
docker load -i palo-be-0.8.0-docker-image

TBD

rpm安装

下载

下载预编译的rpm包,即palo-0.8.0_centos7.2.tar.gz。找到CentOS 7.x的机器,解压即可。

启动fe

  1. 修改 fe.conf文件,指定meta_dir目录

  2. 手动创建meta_dir目录

  3. 启动:sh bin/start_fe.sh

启动be

  1. 修改 be.conf文件,指定storage_root_path目录

  2. 手动创建storage_root_path目录

  3. 启动:sh bin/start_be.sh

关联fe和be

  1. 连接fe:./mysql-client -h host -P 9030 -uroot

  2. 添加fe:ALTER SYSTEM ADD BACKEND "host:port";

其中 host 为 BE所在节点 ip;port 为 be/conf/be.conf 中的 heartbeat_service_port,默认为9050。

  1. 查看be状态:SHOW PROC '/backends'; 其中 isAlive 列为 isAlive

基础操作

参考官方基础使用指南

建库

CREATE DATABASE test;

验证

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.05 sec)

建表

USE test

单分区

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");

复合分区

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");

结果验证

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| table1         |
| table2         |
+----------------+
2 rows in set (0.04 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.05 sec)
mysql> desc table2;
+-----------+-------------+------+-------+---------+-------+
| Field     | Type        | Null | Key   | Default | Extra |
+-----------+-------------+------+-------+---------+-------+
| event_day | date        | Yes  | true  | N/A     |       |
| 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.05 sec)

注意:

  • 上面replication_num=1即单副本的表,建议使用3副本以保证高可用。
  • 更多注意事项见官方文档

数据导入

小批量导入

小批量导入: 主要用于让用户可以不依赖HDFS,导入本地目录文件。

小批量导入是Palo中唯一不使用mysql-client执行的命令,采用http协议完成通信。

小批量导入的端口是fe.conf中配置的http port,默认为:8030

保存文件demo1.txt,内容如下:

注意:这里的分隔符必须是\t而不是空格,否则会导入失败。

1   1   'jim'   2
2   1   'grace' 2
3   2   'tom'   2
4   3   'bush'  3
5   3   'helen' 3

导入:

curl --location-trusted -uroot: -T demo1.txt http://127.0.0.1:8030/api/test/table1/_load?label=table1_20170707

结果

{
	"status": "Success",
	"msg": "OK"
}

保存文件demo2.txt,内容如下:

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

导入:

curl --location-trusted -uroot: -T demo2.txt http://127.0.0.1:8030/api/test/table2/_load?label=table2_20170707

结果

{
	"status": "Success",
	"msg": "OK"
}

注意:

  • 小批量导入单批次导入的数据量限制为1GB

批量导入

从HDFS导入,略

查询导入状态

mysql> help show load;
mysql> show load;

数据查询

简单查询

mysql> select * from table1;
+--------+----------+----------+------+
| siteid | citycode | username | pv   |
+--------+----------+----------+------+
|      2 |        1 | 'grace'  |    2 |
|      1 |        1 | 'jim'    |    2 |
|      5 |        3 | 'helen'  |    3 |
|      3 |        2 | 'tom'    |    2 |
|      4 |        3 | 'bush'   |    3 |
+--------+----------+----------+------+
5 rows in set (0.05 sec)

order by查询

默认limit65535

mysql> select * from table1 order by siteid;
+--------+----------+----------+------+
| siteid | citycode | username | pv   |
+--------+----------+----------+------+
|      1 |        1 | 'jim'    |    2 |
|      2 |        1 | 'grace'  |    2 |
|      3 |        2 | 'tom'    |    2 |
|      4 |        3 | 'bush'   |    3 |
|      5 |        3 | 'helen'  |    3 |
+--------+----------+----------+------+
5 rows in set (0.06 sec)

join查询

mysql> select sum(table1.pv) from table1 join table2 where table1.siteid = table2.siteid;
+--------------------+
| sum(`table1`.`pv`) |
+--------------------+
|                 12 |
+--------------------+
1 row in set (0.18 sec)

子查询

mysql> select sum(pv) from table2 where siteid in (select siteid from table1 where siteid > 2);
+-----------+
| sum(`pv`) |
+-----------+
|         8 |
+-----------+
1 row in set (0.08 sec)

更多用法

官方文档

参考

评论

  • flowaters @snail 回复»

    这个只需要运行curl命令时能找到demo1.txt文件就可以了,放哪个目录均可。

  • snail 回复»

    博主您好,在“小批量导入”一节里,“保存文件demo1.txt”,请问是在哪个目录下保存文件demo1.txt,谢谢!

  • flowaters @Sench 回复»

    是mysql客户端,实际使用是 ./mysql -h host -P 9030 -uroot

  • Sench 回复»

    补充一下,./mysql-client -h host -P 9030 -uroot 是在哪一个目录下进行的呢?

  • Sench 回复»

    请问博主,在“rpm操作中”
    关联fe和be
    1. 连接fe:./mysql-client -h host -P 9030 -uroot
    其中的mysql-client是单纯的一个脚本文件,还是说需要安装mysql-client呢?我安装了mysql-client后并没有该命令可以使用,如果说是脚本文件的话,那这个文件在哪存放呢?请博主指点,谢谢!

发表评论

validate