1. 背景与风险说明
1.1 背景
当集群存储资源紧张,且数据为可容忍丢失的测试、备份或临时数据时,将HDFS的副本数从默认的3降低为1,可以显著节省存储空间(约节省2/3)。
风险等级: ⚠️ 高风险(操作前请务必阅读并理解风险说明)
1.2 风险声明(必读)
- 数据丢失风险:副本数为1意味着数据无冗余。一旦存储该副本的节点发生磁盘故障、节点宕机或网络问题,该数据将永久丢失,无法恢复。
- 集群安全模式风险:当有节点故障时,NameNode可能因检测到大量缺失的Block而进入安全模式,导致整个HDFS集群只读或不可用。
- 适用场景限制:此操作仅适用于测试、开发或可容忍数据丢失的备份环境。生产环境严禁使用。 如果生产环境存储空间不足,建议优先考虑扩容磁盘或清理无用数据(如HDFS回收站、临时文件、日志等)。
建议:在操作前,请与您的项目负责人或客户确认风险,并建议通过邮件等方式进行书面留痕。
2. 操作步骤
操作分为两步:修改全局配置(影响新写入的文件)和 修改存量数据(影响已有文件)。
2.1 修改全局配置(影响新文件)
此步骤确保后续新写入HDFS的文件副本数为1。
1. 登录Transwarp Manager管理页面。
2. 进入 HDFS 服务。
3. 点击 配置 标签页。
4. 在搜索框中输入 dfs.replication,找到该参数,将其值修改为 1。
· 如果该参数不存在,请在 hdfs-site.xml 配置文件中点击 添加自定义参数,键为 dfs.replication,值为 1。
5. 点击配置服务。
6. 重启HDFS服务(包括NameNode和DataNode),使配置生效。
注意:此操作后,新写入的文件副本数将为1。但存量文件不受影响,仍需执行下一步。
2.2 修改存量数据(影响已有文件)
此步骤将HDFS上已有的文件副本数从3(或其它值)修改为1。
# 1.设置维护模式环境变量(每次执行setrep命令前都需要设置):
bash
export HADOOPCLIENTOPTS="-Dtranswarp.maintenance.only.mode=true"
# 2.执行递归副本数修改命令:
bash
hdfs dfs -setrep -R 1 /path/to/directory
· -R:递归处理指定目录下的所有文件。
· 1:目标副本数。
· /path/to/directory:需要修改的HDFS路径。
# 3.验证修改结果:
bash
hdfs fsck /path/to/directory -files -blocks -locations | grep "Target Replicas"
#正常结果应显示 Target Replicas: 1。
重要提示:
- setrep 操作是异步的,执行后需要等待后台DataNode完成副本调整。对于大数据量文件,可能需要较长时间。
- 建议分批执行,避免一次性消耗过多网络带宽和磁盘IO,影响其他业务。
3. 验证方法
- 检查新写入文件:在HDFS上创建一个新文件,使用 hdfs fsck 命令检查其副本数是否为1。
- 检查存量文件:对已执行 setrep 的目录,再次使用 hdfs fsck 命令确认副本数已变为1。
- 检查集群状态:在Manager页面查看HDFS服务状态,确保NameNode和DataNode运行正常,无安全模式告警。
4. 常见问题 (FAQ)
Q1: 修改了dfs.replication参数并重启HDFS后,为什么写入的文件副本数还是3?
A1: 这是因为dfs.replication是一个客户端参数。如果您的数据是通过第三方工具(如DataX、Sqoop)或应用程序写入的,这些客户端可能没有读取HDFS服务端的最新配置。您需要在客户端侧也显式设置该参数:
· 对于DataX/Spark/MapReduce任务:在任务配置或代码中设置 dfs.replication=1。
· 对于Inceptor/ArgoDB:需要在Inceptor服务的 hive-site.xml 中添加自定义参数 dfs.replication=1,然后重启Inceptor服务。
· 对于TDH-Client:需要重新下载TDH-Client,确保 conf/hdfs/ 目录下的配置文件是最新的。
Q2: 如何将某个特定表(如ORC表)的副本数改为1?
A2: 使用 hdfs dfs -setrep 命令修改该表在HDFS上的数据目录即可。例如,表 mytable 在HDFS上的路径通常为 /user/hive/warehouse/yourdatabase.db/my_table。执行:
export HADOOPCLIENTOPTS="-Dtranswarp.maintenance.only.mode=true"
hdfs dfs -setrep -R -w 1 /user/hive/warehouse/yourdatabase.db/mytable
-w 参数表示等待操作完成。
Q3: 如果后续需要恢复副本数,该怎么办?
A3: 将 dfs.replication 的值改回3(或您需要的值),重启HDFS。然后对存量数据再次执行 setrep 命令,将副本数改回3。注意,恢复操作同样会消耗网络和IO资源。