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. 【BZOJ5314】[JSOI2018]潜入行动(动态规划)

    [BZOJ5314][JSOI2018]潜入行动(动态规划) 题面 BZOJ 洛谷 题解 不难想到一个沙雕\(dp\),设\(f[i][j][0/1][0/1]\)表示当前点\(i\),子树中一共放了 ...

  2. poj3259Wormholes (Bellman_Ford/SPFA/Floyed算法判断是否存在负环)

    题目链接:http://poj.org/problem?id=3259 题目大意:一个图,有n个顶点,其中有m条边是双向的且权值为为正,w条边是单向的且权值为负,判断途中是否存在负环,如果有输出YES ...

  3. PyCharm创建自定义代码段(JetBrains系列通用)

    创建自定义代码段或者修改代码段:(用习惯了VSCode的main格式,固而改下)

  4. 洛谷P4316 绿豆蛙的归宿

    一眼看去,这不是高斯消元吗? 然后发现数据范围是100000... 然后发现是DAG...直接拓扑序递推即可. 边(x, y,z)的贡献是P(x) * z / out[x] #include < ...

  5. A1006. Sign In and Sign Out

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  6. [luogu2296][寻找道路]

    直接赋题目..... 题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点 ...

  7. zxing二维码的生成与解码(C#)

    ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和An ...

  8. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  9. 在Derby中取得刚刚插入的“递增”类型的字段值

    现在才发现采用不同的数据库,对写程序影响很大. 以前常用SQL Server2000或Access,可能是因为都是Microsoft公司的产品,所以在从不同的平台转换的时候问题不是很大. 现在采用De ...

  10. Going Home POJ - 2195 (最小费用最大流)

    On a grid map there are n little men and n houses. In each unit time, every little man can move one ...