一、概述
1.1、什么是Vertica?
Vertica是一款基于列存储的MPP (massively parallel processing)架构的数据库。它可以支持存放多至PB(Petabyte)级别的结构化数据。Vertica是由关系数据库大师Michael Stonebraker(2014 年图灵奖获得者)所创建,于2011年被惠普收购并成为其核心大数据平台软件。
1.2、功能特点
Vertica有如下特点
-
列式存储和执行
在分析工作负载方面,列式存储可显着提高性能、I/O、存储空间和效率。使用列式存储,查询仅读取回答查询所需的列。
-
实时加载和查询
具有高查询并发性和将新数据同时加载到系统中并进行查询的能力。Vertica加载数据的速度比传统的行存储数据库快 10 倍。
-
高级数据库分析
一组高级数据库内分析,包括机器学习、地理空间和时间序列分析,让您可以更接近您的数据进行分析计算。这些内置功能可提供即时结果,而无需求助于其他分析工具。
-
数据库设计器和管理工具
-
高级压缩
积极的编码和压缩允许Vertica通过在处理时减少 CPU、内存和磁盘 I/O 来显着提高分析性能。Vertica可以将原始数据大小减少多达 90%,低至其原始大小的 1/10,而不会丢失信息或精度。
-
结构化和半结构化数据
除了传统的结构化数据库表,Vertica还提供弹性表,让您可以加载和分析半结构化数据,例如 JSON 格式的数据。
-
大规模并行处理
强大且可扩展的并行处理解决方案提供主动冗余、自动复制、故障转移和恢复。
-
随处部署
在位于您自己(或协同定位)数据中心的物理硬件上运行。或者在您自己的虚拟主机或主要云平台(AWS、Azure 和 Google Cloud)上的虚拟硬件上运行。
-
数据湖连接
使用内置连接器分析来自 Apache Hadoop 和 Kafka 的数据。对于其他系统,Vertica提供了一套标准客户端库,例如 JDBC 和 ODBC。
-
管理和监控
基于浏览器的管理控制台让您可以通过用户友好的 GUI 创建、导入和管理您的 Vertica 数据库。
-
动态扩展集群以满足工作负载
使用Eon 模式扩展您的数据库集群以满足增加的工作负载,或缩小它以节省资金。
1.3、架构基础
了解Vertica架构核心的几个关键概念
1.3.1、列存储
Vertica以列格式存储数据,以便查询以获得最佳性能。与基于行的存储相比,列存储减少了磁盘 I/O,使其成为读取密集型工作负载的理想选择。Vertica仅读取回答查询所需的列。例如:
SELECT avg(price) FROM tickstore WHERE symbol = 'AAPL' and date = '5/31/13';
对于此示例查询,列存储仅读取三列,而行存储读取所有列:

1.3.2、数据编码和压缩
Vertica使用编码和压缩来优化查询性能并节省存储空间。
-
编码
编码将数据转换为标准格式。 Vertica 使用多种不同的编码策略,具体取决于列数据类型、表基数和排序顺序。编码可提高性能,因为查询执行期间磁盘 I/O 较少。此外,您可以在更少的空间中存储更多的数据。
-
压缩
与其他数据库相比,Vertica 可以存储更多数据、提供更多视图并使用更少的硬件。Vertica使用多种不同的压缩方法,并自动为被压缩的数据选择最好的一种。
压缩允许列存储占用比行存储少得多的存储空间。在列存储中,存储在投影列中的每个值都具有相同的数据类型。这极大地促进了压缩,尤其是在已排序的列中。在行存储中,行的每个值可以具有不同的数据类型,从而导致压缩的使用效率低得多。
下面显示了使用排序和基数的压缩:
1.3.3、集群
集群支持扩展和冗余。可以通过添加更多节点来扩展数据库集群,并且可以通过跨集群分发和复制数据来提高可靠性。
列数据分布在集群中的节点上,因此如果一个节点不可用,数据库将继续运行。当一个节点被添加到集群中,或者在不可用后重新上线时,它会自动查询其他节点以更新其本地数据。
1.3.4、逻辑和物理Schema
Vertica将有关数据库对象的信息存储在逻辑架构和物理架构中。两种架构之间的差异以及它们与数据存储的关系是Vertica架构的一个重要且独特的方面。
1.4、关键能力
性价比高,支持大规模扩展
HPE Vertica,可部署于廉价的x86服务器/私有云/公有云/Hadoop,软件License费用可预期,支持大规模节点扩展。
高处理性能
决定一个大数据平台综合性能的主要因素包括:硬件处理性能和数据库软件性能。其中,磁盘速度从1956年至今仅仅增长了12.5倍,I/O是主要瓶颈。
而HPE Vertica,能够胜任大规模批量计算、高并发查询、以及极端复杂的自主分析和查询。Vertica提高性能的秘诀在于:
高频数据加载和实时分析
Vertica调度程序(vertica-kafka-scheduler.jar)负责组织协调从Kafka持续加载数据流资源,Vertica KafkaExport插件负责将SQL查询结果导出到Kafka等。
最终,HPE Vertica能够支持秒级数据实时加载和秒级甚至亚秒级的数据查询响应能力。
开放性和集成能力
Vertica可与Hadoop Hive/HDFS/Spark无缝集成,可与R无缝集成,支持各类BI产品和ETL工具,能解决各种数据挖掘算法的应用场景
具备企业级高可用和易管理特性
Vertica具备完善的部件失效和节点失效保护能力,和完善的全增量备份机制,以及基于MC的企业级易用性和管理能力。
1.5、vertica 11全新发布
今年,在「Vertica Unify 2021全球峰会」上,Vertica宣布正式推出全新版本Vertica 11
Vertica 11 将为多云和多区域部署提供统一分析、高级分析与机器学习能力,包含主要功能、增强功能与自助式容器工作流,从全新意义上满足了数据分析驱动型企业的敏捷、效率和安全性要求,就此开启「统一分析」的新篇章。
详情参看:Vertica 11 高燃发布!开启「统一分析」新篇章
二、docker安装 vertica 11
2.1、docker安装
# 拉取镜像
docker pull vertica/vertica-ce:11.0.0-0
# 启动
docker run -d -p 5433:5433 -p 5444:5444 \
--mount type=volume,source=vertica-data,target=/vertica_data \
--name vertica_ce \
-e VERTICA_PASSWORD=vertica \
vertica/vertica-ce:11.0.0-0
2.2、简单使用
2.2.1、连接数据库
-
进入容器
docker exec -it vertica_ce /bin/bash
-
连接数据库
vsql
-
遇到问题
如果刚进去报如下错,原因是数据库还没完全启动,等待几秒钟,重新vsql即可。
2.2.2、操作数据库
2.2.2.1、创建用户和schema
-
创建用户
create user test_user identified by 'test';
-
创建schema
-- 基于某用户创建schema create schema if not exists test_schema authorization test_user; -- 测试删除schema create schema if not exists test2_schema authorization test_user; drop schema test2_schema cascade;
-
查询用户和schema
SELECT u.user_name, s.schema_name FROM users u LEFT OUTER JOIN schemata s ON u.user_name = s.schema_owner;
2.2.2.2、序列
-
查看所有序列
select * from sequences;
-
创建序列
CREATE SEQUENCE test_seq MAXVALUE 2147483647 START 1;
-
使用序列
-- 一个新创建还没有使用过的序列,必须首先执行NEXTVAL,然后才能执行CURRVAL。 SELECT NEXTVAL('test_seq'); SELECT CURRVAL('test_seq'); -- 创建一个id是序列的表 CREATE TABLE test_table(id INTEGER DEFAULT NEXTVAL('test_seq'), name varchar(16), age Integer ); -- insert语句使用 INSERT INTO test_table VALUES (NEXTVAL('test_seq'), 'Tom', 18); -- 默认序列 INSERT INTO test_table VALUES (default, 'Jack', 28);
-
删除序列
DROP SEQUENCE test_seq;
2.2.2.3、操作表
-
创建表
CREATE TABLE test_table(id INTEGER DEFAULT NEXTVAL('test_seq'), name varchar(16), age Integer );
-
修改表
-- 新增字段 alter table test_table add column email varchar(8); -- 修改字段类型 ALTER TABLE test_table ALTER email SET DATA TYPE VARCHAR(32); ALTER TABLE test_table ALTER name SET not null; -- 修改字段名 ALTER TABLE test_table RENAME name TO name2; -- 删除字段 ALTER TABLE test_table DROP COLUMN email; -- 修改表名 ALTER TABLE test_table RENAME TO test_table2; -- 修改表所属用户 ALTER TABLE XXXX OWNER TO xxx;
-
删除表
DROP TABLE test_table;
-
查看表
-- 查看表的信息(所有者、创建时间等) SELECT * FROM TABLES WHERE TABLE_NAME = 'test_table'; -- 查看表结构 \d test_table;
2.2.2.4、操作数据
-
增
INSERT INTO test_table VALUES (NEXTVAL('test_seq'), 'Jarry', 38);
-
删
DELETE FROM test_table WHERE name like '%Jar%';
-
改
UPDATE test_table SET age = 19 WHERE name = 'Tom';
-
查
SELECT * FROM test_table ORDER BY id;
四、java连接测试
4.1、JDBC连接
public static void main(String[] args) {
Properties prop = new Properties();
prop.put("user", "dbadmin");
prop.put("password", "vertica");
prop.put("loginTimeout", "35");
prop.put("binaryBatchInsert", "true");
try {
Connection conn = DriverManager.getConnection(
"jdbc:vertica://xxx:5433/VMart", prop);
System.out.println("连接成功!");
conn.close();
} catch (SQLTransientConnectionException e) {
System.out.print("Network connection issue: " + e.getMessage());
return;
} catch (SQLInvalidAuthorizationSpecException e) {
System.out.print("Could not log into database: " + e.getMessage());
return;
} catch (SQLException e) {
System.out.print(e.printStackTrace());
}
}
4.2、SpringBoot项目
spring:
datasource:
url: jdbc:vertica://xxx:5433/VMart
driver-class-name: com.vertica.jdbc.Driver
username: xxx
password: xxx
hikari:
login-timeout: 30
connection-timeout: 10000
idle-timeout: 600000
max-lifetime: 1800000
五、python连接测试
在使用Vertica时,python可能会用的比较多,因为Vertica ML 将机器学习与数据仓库相结合,这不仅使核心机器学习功能的访问民主化,而且大大简化了将这些模型投入生产的过程。可以使用 Vertica 的 Python 界面来执行整个机器学习周期——从数据准备到跨集群中多个节点的超大型数据集的模型部署。
5.1、安装依赖
编写脚本的时候我结合了pandas使用,没有安装pandas的装一下吧,非常必须得一个库。
pip3 install vertica_python pip3 install pandas
5.2、操作数据库脚本
根据我平时对别的数据库的操作方法,改编的脚本,亲测好使。
from vertica_python import connect
import pandas as pd
# 连接数据库
def con_db():
conn_info = {'host': 'ip',
'port': 5433,
'user': 'dbadmin',
'password': 'vertica',
'database': 'VMart',
'read_timeout': 600,
'unicode_error': 'strict',
'ssl': False}
db = connect(**conn_info)
cur = db.cursor()
return db, cur
# 查询数据
def read_db(sql):
db, cur = con_db()
try:
df_db_data = pd.read_sql(sql, con=db)
except Exception as e:
print('从数据库获取数据失败:' + e)
return df_db_data
# 增删改数据
def update_db(update_sql):
db, cur = con_db()
try:
cur.execute(update_sql)
db.commit()
except Exception as e:
print('数据更新失败:' + e)
db.rollback()
cur.close()
db.close()
# 批量插入数据库
def many_insert_db(insert_sql, list_tuple):
db, cur = con_db()
try:
cur.executemany(insert_sql, list_tuple)
db.commit()
except Exception as e:
print(e)
db.rollback()
cur.close()
db.close()
if __name__ == '__main__':
# 插入数据
insert_sql = "INSERT INTO test_table VALUES (1, 'Jarry', 38);"
update_db(insert_sql)
# 更新数据
update_sql = "UPDATE test_table SET age = 19 WHERE name = 'Jarry';"
update_db(update_sql)
# 查询数据
select_sql = 'SELECT * FROM test_table;'
df_db_data = read_db(select_sql)
print(df_db_data)
# 删除数据
delete_sql = "DELETE FROM test_table WHERE name = 'Jarry';"
update_db(delete_sql)
以上是入门了解教程,Vertica还有超多“黑科技”等待大家去探索......