news 2026/5/19 18:53:21

hadoop冷热数据分离

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hadoop冷热数据分离

将Hive表的历史数据从三副本改为单副本,以节省存储空间
对于历史数据的副本数调整,修改全局配置后(hdfs-site.xml中的dfs.replication默认副本数)只影响设置生效后新写入的数据。历史数据的副本数不会改变,必须手动执行命令来降低。另外只是对历史数据进行副本减少,近期数据还是要保持三副本。

createtabletmp.tmp_20260513(client_id stringcomment'客户号',statusintcomment'状态')comment'客户信息'partitionedby(etl_dateintcomment'分区日期');showcreatetabletmp.tmp_20260513;--CREATE TABLE `tmp`.`tmp_20260513`(--`client_id` string COMMENT '客户号',--`status` int COMMENT '状态')--COMMENT '客户信息'--PARTITIONED BY (--`etl_date` int COMMENT '分区日期')--ROW FORMAT SERDE--'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'--STORED AS INPUTFORMAT--'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'--OUTPUTFORMAT--'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'--LOCATION--'hdfs://HDFS78000003/usr/hive/warehouse/tmp.db/tmp_20260513'--TBLPROPERTIES (--'transient_lastDdlTime'='1778721013')insertoverwritetabletmp.tmp_20260513partition(etl_date=20260513)select'11234875'asclient_id,1asstatus;insertintotabletmp.tmp_20260513partition(etl_date=20260513)select'11234876'asclient_id,1asstatus;select*fromtmp.tmp_20260513;-- client_id status etl_date-- 11234875 1 20260513-- 11234876 1 20260513

1 查看块副本数

hdfs fsck/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513-files-blocks-locations/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0 640 bytes,replicated: replication=3,1 block(s): OK 0.BP-1541143118-172.18.206.123-1735650027318:blk_1235574560_161842301 len=640 Live_repl=3[DatanodeInfoWithStorage[172.18.206.139:4001,DS-f530050e-a0ba-45c5-95b2-9bcf77fdc740,DISK], DatanodeInfoWithStorage[172.18.206.141:4001,DS-e776bcbb-6a79-4389-a6f7-9bd95dea743c,DISK], DatanodeInfoWithStorage[172.18.206.140:4001,DS-8aa75b83-28f8-4dd6-9e6c-f3cd836183ac,DISK]]/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0_copy_1 640 bytes,replicated: replication=3,1 block(s): OK 0.BP-1541143118-172.18.206.123-1735650027318:blk_1235575151_161842892 len=640 Live_repl=3[DatanodeInfoWithStorage[172.18.206.133:4001,DS-ed3ce38d-f3c9-4933-8903-d17165a540fe,DISK], DatanodeInfoWithStorage[172.18.206.142:4001,DS-3719e56a-2a38-47fb-81bf-df7517d1de47,DISK], DatanodeInfoWithStorage[172.18.206.127:4001,DS-05f6611e-1173-4334-94a5-d3fb9907c80d,DISK]]The filesystem under path'/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513'is HEALTHY · 路径:/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513 · 文件数:2个小文件(每个640字节)· 副本数:replication=3(每个块都分布在3个不同的DataNode上,且存储介质都是DISK)· 状态:HEALTHY,无缺失/损坏块 hdfs dfs-ls/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513--2个640字节文件 Found 2 items-rw-r--r--3 san.zhang supergroup 640 2026-05-14 09:13/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0-rw-r--r--3 san.zhang supergroup 640 2026-05-14 09:15/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0_copy_1 hdfs dfs-du-h/usr/hive/warehouse/tmp.db/tmp_20260513;1.3 K 3.8 K/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513

2 有小文件,需要合并减少磁盘占用

SEThive.exec.dynamic.partition.mode=nonstrict;SEThive.merge.mapfiles=true;SEThive.merge.mapredfiles=true;SEThive.merge.size.per.task=268435456;-- 256MB,目标文件大小SEThive.merge.smallfiles.avgsize=16777216;-- 平均文件小于16MB则触发合并INSERTOVERWRITETABLEtmp.tmp_20260513PARTITION(etl_date='20260513')SELECTclient_id,statusFROMtmp.tmp_20260513WHEREetl_date='20260513';hdfs dfs-ls/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513--合完以后变成1个665字节文件Found1items-rw-r--r-- 3 san.zhang supergroup 665 2026-05-14 09:57 /usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0

3 修改hdfs文件副本

hdfs dfs-setrep-R-w 1/user/hive/warehouse/[database_name].db/[table_name]/[partition]-setrep:设置副本因子(replication factor)-R:递归处理子目录-w:等待操作完成(即同步等待,直到所有块的副本数调整完毕)-1:目标副本数/path...*:使用shell通配符匹配多个分区目录(如dt=20240101,dt=20241231等)

示例:将所有 dt 在 2024-05-13 及之前的分区改为 1 副本

hive-e"use mydb; show partitions my_table;"|grep-E"dt=[0-9]{4}-[0-9]{2}-[0-9]{2}"|whileread partition;dodt_val=$(echo$partition|cut-d'='-f2)# 比较日期是否 <= 2024-05-13(一年前的今天)if[["$dt_val"<"2024-05-14"]];then hdfs_path="/user/hive/warehouse/mydb.db/my_table/$partition"echo"降副本:$hdfs_path"hdfs dfs-setrep-R-w 1"$hdfs_path"fi done#2024年全年的分区数据设置副本数为2(递归)hdfs dfs-setrep-R-w 2/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=2024*
# 改为两副本hdfs dfs-setrep-R-w 2/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513 hdfs dfs-ls/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513 Found 1 items-rw-r--r--2 san.zhang supergroup 665 2026-05-14 09:57/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0# 改为一副本hdfs dfs-setrep-R-w 1/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513 hdfs dfs-ls/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513 Found 1 items-rw-r--r--1 san.zhang supergroup 665 2026-05-14 09:57/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0

4 验证查看块副本数

hdfs fsck <分区路径>-files-blocks-locations hdfs fsck/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513-files-blocks-locations/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/000000_0 665 bytes,replicated: replication=1,1 block(s): OK 0.BP-1541143118-172.18.206.123-1735650027318:blk_1235588796_161856537 len=665 Live_repl=1[DatanodeInfoWithStorage[172.18.206.136:4001,DS-abad2fb5-a6c7-4d14-9c67-40523da553e3,DISK]]The filesystem under path'/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513'is HEALTHY · 路径:/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513 · 文件数:1个小文件(每个665字节)· 副本数:replication=1(每个块都分布在1个不同的DataNode上,且存储介质都是DISK)· 状态:HEALTHY,无缺失/损坏块

5 合并小文件的方法(按推荐顺序)
方法一:Hive Concatenate(仅支持ORC/Parquet格式)
如果表文件格式是ORC或Parquet,可以直接合并:

ALTERTABLEtmp.tmp_20260513PARTITION(etl_date='20260513')CONCATENATE;

· 优点:简单,不会产生临时数据,原地合并。
· 限制:只支持ORC/Parquet;合并后文件大小会接近HDFS块大小(通常128MB/256MB),但无法精确控制。

方法二:INSERT OVERWRITE(通用,任意文件格式)
无论文件格式是什么(TextFile、SequenceFile等),都可以通过重写分区来合并:

SEThive.exec.dynamic.partition.mode=nonstrict;SEThive.merge.mapfiles=true;SEThive.merge.mapredfiles=true;SEThive.merge.size.per.task=268435456;-- 256MB,目标文件大小SEThive.merge.smallfiles.avgsize=16777216;-- 平均文件小于16MB则触发合并INSERTOVERWRITETABLEtmp.tmp_20260513PARTITION(etl_date='20260513')SELECTclient_id,statusFROMtmp.tmp_20260513WHEREetl_date='20260513';

· 原理:启动一个MapReduce或Tez作业读取原数据,写入时自动合并成设定大小的文件。
· 注意:执行期间原分区数据会被覆盖,请确保没有并发写入。如果数据重要,可先备份分区到临时目录。

方法三:使用Hive小文件合并工具(Hive 3.0+)
使用 hive --service merge 命令:

hive--service merge \--table tmp.tmp_20260513 \--partition etl_date=20260513 \--size 256 \--output/tmp/merged_output

(具体参数视版本而定,不如方法二常用)

方法四:Hadoop Archive(HAR)
将小文件打包成HAR文件,减少NameNode内存占用,但查询性能可能下降(需特殊URL访问)。不推荐用于后续频繁分析。

hadoop archive-archiveNamedata.har-p/usr/hive/warehouse/tmp.db/tmp_20260513/etl_date=20260513/output/dir

6 注意事项与风险
· 数据丢失风险:单副本意味着一旦存储该数据的节点损坏,数据将彻底丢失。操作前务必确认这些数据可以从原始数据源回溯或已备份至冷存储(如OSS)再操作。
· 读取性能影响:HDFS的"短路读取"特性在本地副本可用时性能最佳。降为单副本后,若读取任务被调度到非数据所在节点,可能引发额外的跨节点读取网络开销。
· Block复制风暴:使用-setrep -w时,NameNode会调度DataNode立即开始删除多余副本,这可能产生较大的集群内部网络IO。
· 小文件陷阱:若表中存在大量小文件(远小于128MB),降低副本数的收益有限。建议先合并小文件。
· 新写入的分区依然会是三副本(取决于集群默认副本设置),除非手工调整或提前设置set dfs.replication=1;。
· 恢复全局设置:若希望恢复默认设置,将该值改回3,并再次运行hdfs dfs -setrep -R -w 3

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 15:46:03

3分钟永久激活Windows和Office:KMS_VL_ALL_AIO完整指南

3分钟永久激活Windows和Office&#xff1a;KMS_VL_ALL_AIO完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗&#xff1f;KMS_VL_ALL_AIO是你的终极解决方案&…

作者头像 李华
网站建设 2026/5/18 15:45:05

使用Taotoken后我们如何观测与优化AI接口用量成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken后我们如何观测与优化AI接口用量成本 1. 背景&#xff1a;从集成到成本感知 在将大模型能力集成到我们的在线服务后&…

作者头像 李华
网站建设 2026/5/18 15:43:20

开源威胁情报平台F0x1d/Sense:模块化设计与自动化安全运营实战

1. 项目概述&#xff1a;一个为安全运营而生的开源情报平台如果你和我一样&#xff0c;长期在安全运营中心&#xff08;SOC&#xff09;、威胁情报分析或者渗透测试的岗位上工作&#xff0c;那么你一定对“信息过载”和“工具碎片化”这两个词深有体会。每天&#xff0c;我们需…

作者头像 李华
网站建设 2026/5/18 15:40:01

Redis通信协议-RESP协议

一、前言&#xff1a;高效通信的基石当我们使用 redis-cli 执行一条 SET name "Redis" 命令时&#xff0c;背后发生了一系列精妙的通信过程。客户端如何告诉服务器它想执行什么命令&#xff1f;服务器又如何将“OK”这个结果准确无误地返回给客户端&#xff1f;这一切…

作者头像 李华
网站建设 2026/5/18 15:35:21

深入解析Enso:构建高性能可编程代理与API网关的Go框架

1. 项目概述&#xff1a;一个被低估的“瑞士军刀”如果你在开源社区里混迹过一段时间&#xff0c;大概率见过这样的场景&#xff1a;一个项目仓库&#xff0c;名字起得挺酷&#xff0c;比如“Enso”&#xff0c;简介里写着“一个现代化的代理工具”&#xff0c;但点进去一看&am…

作者头像 李华