使用 Apache HAWQ 时外部 table 和内部 table 之间的区别?

Difference between external table and internal table when using Apache HAWQ?

我正在使用 HAWQ 来处理基于列的文件。在阅读 Pivotal 文档时,他们建议用户应该使用 gpfdist 读写可读外部 table 以便以并行方式快速处理数据。

我按照文档中的建议制作了 table,并通过 SQL 确认了我的数据,如下所示。

CREATE EXTERNAL TABLE ext_data
(col1 text, col2 text,col3 text, col4 text, col5 int, col6 int, col7 int,col8 int)
LOCATION ('gpfdist://hawq2:8085/*.csv')
FORMAT 'CSV'(DELIMITER ',');

SELECT gp_segment_id,count(*) from ext_data GROUP BY gp_segment_id;

数据均匀分布在所有从节点上。

之前我的目标是创建 table,从文件中读取数据并确定加载的数据分布良好。它是通过上述过程使用 gpfdist 实现的。

但问题是外部table和内部table的区别。使用外部或内部的原因是什么 table 即使两种方法具有相同的功能。

我发现一些博客,有些用户在使用 HAWQ 或 Greenplume 数据库时遵循以下步骤。

1. making external table using gpfdist
2. making internal table again
3. reading the data from external data into internal data.

我没有完全理解这种行为。最重要的是,我不知道为什么外部和内部 table 存在并且应该用于使用 Apache Hawq 或 greenplume 数据库处理数据。

使用 gpfdist

的外部 Table
  • 数据在 posix 文件系统中,而不是 HDFS
  • 无统计数据
  • 文件可能位于不属于集群的 ETL 节点上
  • 您也可以在多个服务器上拥有多个文件
  • 与内部并行加载数据的理想解决方案table

    insert into table_name select * from external_table_name;
    

内部Table

  • 数据存储在HDFS
  • 统计信息被收集并存储在目录中
  • 文件仅为 HDFS 文件
  • 您可以利用 HDFS 的功能,例如 parquet 格式和 snappy 压缩
  • 为查询提供最佳性能

外部 Table 只是使将数据加载到数据库中变得更容易,并且加载速度更快。

想想这个场景。您从需要加载的会计系统中获取一个文件。你可以这样做:

  1. 将文件scp到边缘节点
  2. hdfs 将文件放入hdfs
  3. 在HAWQ中创建外部table使用PXF读取文件
  4. 将数据插入 HAWQ table

这将起作用,PXF 将并行读取 HDFS 中的文件。但是,第2步是一个单一的流程和瓶颈。相反,这样做:

  1. 将文件scp到边缘节点
  2. 启动 gpfdist 进程
  3. 在 HAWQ 中创建外部 table 使用 gpfdist 读取文件
  4. 将数据插入 HAWQ table

现在 "put" 到 HDFS 是并行完成的,因为 HAWQ 将在每个节点上启动虚拟段来放置数据。这通常是每个数据节点 6 个虚拟段,因此在 10 节点集群中,您将有 60 个进程将数据放入 HDFS,而不是一个。