Vertica系列:Vertica和Hadoop的互操作性
Vertica 8和 Hadoop 集群的互操作性已經(jīng)很不錯(cuò)的, 但這塊肯定是Vertica研發(fā)的重點(diǎn), 將來可能還有較大的變動(dòng).
Vertica 集群 和 Hadoop 集群的兩種布局方式
| 集群布局 | 描述 | 許可證 | 支持Vertica for SQL on Hadoop特性 |
|---|---|---|---|
| 共享集群 | Vertica 節(jié)點(diǎn)部署在 Hadoop 所有節(jié)點(diǎn)或部分節(jié)點(diǎn)上 | Vertica for SQL on Hadoop 許可證 | 支持 |
| 分離集群 | Vertica 集群和 Hadoop 分屬不同的集群 | 社區(qū)版或Premium版許可證 | 不支持 |
從目前情況下, 還是推薦使用分離模式, 主要原因有:
共存模式需要為 yarn 和 Vertica 分別分配合適的計(jì)算資源, 操作難度較大.
存儲(chǔ)方面 Vertica 推薦采用 Raid10 或 Raid50, 而 HDFS 不推薦使用 Raid.
Hadoop Balancer功能很可能會(huì)影響Vertica的執(zhí)行效率(通常情況下Vertica僅僅部署在集群中的幾臺(tái)).
但長(zhǎng)期看, 共享集群應(yīng)該是Vertica重點(diǎn)的發(fā)展方向, HAWQ 就是這個(gè)思路. 從目前看到的資料, Vertica 9將有很大的進(jìn)展.
Vertica 和 Hadoop 互操作方式匯總
| 方法 | 描述 | 推薦 | 效率 | 必須共享集群?jiǎn)?/th> |
|---|---|---|---|---|
| Reading Directly from HDFS | 以External table 或 bulk load的方式讀取HDFS上的格式化文件 | Recommended | 高 | 無需 |
| HCatalog Connector | 使用Vertica SQL的方式訪問 Hive 的數(shù)據(jù)表 | 中低 | 無需 | |
| HDFS Connector | 以External table 或 bulk load的方式讀取HDFS上的格式化文件 | Deprecated | 高 | 無需 |
| ROS Containers on HDFS | 在HDFS上存放Vertica ROS文件 | 高 | 必須 | |
| MapReduce Connector | 使用MapReduce或Pig來訪問 HDFS 上的數(shù)據(jù) | 中/低 | ? | |
| Export to Parquet | 導(dǎo)出Parquet文件到本地或HDFS上 | 無需 | ||
| ParallelExport | 導(dǎo)出文件到本地或HDFS上 | 無需 |
讀取原生 Hadoop 文件格式
在官網(wǎng)中好像叫做Reading Directly from HDFS 方式 或 HDFS Schema 方式.
該方法是用來替代 HDFS Connector 方法. 在使用該方法之前, Vertica 節(jié)點(diǎn)應(yīng)能訪問 Hadoop 配置文件:
如果共享集群, Vertica 自然能訪問到這些配置文件, 只需要在 Vertica DB 中驗(yàn)證 HadoopConfDir 環(huán)境變量即可.
如果分離集群, Vertica 必須將所需文件復(fù)制到這些節(jié)點(diǎn), 但一個(gè)更好的做法是, 將 Vertica 節(jié)點(diǎn)配置為 Hadoop 的邊緣節(jié)點(diǎn)(英文為 edge node). 從 Hadoop 的角度來看,Vertica 就是一款客戶端應(yīng)用程序. 可以使用 Hortonworks Ambari 或 Cloudera Manager 配置邊緣節(jié)點(diǎn).
在 Vertica DB 中設(shè)置 HadoopConfDir 參數(shù), 其路徑應(yīng)該包括一個(gè)含有 core-site.xml 和 hdfs-site.xml 文件的目錄.
ALTER DATABASE mydb SET HadoopConfDir = '/hadoop/hcat/conf';
驗(yàn)證配置是否正確:
select VERIFY_HADOOP_CONF_DIR( )
該訪問方式效率較高,但需要注意的是,
ORC 或 Parquet 文件不得使用復(fù)雜數(shù)據(jù)類型.
由 Hive 或 Impala 壓縮的文件需要進(jìn)行 Zlib (GZIP) 或 Snappy 壓縮, 不支持 LZO 壓縮.
定義外部表時(shí),您必須定義文件中的所有列.
使用 hdfs 方案不會(huì)消除對(duì) webHDFS 服務(wù)訪問權(quán)限的需求, hdfs 方案并不適用于所有的文件. 如果 hdfs 不可用,那么 Vertica 會(huì)自動(dòng)改用 webhdfs. 可以直接使用 webhdfs:// 前綴,并指定主機(jī)名、端口和文件路徑, 讀取不受 Kerberos 保護(hù)的文件時(shí),使用 hdfs 方案可能會(huì)提供更好的性能.
[推薦] 使用 Hadoop NameService 的方式訪問 hdfs 上的數(shù)據(jù), 注意是兩個(gè) slash 的寫法, hadoopNS 這個(gè)name service 已經(jīng)在 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';
如果您在啟動(dòng) Vertica 后更新了任何Hadoop的配置文件,使用下面的語(yǔ)句強(qiáng)制更新 Vertica 中作更新.
SELECT CLEAR_HDFS_CACHES ();
HCatalog Connector 訪問方式
首先Vertica 集群需要安裝 Hadoop and hive的 jar library, 同時(shí)能拿到正確的 Hadoop 和 Hive 的配置文件(hive-site.xml/core-site.xml/yarn-site.xml/webhcat-site.xml/hdfs-site.xml).
Vertica 專門提供了 hcatUtil 工具幫助我們完成這些配置, 該工具的位置是: /opt/vertica/packages/hcat/tools/
詳細(xì)使用見 https://my.vertica.com/docs/8.1.x/HTML/index.htm
另外, 還可以配置是要使用 HiveServer2 還是 WebHCat
ALTER DATABASE mydb SET HCatalogConnectorUseHiveServer2 = 1; -- 使用 HiveServer2, 缺省模式.
ALTER DATABASE mydb SET HCatalogConnectorUseHiveServer2 = 0; -- 使用 WebHCat, 效率比 HiveServer2 好.
集群Linux 完成安裝后, 還需要在 Vertica DB 中安裝必要的Udx庫(kù), Vertica 8.1缺省未安裝.
首先通過下面SQL驗(yàn)證 VHCatalogLib user_lib 是否已經(jīng)安裝?
select * from user_library_manifest where user_library_manifest.lib_name = 'VHCatalogLib';
如果沒有安裝的化, 需要先安裝, vsql -f /opt/vertica/packages/hcat/ddl/install.sql
創(chuàng)建 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驗(yàn)證 HdfsSource user_lib 是否已經(jīng)安裝? Vertica 8.1缺省已經(jīng)安裝.
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 方式
共享集群暫時(shí)不做過多研究, 需要?jiǎng)?chuàng)建 HDFS 存儲(chǔ)位置
=> 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');
導(dǎo)出到HDFS
EXPORT TO PARQUET 可以支持本地導(dǎo)出, 也可以導(dǎo)出到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;
使用第三方庫(kù) ParallelExport 導(dǎo)出到HDFS
EXPORT TO PARQUET 的導(dǎo)出格式必須是 Parquet, 第三方函數(shù) ParallelExport 支持很多中導(dǎo)出格式, 但效率比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;
總結(jié)
以上是生活随笔為你收集整理的Vertica系列:Vertica和Hadoop的互操作性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Spring]-各种标注-零配置
- 下一篇: CANVAS运用-对图片的压缩上传(仅针