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的互操作性的更多相关文章

  1. Vertica系列: Vertica DB连接负载均衡

    背景 谈到负载均衡, 对于数据库集群需要区分几个概念: 运算的负载均衡, Vertica 本身是 MPP 数据库, SQL 操作自动会利用多台机器来加快处理速度. 数据库连接的负载均衡, Vertic ...

  2. 啃掉Hadoop系列笔记(03)-Hadoop运行模式之本地模式

    Hadoop的本地模式为Hadoop的默认模式,不需要启用单独进程,直接可以运行,测试和开发时使用. 在<啃掉Hadoop系列笔记(02)-Hadoop运行环境搭建>中若环境搭建成功,则直 ...

  3. [转]C# 互操作性入门系列(一):C#中互操作性介绍

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  4. Vertica系列:性能优化

    Vertica 性能非常好, 平时基本不会碰到性能问题, 即使碰到, 优化也很容易, 而且效果往往会很好. ======================优化工具==================== ...

  5. Vertica系列:从一些细节看Vertica为什么是一个优秀的数据仓库平台

    ===========================================对象名称可以长到128字符===========================================1 ...

  6. Vertica系列: 自动生成Identity 字段值的方法

    参考 https://thisdataguy.com/2015/01/05/vertica-some-uses-of-sequences/ 在 vertica 中有三种定义 identity 字段的方 ...

  7. vertica系列:数据的导入导出

    本文仅涉及 Vertica 导入导出本地文件, 以及两个 Vertica 集群相互导出, 不涉及 Vertica 和 hdfs/Hive 导入导出和互操作. copy 数据导入工具 copy 命令无疑 ...

  8. vertica系列:解锁table

    Vertica 表发生死锁后, 通过下面3个查询即可解锁. --步骤1: 找到被锁表的 transaction_idselect transaction_id, t.* from v_monitor. ...

  9. Vertica系列: 表的分段和分区

    Vertica 有两个数据分布的概念, segmentation 和 partition, 至少有下面几个区别: 1.目的方面:segmentation 解决各节点数据倾斜问题, 适用于木桶原理, 数 ...

随机推荐

  1. 洛谷SP22343 NORMA2 - Norma(分治,前缀和)

    洛谷题目传送门 这题推式子恶心..... 考虑分治,每次统计跨过\(mid\)的所有区间的答案和.\(i\)从\(mid-1\)到\(l\)枚举,统计以\(i\)为左端点的所有区间. 我们先维护好\( ...

  2. python之各种装饰器的使用

    """ 装饰器,带参数的装饰器,类的装饰器 判断是否为可迭代的 from collections import Iterable print(isinstance([1, ...

  3. 【Luogu3602】Koishi Loves Segments(贪心)

    [Luogu3602]Koishi Loves Segments(贪心) 题面 洛谷 题解 离散区间之后把所有的线段挂在左端点上,从左往右扫一遍. 对于当前点的限制如果不满足显然会删掉右端点最靠右的那 ...

  4. vxlan和vlan数据报文

    802.1Q标准的以太网帧格式增加了802.1Q字段,该字段包含了Type.PRI.CFI和VID 4个部分,各个部分的含义如下: ·Type:长度为2 bytes,表示帧类型,802.1Q tag帧 ...

  5. [AH2017/HNOI2017]礼物(FFT)

    题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一 ...

  6. Python数据结构之栈的实现

    一图胜千言,看图! 代码code: #coding:utf-8 #常见数据结构之栈的实现 class Stack(): #创建Stack类 def __init__(st,size): st.stac ...

  7. MyBatis深入浅出--入门

    mybatis概述 mybatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. ...

  8. request 的介绍使用属性

    上下文:相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask中有两种上下文,请求上下文和应用上下文 请求上下文(request context) 在 flask 中,可以直接在视 ...

  9. JavaScript 正整数正则表达式

    function testNumber(){ var yourinputValue=$("#yourinputId").val();  var reg = /^[1-9]\d*$/ ...

  10. 逻辑回归 代价函数J关于系数theta求导

    J=-y*loga-(1-y)*log(1-a) 梯度下降,求dJ/d_theta_j