除了本地 Linux 文件系统之外,还可以将存储位置放在 HDFS 中。因为 HDFS 存储位置不在本地,所以查询它们可能会更慢。您可以将 HDFS 存储位置用于优先级较低的数据或很少查询的数据(冷数据)。将优先级较低的数据移至 HDFS 可以释放 Vertica 群集上的空间以存储优先级较高的数据。
如果在 Apache Hadoop 上使用 Vertica for SQL,则通常仅将存储位置放在 HDFS 上。
除了本地 Linux 文件系统之外,还可以将存储位置放在 HDFS 中。因为 HDFS 存储位置不在本地,所以查询它们可能会更慢。您可以将 HDFS 存储位置用于优先级较低的数据或很少查询的数据(冷数据)。将优先级较低的数据移至 HDFS 可以释放 Vertica 群集上的空间以存储优先级较高的数据。
如果在 Apache Hadoop 上使用 Vertica for SQL,则通常仅将存储位置放在 HDFS 上。
要将 Vertica 的数据存储在 HDFS 上,请执行以下操作:
确认您的 Hadoop 群集已启用 WebHDFS。
确认 Vertica 群集中的所有节点均可连接到 Hadoop 群集中的所有节点。两个群集之间的任何防火墙都必须允许在 HDFS 使用的端口上建立连接。
在 HDFS 群集不安全时,确认您有一个 Hadoop 用户,其用户名与 Vertica 数据库超级用户(通常名为 dbadmin)的名称匹配。该 Hadoop 用户必须具有您希望 Vertica 用于存储其数据的 HDFS 目录的读写权限。
确认在 HDFS 群集使用 Kerberos 身份验证时:
您拥有 Vertica 的 Kerberos 主体,该主体对将用于存储位置的 HDFS 目录具备读写权限。有关说明,请参阅下面的 Kerberos。
Kerberos KDC 正在运行。
确认您的 HDFS 群集具有足以容纳 Vertica 数据的存储空间。有关详细信息,请参阅下面的空间要求。
确认您在支持 HDFS 的存储位置存储的数据不会将数据库大小扩展到超出 Vertica 许可证中规定的任何数据限额。Vertica 将支持 HDFS 的存储位置中存储的数据视为许可证规定的任何数据限额的一部分。有关详细信息,请参阅《管理员指南》中的管理许可证。
备份/还原还有其他要求。
如果 Vertica 数据库属于 K-safe,基于 HDFS 的存储位置包含您在该位置中存储的数据的两个副本。一个副本为主投影,另一个为同伴投影。如果您已启用 HDFS 的数据冗余功能,Hadoop 会将这两个投影存储多次。这种重复可能看似有些过多。但它与 RAID 1 级或更高级别存储主投影和伙伴实例投影的冗余副本的方式类似。冗余副本还可通过启用多个节点处理文件请求,帮助提高 HDFS 的性能。
验证 HDFS 安装有足够的空间可用于冗余存储 K-safe 数据的主投影和同伴投影。您可以通过设置 HadoopFSReplication
配置参数,调整 HDFS 存储的副本数量。有关详细信息,请参阅对 HDFS 存储位置进行故障排除。
要将 HDFS 中的存储位置与 Kerberos 一起使用,请执行以下附加步骤:
为每个 Vertica 节点创建 Kerberos 主体,如将 Kerberos 与 Vertica 结合使用中所述。
授予所有节点主体对将用作存储位置的 HDFS 目录的读写权限。
如果您计划使用 vbr
来备份和还原位置,请参阅备份和还原 HDFS 存储位置的要求中的其他要求。
如果将节点添加到 Vertica 群集中,它们不会自动拥有对现有 HDFS 存储位置的访问权限。您必须使用 CREATE LOCATION 语句,为新节点手动创建存储位置。请不要在此语句中使用 ALL NODES 选项,而应该使用 NODE 选项提供新节点的名称,以告知 Vertica 只有该节点需要添加共享位置。
请考虑一个借助于以下语句在三节点群集上创建的 HDFS 存储位置:
=> CREATE LOCATION 'hdfs://hadoopNS/vertica/colddata' ALL NODES SHARED
USAGE 'data' LABEL 'coldstorage';
=> SELECT SET_OBJECT_STORAGE_POLICY('SchemaName','coldstorage');
以下示例显示了如何将存储位置添加到新群集节点:
=> CREATE LOCATION 'hdfs://hadoopNS/vertica/colddata' NODE 'v_vmart_node0004'
SHARED USAGE 'data' LABEL 'coldstorage';
当您创建 HDFS 存储位置时,群集中的所有活动备用节点均将自动创建其自己的位置实例。而当备用节点替代出现故障的节点后,它会采用 HDFS 存储策略,使用自己的位置实例存储对象数据。请将存储位置创建后添加的备用节点视为任何其他新节点。您必须手动定义 HDFS 存储位置。
Vertica 将数据存储在 HDFS 上的存储位置与它在 Linux 文件系统中存储数据的方式相似。如果您在 HDFS 上创建存储位置,Vertica 会将容纳其数据的 ROS 容器存储在 HDFS 上。您可以选择让哪些数据使用 HDFS 存储位置:从仅单个表或分区的数据到数据库的所有数据。
当 Vertica 从 HDFS 存储位置读取数据或向 HDFS 存储位置写入数据时,存储或检索该数据的节点会直接连接 Hadoop 群集以传输数据。如果一个单 ROS 容器文件拆分到多个 HDFS 节点,Vertica 节点将连接到每个节点。Vertica 节点将检索文件片段,然后重新组合文件。由于每个节点直接从来源提取其自己的数据,因此将并行传输数据,从而提高传输效率。让 Vertica 节点直接检索文件拆分片段还可以降低对 Hadoop 群集的影响。
请用 HDFS 存储位置只存储数据。您不能在 HDFS 存储位置中存储编录信息。
由于 Vertica 使用存储位置以专用格式存储 ROS 容器,因此 MapReduce 和其他 Hadoop 组件无法访问 HDFS 中存储的 Vertica ROS 数据。切勿允许具有 HDFS 访问权限的其他程序写入到 ROS 文件。在外部对这些文件所做的任何修改均可能导致数据损坏和丢失。应用程序必须使用 Vertica 客户端库来访问 Vertica 数据。如果您想与其他 Hadoop 组件共享 ROS 数据,可以将其导出(请参阅文件导出)。
如果您在 Apache Hadoop 产品上使用 Vertica for SQL,Vertica 建议针对存储位置采用以下最佳实践:
只将数据类型存储位置放在 HDFS 存储上。
将临时空间直接放在本地 Linux 文件系统(而不是 HDFS)中。
为获得最佳性能,请将 Vertica 编录直接放在本地 Linux 文件系统上。
首先在本地 Linux 文件系统上创建数据库。然后,您可以将数据库扩展至 HDFS 存储位置,并设置只将数据块放在 HDFS 存储位置的存储策略。
如果仅在部分 HDFS 节点上运行 Vertica,请勿在这些节点上运行 HDFS 平衡器,以便获得更好的性能。HDFS 平衡器会将数据块移动至较远的距离,导致 Vertica 在执行查询期间读取非本地数据。不需要执行网络 I/O 时,查询运行速度更快。
一般来说,HDFS 要为群集中的每个节点准备 2 GB 左右的内存。要在 Vertica 配置中支持此要求:
创建一个 2 GB 资源池。
不要为此池分配任何 Vertica 执行资源。此方法可保留 HDFS 使用的空间。
或者,使用 Ambari 或 Cloudera Manager 查找 HDFS 所需的最大堆大小并将资源池的大小设置为该值。
有关如何配置资源池的详细信息,请参阅管理工作负载。
本主题将介绍 HDFS 存储位置的一些常见问题。
默认情况下,HDFS 为其存储的每个文件制作三个副本。这种复制有助于防止由磁盘或系统故障导致的数据丢失。还可以通过允许多个节点处理一个文件请求,来帮助提高性能。
K-Safety 值为 1 或更大的 Vertica 数据库还使用伙伴实例投影以冗余方式存储其数据。
当 K-Safe Vertica 数据库将数据存储在 HDFS 存储位置时,其数据冗余会因为 HDFS 的冗余而增加。HDFS 将存储主投影数据的三个副本外加伙伴实例投影的三个副本,从而总共存储数据的六个副本。
如果您想降低 HDFS 位置使用的磁盘存储量,您可以更改 HDFS 存储的数据副本数量。名为 HadoopFSReplication 的 Vertica 配置参数控制 HDFS 存储的数据副本数量。
您可以通过登录到 Hadoop NameNode 并发出以下命令,确定当前的 HDFS 磁盘使用情况:
$ hdfs dfsadmin -report
此命令可打印出整个 HDFS 存储的使用情况,后面则是 Hadoop 群集中各个节点的详细信息。下面的示例显示了此命令输出的开头部分,其中磁盘总空间已突出显示:
$ hdfs dfsadmin -report
Configured Capacity: 51495516981 (47.96 GB)
Present Capacity: 32087212032 (29.88 GB)
DFS Remaining: 31565144064 (29.40 GB)
DFS Used: 522067968 (497.88 MB)
DFS Used%: 1.63%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
. . .
将一个简单的百万行表加载到 HDFS 存储位置中存储的一个表之后,报告将显示更大的磁盘使用量:
Configured Capacity: 51495516981 (47.96 GB)
Present Capacity: 32085299338 (29.88 GB)
DFS Remaining: 31373565952 (29.22 GB)
DFS Used: 711733386 (678.76 MB)
DFS Used%: 2.22%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
. . .
以下 Vertica 示例演示了下列操作:
在 HDFS 上创建存储位置。
删除 Vertica 中的表。
将 HadoopFSReplication 配置选项设置为 1。这将规定 HDFS 存储 HDFS 存储位置数据的一个副本。
重新创建表并重新加载数据。
=> CREATE LOCATION 'hdfs://hadoopNS/user/dbadmin' ALL NODES SHARED
USAGE 'data' LABEL 'hdfs';
CREATE LOCATION
=> DROP TABLE messages;
DROP TABLE
=> ALTER DATABASE DEFAULT SET PARAMETER HadoopFSReplication = 1;
=> CREATE TABLE messages (id INTEGER, text VARCHAR);
CREATE TABLE
=> SELECT SET_OBJECT_STORAGE_POLICY('messages', 'hdfs');
SET_OBJECT_STORAGE_POLICY
----------------------------
Object storage policy set.
(1 row)
=> COPY messages FROM '/home/dbadmin/messages.txt';
Rows Loaded
-------------
1000000
现在在 Hadoop 上运行 HDFS 报告将显示磁盘空间使用量减少:
$ hdfs dfsadmin -report
Configured Capacity: 51495516981 (47.96 GB)
Present Capacity: 32086278190 (29.88 GB)
DFS Remaining: 31500988416 (29.34 GB)
DFS Used: 585289774 (558.18 MB)
DFS Used%: 1.82%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
. . .
将数据加载到小型 Hadoop 群集(数据节点不超过 5 个)上的存储位置时,您可能会遇到错误 6966。此错误是由 HDFS 管理写入管道和复制的方式引起的。您可以通过减少副本数量来缓解此问题,如 [HDFS 存储磁盘消耗](#HDFS Sto)中所述。有关可以在 Hadoop 群集中进行的配置更改,请参阅 Hortonworks 中的这篇博文。
如果 HDFS 使用 Kerberos 身份验证,那么 CREATE LOCATION 语句将使用 Vertica keytab 主体而不是执行操作的用户的主体进行身份验证。如果因为身份验证错误导致创建失败,请验证您已遵循 Kerberos 中所述的步骤来配置此主体。
如下面的示例所示,使用 Kerberos 在 Hadoop 群集上创建 HDFS 存储位置时,CREATE LOCATION 可以报告正在使用的主体:
=> CREATE LOCATION 'hdfs://hadoopNS/user/dbadmin' ALL NODES SHARED
USAGE 'data' LABEL 'coldstorage';
NOTICE 0: Performing HDFS operations using kerberos principal [vertica/hadoop.example.com]
CREATE LOCATION
有关 HDFS 存储位置的备份/还原问题,请参阅备份和还原故障排除。