HDFS 存储策略 API:自定义策略开发实践
Hadoop分布式文件系统(HDFS)是Hadoop生态系统中的核心组件,它提供了高吞吐量的数据存储解决方案,适用于大规模数据集。HDFS的存储策略对于提高数据存储效率和系统性能至关重要。本文将围绕HDFS存储策略API,探讨自定义策略的开发实践。
HDFS 存储策略概述
HDFS存储策略主要涉及数据块的存储位置、副本数量和副本分配等。HDFS默认的存储策略是轮询策略(Round-Robin),它将数据块均匀地分配到所有数据节点上。在实际应用中,不同的数据访问模式和存储需求可能需要不同的存储策略。
HDFS 存储策略 API
HDFS提供了存储策略API,允许用户自定义存储策略。以下是一些关键的API:
1. `org.apache.hadoop.hdfs.protocol.DatanodeStorageType`:定义了数据块的存储类型,如SSD、HDD等。
2. `org.apache.hadoop.hdfs.protocol.DatanodeInfo`:提供了数据节点的详细信息,包括存储类型、存储容量等。
3. `org.apache.hadoop.hdfs.protocol.HdfsConfiguration`:用于配置HDFS的参数。
4. `org.apache.hadoop.hdfs.protocol.DatanodeStorage`:表示数据节点的存储信息。
5. `org.apache.hadoop.hdfs.protocol.DatanodeStorageReport`:表示数据节点的存储报告。
自定义存储策略开发实践
1. 环境准备
确保你已经安装了Hadoop环境,并且能够编译和运行Hadoop代码。
2. 创建自定义存储策略类
创建一个继承自`org.apache.hadoop.hdfs.protocol.DatanodeStorageType`的类,用于定义自定义的存储类型。
java
public class CustomStorageType extends DatanodeStorageType {
public CustomStorageType() {
super("CUSTOM_STORAGE");
}
}
3. 实现存储策略逻辑
在自定义存储策略类中,实现存储策略的逻辑。以下是一个简单的示例,根据数据块的访问频率来决定存储位置。
```java
public class CustomStoragePolicy extends StoragePolicy {
@Override
public StorageType chooseStorageType(DatanodeStorageReport[] reports, StorageType[] existingTypes, long[] existingUtilizations, long[] existingUtilizationsLimit, long[] existingUtilizationsSnapshots, long[] existingUtilizationsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshots, long[] existingUtilizationsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshots, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnapshotsSnapshotsSnapshotsSnapshotsLimit, long[] existingUtilizationsSnap
Comments NOTHING