HAWQ++可插拔外部存储
HAWQ++在2.1.0版本中发布了一个新功能:可插拔外部存储。该功能在保留了原有外部表数据读写框架的基础上引入了增强的外部表读写框架。
通过新框架HAWQ++可以支持更加高效地访问更多类型外部存储,实现对外部表数据的弹性执行,从而给用户提供更简单更有效的数据导入和导出方案,甚至在一些场景中HAWQ++可直接支持用户对外部表数据的进行分析和查询。
开发人员可以轻松的通过注册UDF的方式支持新的文件系统和文件格式。当前HAWQ++正式发布版已支持直接构建外部表读写HDFS文件系统上的CSV和TEXT格式文件,且读写并发性能优化更加智能和富有弹性。HDFS外部表实现比较PXF方案性能有数倍提升。
HAWQ++可插拔外部存储支持原理
此前HAWQ依赖PXF访问外部数据,而PXF采用JAVA实现的外部代理方式。因此在整个数据传输路径中有多次数据转换,整体性能不尽人意。同时PXF采用固有并行度的方式提供外部代理,其数据导入导出的并发控制死板且PXF可靠性方案实施复杂。在HAWQ++中该特性的提出致力于提出替代PXF的外部数据读写方案,通过缩短数据处理路径,提高数据处理效率,充分发挥HAWQ弹性执行引擎优化能力,实现性能更优使用更简单灵活且更可靠的外部存储读写。
简化的数据传输接口
原有的HAWQ外部表数据读写框架通过两阶段实现:如下图所示,在读外部存储数据的场景中,数据首先被文件系统协议实现UDF读取写入到内部内存缓冲区,然后第二阶段的格式识别UDF解释缓冲区中的数据得到数据库记录,在写外部存储数据的场景中,数据流动方向相反。这种设计提供了实现灵活性,但却不适合特殊的外部存储如HBASE;同样不可避免的数据两次复制也严重影响数据传输性能。而当前HAWQ++引入的新接口合并了文件系统协议实现和文件格式识别的逻辑,即实现的UDF直接提供解释完成的数据库记录或直接写出数据库记录。这利于引入更新的数据处理实现技术,利于提供更高性能的数据读写实现。新的接口更加灵活,它也能在未来更好支持类似HBASE等特殊类型存储的数据读写。
弹性的执行引擎
HAWQ++同样针对外部表访问优化进行了增强,HAWQ++可以自动识别当前HDFS文件系统中外部表的数据分布,以此为依据可以充分发挥HAWQ++的MPP++弹性执行引擎。引擎对外部表和内部表采用一致处理逻辑,即根据表规模、HAWQ++资源队列定义、数据库资源利用率等动态调整集群中的外部表读写并发数,根据数据分布选择最优的计算节点分布,从而达到优化和灵活控制外部表访问性能的效果。由于HAWQ++弹性引擎将动态选择低负载的健康节点进行数据处理,天然支持了导入导出方案的可靠性问题。
HDFS外部表支持
HAWQ++当前版本(2.1.1)支持HDFS协议的外部表,支持的格式为CSV和TEXT。HAWQ++针对HDFS外部存储的数据读写实现是完全C/C++的,依据的HDFS读写库同样为C/C++实现的libHDFS3。这保障了HAWQ++的HDFS外部表支持在实现上是极其高效的。未来HAWQ++将根据实际需要扩展支持更多更广泛的外部数据存储协议和文件格式,并持续改进数据读写提高端到端性能。
更进一步的,HAWQ++支持的可写外部表默认支持读取数据,这进一步在外部行为上简化了外部表使用方法,方便用户在实际业务场景中构建更简单高效的数据导入导出方案。
HAWQ++ HDFS外部表操作实例
用户使用HAWQ++的外部表非常简单,在数据导入场景中,用户只需要三步即可实现数据导入,对比PXF方案安装和使用都更加便捷:
同样在数据导出场景中,使用HDFS外部表用户只需要两步即可实现数据导出:1)创建可写外部表,2)使用INSERT INTO SELECT语句将数据导出。其中,创建外部表支持自动创建不存在的导出路径。下面基于简单例子,实际了解如果创建和使用HDFS外部表。
创建和删除HDFS外部表
与原外部表创建删除方式一样,使用中只需要在LOCATION字段中指定是hdfs协议即可。
CREATE WRITABLE EXTERNAL TABLE sales_ext
(a INT, b DOUBLE PRECISION)
LOCATION ('hdfs://localhost:8020/sales')
FORMAT 'csv' (DELIMITER '|');
DROP EXTERNAL TABLE sales_ext;
详细命令参数可参考
http://oushu.io/docs/hawq/reference/sql/create-external-table/
http://oushu.io/docs/hawq/reference/sql/drop-external-table/
读取HDFS外部表
对于一个已创建的外部表或可写外部表,都可以对其进行读取,如使用如下语句将外部表数据导入一个内部表中。
INSERT INTOsales_int SELECT * FROM sales_ext;
也可以使用如下语句直接加工过滤和提取感兴趣的数据。
SELECT a, AVG(b) FROM sales_ext WHERE b > 1000.00 GROUP BY a;
写入HDFS外部表
用户只能对一个可写外部表写入数据,写入外部表数据可以作为一种快速的数据导出手段使用。如下语句将时间数据的导出。导出完成后用户可从外部表对应的文件路径找到导出的CSV或TEXT格式的文件。特别的,在HAWQ++中用户也可以在导出数据后对同一个可写外部表进行查询访问。
INSERT INTO sales_ext SELECT * FROM sales_int;
HDFS外部表选项
选项 | 含义 | 默认值 |
DELIMITER | 指定列值分隔符。 | CSV:逗号’,’ TEXT:制表符’\t’ |
NULL | 指定代表NULL值的字符串。 | CSV:空格‘ ‘ TEXT:”\N” |
ESCAPE | 指定转义字符。HDFS外部表不支持OFF选项。 | CSV:双引号‘”‘ TEXT:反斜杠’\’ |
QUOTE | 指定引号的代替字符。 | 双引号‘”‘ |
FORCE QUOTE | 对指定列非NULL列值强制加引号。仅对CSV格式的可写外部表有效。 | N/A |
FORCE NOT NULL | 对指定列空值强制转换为空字符串。仅对CSV格式的外部表读取有效。 | N/A |
NEWLINE | 指定行分割形式。 | LF |
HEADER | 指定第一行只包含列名信息,需要忽略。 | N/A |
FILL MISSING FIELDS | 强制将为指定值的列填充NULL。 | N/A |
ENCODING | 指定外部表编码。 | 默认外部表编码 |
LOG ERRORS INTO | 将错误行内容导入错误表中。HDFS外部表的错误表也是一个外部表,HAWQ自动创建错误表外部表,用户可以通过检查pg_exttable获取自动创建的错误表路径,且用户需要手动删除错误表。 | N/A |
SEGMENT REJECT LIMIT | 当某个HAWQ VSEG上累积错误行超过指定行数,读取过程报错退出。HAWQ外部表当前只支持指定具体行数的方式,不支持百分比的方式。 | N/A |
使用HDFS
外部表实现导入导出的介绍可参考
http://oushu.io/docs/hawq/user-guide/import-export/intro/