Vertica系列:Vertica和Hadoop的互操作性
Vertica 8和 Hadoop 集群的互操作性已经很不错的, 但这块肯定是Vertica研发的重点, 将来可能还有较大的变动.
Vertica 集群 和 Hadoop 集群的两种布局方式
| 集群布局 | 描述 | 许可证 | 支持Vertica for SQL on Hadoop特性 |
|---|---|---|---|
| 共享集群 | Vertica 节点部署在 Hadoop 所有节点或部分节点上 | Vertica for SQL on Hadoop 许可证 | 支持 |
| 分离集群 | Vertica 集群和 Hadoop 分属不同的集群 | 社区版或Premium版许可证 | 不支持 |
从目前情况下, 还是推荐使用分离模式, 主要原因有:
- 共存模式需要为 yarn 和 Vertica 分别分配合适的计算资源, 操作难度较大.
- 存储方面 Vertica 推荐采用 Raid10 或 Raid50, 而 HDFS 不推荐使用 Raid.
- Hadoop Balancer功能很可能会影响Vertica的执行效率(通常情况下Vertica仅仅部署在集群中的几台).
但长期看, 共享集群应该是Vertica重点的发展方向, HAWQ 就是这个思路. 从目前看到的资料, Vertica 9将有很大的进展.
Vertica 和 Hadoop 互操作方式汇总
| 方法 | 描述 | 推荐 | 效率 | 必须共享集群吗 |
|---|---|---|---|---|
| Reading Directly from HDFS | 以External table 或 bulk load的方式读取HDFS上的格式化文件 | Recommended | 高 | 无需 |
| HCatalog Connector | 使用Vertica SQL的方式访问 Hive 的数据表 | 中低 | 无需 | |
| HDFS Connector | 以External table 或 bulk load的方式读取HDFS上的格式化文件 | Deprecated | 高 | 无需 |
| ROS Containers on HDFS | 在HDFS上存放Vertica ROS文件 | 高 | 必须 | |
| MapReduce Connector | 使用MapReduce或Pig来访问 HDFS 上的数据 | 中/低 | ? | |
| Export to Parquet | 导出Parquet文件到本地或HDFS上 | 无需 | ||
| ParallelExport | 导出文件到本地或HDFS上 | 无需 |
读取原生 Hadoop 文件格式
在官网中好像叫做Reading Directly from HDFS 方式 或 HDFS Schema 方式.
该方法是用来替代 HDFS Connector 方法. 在使用该方法之前, Vertica 节点应能访问 Hadoop 配置文件:
- 如果共享集群, Vertica 自然能访问到这些配置文件, 只需要在 Vertica DB 中验证 HadoopConfDir 环境变量即可.
- 如果分离集群, Vertica 必须将所需文件复制到这些节点, 但一个更好的做法是, 将 Vertica 节点配置为 Hadoop 的边缘节点(英文为 edge node). 从 Hadoop 的角度来看,Vertica 就是一款客户端应用程序. 可以使用 Hortonworks Ambari 或 Cloudera Manager 配置边缘节点.
在 Vertica DB 中设置 HadoopConfDir 参数, 其路径应该包括一个含有 core-site.xml 和 hdfs-site.xml 文件的目录.
ALTER DATABASE mydb SET HadoopConfDir = '/hadoop/hcat/conf';
验证配置是否正确:
select VERIFY_HADOOP_CONF_DIR( )
该访问方式效率较高,但需要注意的是,
- ORC 或 Parquet 文件不得使用复杂数据类型.
- 由 Hive 或 Impala 压缩的文件需要进行 Zlib (GZIP) 或 Snappy 压缩, 不支持 LZO 压缩.
- 定义外部表时,您必须定义文件中的所有列.
使用 hdfs 方案不会消除对 webHDFS 服务访问权限的需求, hdfs 方案并不适用于所有的文件. 如果 hdfs 不可用,那么 Vertica 会自动改用 webhdfs. 可以直接使用 webhdfs:// 前缀,并指定主机名、端口和文件路径, 读取不受 Kerberos 保护的文件时,使用 hdfs 方案可能会提供更好的性能.
[推荐] 使用 Hadoop NameService 的方式访问 hdfs 上的数据, 注意是两个 slash 的写法, hadoopNS 这个name service 已经在 hdfs-site.xml 定义好了.
CREATE EXTERNAL TABLE tt (a1 INT, a2 VARCHAR(20))
AS COPY FROM 'hdfs://hadoopNS/data/file.csv';
[不推荐] 如果没有在hdfs-site.xml中定义name service, 需要使用 hdfs:/// 这样的写法.
CREATE EXTERNAL TABLE tt (a1 INT, a2 VARCHAR(20))
AS COPY FROM 'hdfs:///opt/data/file.csv';
直接支持 ORC/Parquet 格式,
=> CREATE EXTERNAL TABLE tableName (columns)
AS COPY FROM path ORC;
=> CREATE EXTERNAL TABLE tableName (columns)
AS COPY FROM path PARQUET;
=> CREATE EXTERNAL TABLE t (id int, name varchar(50),
created date, region varchar(50))
AS COPY FROM 'hdfs:///path///*'
PARQUET(hive_partition_cols='created,region');
直接 HDFS 的 bulk load 示例:
COPY t FROM 'hdfs:///opt/data/file1.dat';
如果您在启动 Vertica 后更新了任何Hadoop的配置文件,使用下面的语句强制更新 Vertica 中作更新.
SELECT CLEAR_HDFS_CACHES ();
HCatalog Connector 访问方式
首先Vertica 集群需要安装 Hadoop and hive的 jar library, 同时能拿到正确的 Hadoop 和 Hive 的配置文件(hive-site.xml/core-site.xml/yarn-site.xml/webhcat-site.xml/hdfs-site.xml).
Vertica 专门提供了 hcatUtil 工具帮助我们完成这些配置, 该工具的位置是: /opt/vertica/packages/hcat/tools/
详细使用见 https://my.vertica.com/docs/8.1.x/HTML/index.htm#Authoring/HadoopIntegrationGuide/HCatalogConnector/ConfiguringVerticaForHCatalog.htm
另外, 还可以配置是要使用 HiveServer2 还是 WebHCat
ALTER DATABASE mydb SET HCatalogConnectorUseHiveServer2 = 1; -- 使用 HiveServer2, 缺省模式.
ALTER DATABASE mydb SET HCatalogConnectorUseHiveServer2 = 0; -- 使用 WebHCat, 效率比 HiveServer2 好.
集群Linux 完成安装后, 还需要在 Vertica DB 中安装必要的Udx库, Vertica 8.1缺省未安装.
首先通过下面SQL验证 VHCatalogLib user_lib 是否已经安装?
select * from user_library_manifest where user_library_manifest.lib_name = 'VHCatalogLib';
如果没有安装的化, 需要先安装, vsql -f /opt/vertica/packages/hcat/ddl/install.sql
创建 HCatalog schema 名为 hcat
CREATE HCATALOG SCHEMA hcat WITH
hostname='hcathost'
HCATALOG_SCHEMA='default'
HCATALOG_USER='hcatuser';
可以使用 hcat schema直接访问 hive 表了.
SELECT
distinct ship_type,
ship_mode,
ship_carrier
FROM hcat.shipping_dimension
WHERE shipping_key >= 10627
GROUP BY ship_mode,
ship_carrier;
HDFS Connector 的外部表访问示例
首先通过下面SQL验证 HdfsSource user_lib 是否已经安装? Vertica 8.1缺省已经安装.
select * from user_library_manifest where user_library_manifest.lib_name = 'HdfsSource';
如果没有安装的化, 需要先安装, vsql -f /opt/vertica/packages/hdfsconnector/ddl/install.sql
CREATE EXTERNAL TABLE shipping_dimension
(shipping_key integer,
ship_type char(30),
ship_mode char(10),
ship_carrier char(20))
AS COPY FROM SOURCE
Hdfs(url='http://n01:50070/webhdfs/v1/dbadmin/shippingDimension/*');
HDFS Connector 的 bulk load 示例:
COPY testTable SOURCE Hdfs(url='http://hadoop:50070/webhdfs/v1/tmp/test.txt', username='hadoopUser');
ROS Containers on HDFS 方式
共享集群暂时不做过多研究, 需要创建 HDFS 存储位置
=> CREATE LOCATION 'webhdfs://hadoop:50070/user/dbadmin' ALL NODES SHARED USAGE 'data' LABEL 'coldstorage';
=> SELECT node_name,location_path,location_label FROM STORAGE_LOCATIONS;
-- Vertica Proprietary Format in HDFS
=> SELECT set_object_storage_policy('DBNAME','HDFS');
导出到HDFS
EXPORT TO PARQUET 可以支持本地导出, 也可以导出到HDFS上.
EXPORT TO PARQUET(directory='hdfs:///data/sales_data')
AS SELECT * FROM public.sales;
EXPORT TO PARQUET(directory='hdfs:///data/sales_by_region')
AS SELECT sale.price, sale.date, store.region
FROM public.sales sale
JOIN public.vendor store ON sale.distribID = store.ID;
EXPORT TO PARQUET(directory = 'hdfs:///data/export')
OVER(PARTITION BY date) AS SELECT date, price FROM public.sales;
EXPORT TO PARQUET(directory = 'hdfs:///data/export')
OVER(PARTITION BY date ORDER BY price) AS SELECT date, price FROM public.sales;
使用第三方库 ParallelExport 导出到HDFS
EXPORT TO PARQUET 的导出格式必须是 Parquet, 第三方函数 ParallelExport 支持很多中导出格式, 但效率比EXPORT TO PARQUET要差.
参考< http://www.dbjungle.com/exporting-vast-amounts-of-data-using-parallel-export-for-hpe-vertica/>
select ParallelExport(eutime,eid::varchar,logintype::varchar,sessiontime
using parameters cmd='hadoop fs -put - /user/etl/app/app_fact_event_base/${nodeName}', separator=' '
) over( partition auto ) from app.app_fact_event_base where date(sessiontime) in ('2016-12-13','2016-12-14','2017-02-12','2017-02-13') limit 1000;
Vertica系列:Vertica和Hadoop的互操作性的更多相关文章
- Vertica系列: Vertica DB连接负载均衡
背景 谈到负载均衡, 对于数据库集群需要区分几个概念: 运算的负载均衡, Vertica 本身是 MPP 数据库, SQL 操作自动会利用多台机器来加快处理速度. 数据库连接的负载均衡, Vertic ...
- 啃掉Hadoop系列笔记(03)-Hadoop运行模式之本地模式
Hadoop的本地模式为Hadoop的默认模式,不需要启用单独进程,直接可以运行,测试和开发时使用. 在<啃掉Hadoop系列笔记(02)-Hadoop运行环境搭建>中若环境搭建成功,则直 ...
- [转]C# 互操作性入门系列(一):C#中互操作性介绍
传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...
- Vertica系列:性能优化
Vertica 性能非常好, 平时基本不会碰到性能问题, 即使碰到, 优化也很容易, 而且效果往往会很好. ======================优化工具==================== ...
- Vertica系列:从一些细节看Vertica为什么是一个优秀的数据仓库平台
===========================================对象名称可以长到128字符===========================================1 ...
- Vertica系列: 自动生成Identity 字段值的方法
参考 https://thisdataguy.com/2015/01/05/vertica-some-uses-of-sequences/ 在 vertica 中有三种定义 identity 字段的方 ...
- vertica系列:数据的导入导出
本文仅涉及 Vertica 导入导出本地文件, 以及两个 Vertica 集群相互导出, 不涉及 Vertica 和 hdfs/Hive 导入导出和互操作. copy 数据导入工具 copy 命令无疑 ...
- vertica系列:解锁table
Vertica 表发生死锁后, 通过下面3个查询即可解锁. --步骤1: 找到被锁表的 transaction_idselect transaction_id, t.* from v_monitor. ...
- Vertica系列: 表的分段和分区
Vertica 有两个数据分布的概念, segmentation 和 partition, 至少有下面几个区别: 1.目的方面:segmentation 解决各节点数据倾斜问题, 适用于木桶原理, 数 ...
随机推荐
- Centos 7.3 安装Grafana 6.0
grafana简介 Grafana是一个完全开源的度量分析与可视化平台,可对来自各种各种数据源的数据进行查询.分析.可视化处理以及配置告警. Grafana支持的数据源: 官方:Graphite,In ...
- poj3259Wormholes (Bellman_Ford/SPFA/Floyed算法判断是否存在负环)
题目链接:http://poj.org/problem?id=3259 题目大意:一个图,有n个顶点,其中有m条边是双向的且权值为为正,w条边是单向的且权值为负,判断途中是否存在负环,如果有输出YES ...
- MySQL 到底能不能放到 Docker 里跑?
https://weibo.com/ttarticle/p/show?id=2309404296528549285581 前言 前几月经常看到有 MySQL 到底能不能放到 Docker 里跑的各种讨 ...
- Ubuntu 16.04交换Ctrl和Caps
将Caps这个鸡肋的键位换成Ctrl的人不在少数,Ubuntu 12.04 中可以通过设置-键盘更改,新版去掉了这个功能,可以通过修改系统文件实现 方法1 在~/.xinputrc中加入:setxkb ...
- 你应该要知道的vue.js
前言 小组同事最近都在学习前端,目前我们小组前端技术栈主要是vue.在和同事交流过程成,发现他们对vue都不了解,所以整理了问的比较多的问题. 组件data为什么必须是函数? 因为组件可能被多处使用, ...
- bzoj3829 POI2014 FAR-FarmCraft
题目链接 思路 用\(f[i]\)表示完成第\(i\)棵子树所需要得时间. 考虑如果有两个子树\(a\)和\(b\),如果先去完成子树\(a\),那么对于花费得时间就是\(f[b] + siz[a] ...
- SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP
今天在窗口上绘图的时候,遇到一个问题:在特殊情况下,当用户在窗口中按下鼠标左键,然后移动到窗口外松开鼠标左键,这时程序中只能捕获到 WM_LBUTTONDOWN(按下) 和 WM_MOUSEMOVE( ...
- 关于react-native在MacBookPro环境下的安装
都说欲善其事,必先利其器. 使用macbook写react-native 环境真的非常容易配置 先看效果 然后我们看安装需要的东西 brew install node brew install wat ...
- django orm 重点大全
1.最简单的跨表,查询外键表中符合主表条件的记录列表 #用户类型表 class User_typ(models.Model): name=models.CharField(max_length=32) ...
- Python之函数的本质、闭包、装饰器
函数名的本质 函数名本质上就是函数的内存地址. 1.可以赋值给其他变量,被引用 def func(): print('in func') f = func print(f) 2.可以被当作容器类型的元 ...