为低优先级数据创建存储策略

如果您的某些数据位于分区表中,您可以将查询较少的分区移至成本较低的存储,例如 HDFS。您仍然可以通过查询访问这些数据,只不过访问的速度更慢。在这种情况下,速度更快的存储通常被称为“热存储”,速度较慢的存储被称为“冷存储”。

假设您有一个名为 messages 的表,其中包含已按照时间戳的年份和月份分区的社交媒体消息。您可以通过查询 PARTITIONS 系统表列出表中的分区。

=> SELECT partition_key, projection_name, node_name, location_label FROM partitions
   ORDER BY partition_key;
partition_key | projection_name |    node_name     | location_label
--------------+-----------------+------------------+----------------
201309        | messages_b1     | v_vmart_node0001 |
201309        | messages_b0     | v_vmart_node0003 |
201309        | messages_b1     | v_vmart_node0002 |
201309        | messages_b1     | v_vmart_node0003 |
201309        | messages_b0     | v_vmart_node0001 |
201309        | messages_b0     | v_vmart_node0002 |
201310        | messages_b0     | v_vmart_node0002 |
201310        | messages_b1     | v_vmart_node0003 |
201310        | messages_b0     | v_vmart_node0001 |
. . .
201405        | messages_b0     | v_vmart_node0002 |
201405        | messages_b1     | v_vmart_node0003 |
201405        | messages_b1     | v_vmart_node0001 |
201405        | messages_b0     | v_vmart_node0001 |
(54 rows)

接下来,假设您发现,对此表执行的大多数查询仅访问最近一两个月的数据。您可能会决定将旧数据移至基于 HDFS 的存储位置中的冷存储。数据在移动后仍可用于查询,但查询性能会降低。

要将分区移至 HDFS 存储位置,请在 SET_OBJECT_STORAGE_POLICY 函数调用中提供最低和最高的待移动分区键值。以下示例演示了如何移动两个日期之间的数据。在此示例中:

  • 分区键值 201309 代表 2013 年 9 月。

  • 分区键值 201403 代表 2014 年 3 月。

  • 名称 coldstorage 是基于 HDFS 的存储位置的标签。

  • 最后一个可选的实参是 true,这意味着在移动完成之前,该函数不会返回。默认情况下,该函数立即返回,并在下次运行 Tuple Mover 时移动数据。但是,当数据较旧时,Tuple Mover 的运行频率会降低,这会延迟原始存储空间的恢复。

=> SELECT SET_OBJECT_STORAGE_POLICY('messages','coldstorage', '201309', '201403', 'true');

下次运行 Tuple Mover 时,指定范围内的分区将移至带有 coldstorage 标签的 HDFS 存储位置。这个位置的名称现在显示在 PARTITIONS 系统表的 location_label 列中。

=> SELECT partition_key, projection_name, node_name, location_label
   FROM partitions ORDER BY partition_key;
partition_key | projection_name |    node_name     | location_label
--------------+-----------------+------------------+----------------
201309        | messages_b0     | v_vmart_node0003 | coldstorage
201309        | messages_b1     | v_vmart_node0001 | coldstorage
201309        | messages_b1     | v_vmart_node0002 | coldstorage
201309        | messages_b0     | v_vmart_node0001 | coldstorage
. . .
201403        | messages_b0     | v_vmart_node0002 | coldstorage
201404        | messages_b0     | v_vmart_node0001 |
201404        | messages_b0     | v_vmart_node0002 |
201404        | messages_b1     | v_vmart_node0001 |
201404        | messages_b1     | v_vmart_node0002 |
201404        | messages_b0     | v_vmart_node0003 |
201404        | messages_b1     | v_vmart_node0003 |
201405        | messages_b0     | v_vmart_node0001 |
201405        | messages_b1     | v_vmart_node0002 |
201405        | messages_b0     | v_vmart_node0002 |
201405        | messages_b0     | v_vmart_node0003 |
201405        | messages_b1     | v_vmart_node0001 |
201405        | messages_b1     | v_vmart_node0003 |
(54 rows)

完成首次数据移动之后,您可以定期将额外的数据移至该 HDFS 存储位置。您可以使用相同的方法将个别分区或一系列分区从“热”存储移至“冷”存储位置:

=> SELECT SET_OBJECT_STORAGE_POLICY('messages', 'coldstorage', '201404', '201404', 'true');

=> SELECT projection_name, node_name, location_label
   FROM PARTITIONS WHERE PARTITION_KEY = '201404';
 projection_name |    node_name     | location_label
-----------------+------------------+----------------
 messages_b0     | v_vmart_node0002 | coldstorage
 messages_b0     | v_vmart_node0003 | coldstorage
 messages_b1     | v_vmart_node0003 | coldstorage
 messages_b0     | v_vmart_node0001 | coldstorage
 messages_b1     | v_vmart_node0002 | coldstorage
 messages_b1     | v_vmart_node0001 | coldstorage
(6 rows)

将分区移至 HDFS 上存储的表中

将分区从热存储移至冷存储的另一种方法是,将分区的数据移至其他存储位置中单独的表中。这种方法将数据分成两个表,一个包含热数据,另一个则包含冷数据。如果希望防止查询无意中访问存储在冷存储中的数据,您可以使用这种方法。要查询旧数据,您必须显式查询冷表。

要移动分区:

  1. 创建一个架构与现有已分区表的架构相匹配的新表。

  2. 将新表的存储策略设置为使用基于 HDFS 的存储位置。

  3. 使用 MOVE_PARTITIONS_TO_TABLE 函数,将一系列分区从热表移至冷表。这些分区将在下次运行 Tuple Mover 时迁移。

下面的示例演示了上述步骤。您首先创建一个名为 cold_messages 的表。然后向其分配名为 coldstorage 的基于 HDFS 的存储位置;最后,移动一系列分区。

=> CREATE TABLE cold_messages LIKE messages INCLUDING PROJECTIONS;
=> SELECT SET_OBJECT_STORAGE_POLICY('cold_messages', 'coldstorage');
=> SELECT MOVE_PARTITIONS_TO_TABLE('messages','201309','201403','cold_messages');