Vertica系列:Vertica和Hadoop的互操做性

Vertica 8和 Hadoop 集群的互操做性已经很不错的, 但这块确定是Vertica研发的重点, 未来可能还有较大的变更.node

Vertica 集群 和 Hadoop 集群的两种布局方式

集群布局 描述 许可证 支持Vertica for SQL on Hadoop特性
共享集群 Vertica 节点部署在 Hadoop 全部节点或部分节点上 Vertica for SQL on Hadoop 许可证 支持
分离集群 Vertica 集群和 Hadoop 分属不一样的集群 社区版或Premium版许可证 不支持

从目前状况下, 仍是推荐使用分离模式, 主要缘由有:web

  • 共存模式须要为 yarn 和 Vertica 分别分配合适的计算资源, 操做难度较大.
  • 存储方面 Vertica 推荐采用 Raid10 或 Raid50, 而 HDFS 不推荐使用 Raid.
  • Hadoop Balancer功能极可能会影响Vertica的执行效率(一般状况下Vertica仅仅部署在集群中的几台).

但长期看, 共享集群应该是Vertica重点的发展方向, HAWQ 就是这个思路. 从目前看到的资料, Vertica 9将有很大的进展.sql

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 配置文件:session

  • 若是共享集群, 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';app

验证配置是否正确: select VERIFY_HADOOP_CONF_DIR( )ide

该访问方式效率较高,但须要注意的是,函数

  • 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';oop

[不推荐] 若是没有在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;

相关文章
相关标签/搜索