设想一座藏有几亿册书的超级图书馆。你想完成一份研究报告,需要翻阅散布在各个书库的资料。你有两种选择:把用到的书统统搬到自己的书桌前,等候漫长的整理和运输;或者带着笔记本走进书所在的书库,就地阅读摘抄。显然,第二种方案省时省力。这个朴素道理正是分布式存储计算系统里「数据局部性」的初衷——让计算这位「读者」主动去找数据这本「书」,而不是把数据千里迢迢运到计算身边。为了做到这一点,图书馆需要精心设计:书怎么分箱保存(分块与副本)、怎么快速找到书(元数据)、怎么安排读者(调度策略)、采用什么样的馆藏布局(文件系统与对象存储的差异)。这篇文章就从这四件事展开,为你串起大数据系统里的核心智慧。

岗位关联

理解数据局部性,是设计高吞吐分布式计算系统的核心能力,它解释了 Hadoop、Spark、S3 等平台为何那样设计存储与调度,也是排查分布式性能瓶颈的必修课。

目录
  1. 可视化演示
  2. 局部性原理:热门书与相邻书架
  3. 分布式存储:分馆布局与目录系统
  4. 计算数据协同:读者去书库,而不是书跑向读者
  5. HDFS机制:藏书怎么切、怎么放
  6. 对象存储:仓库编号直接提货
  7. 优化策略:让「找书」更快
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

局部性原理:热门书与相邻书架

你有没有过这样的体验:想查一道菜的做法,随手翻开手边的《家常菜大全》,发现旁边正是《烘焙入门》——于是顺便也学了两招。图书馆员深知这种规律,所以会把主题相近的书摆在同一片区域;而总被借阅的书会被放到前台特设的「热门书架」。这里藏着数据局部性的两个最朴素维度:时间局部性是指刚刚被访问过的数据,短时间内可能再次被访问;空间局部性是指刚被访问的数据附近的数据,很快也可能被用到。在计算机里,前者催生了缓存,后者催生了预取和相邻存储。

在分布式存储系统中,单机局部性被放大成一个集群问题。一本书太大无法一次放入书箱,于是图书馆把它拆成多个分册,每个分册装进独立书箱——这就是数据分块。分块后,每个箱子可以被独立存放在不同书库;而读者通常按「卷」借阅,看第 1 册时大概率接着看第 2 册,这就形成了块的访问模式。设计存储系统时,我们要根据这些模式决定分块大小、放置顺序和预取策略。

衡量局部性效果最直观的指标是命中率:本地能直接拿到的数据越多,远程搬运就越少。

回到图书馆场景:热门书架和相邻书架让读者少跑路,就是时间局部性与空间局部性的成功应用;而把书拆成书箱按需调度,则是数据分块的艺术。理解了这些底层规律,我们才能继续看分布式系统如何把它变成工程现实。

命中率=N本地N本地+N远程\text{命中率} = \frac{N_{\text{本地}}}{N_{\text{本地}} + N_{\text{远程}}}
命中率指计算任务在本地节点直接读到数据的次数占全部读取次数的比例,比例越高,网络搬运越少,系统越快。
  1. 分子 $N_{\text{本地}}$一段时间内,计算节点能直接在本机磁盘上读到的数据请求次数。相当于读者在本分馆书架上直接取到书的次数。
    N本地N_{\text{本地}}
  2. 分母 $N_{\text{本地}} + N_{\text{远程}}$把所有读请求加在一起,既包括本地命中,也包括必须通过网络把数据搬到计算节点的远程请求。
    N本地+N远程N_{\text{本地}} + N_{\text{远程}}
  3. 整体比值命中率越高,说明计算与数据越「亲密」,系统的网络传输开销就越小。
    命中率=N本地N本地+N远程\text{命中率} = \frac{N_{\text{本地}}}{N_{\text{本地}} + N_{\text{远程}}}

分布式存储:分馆布局与目录系统

一所超级图书馆不会只有一个馆址,而是按学科分散到多个分馆,每个分馆只存一部分藏书。分布式存储系统也一样,把海量数据切成块后分散到若干存储节点上,这就是数据分片。分片让容量可以横向扩展,但也带来了新问题:某个分馆的书被烧毁怎么办?答案是副本机制——为每个数据块在不同节点保存多个副本,如同重要古籍会抄录多份放入不同分馆。

副本虽然保险,但要知道什么书放在哪个分馆、有几份拷贝,必须有一位严谨的「馆长目录员」——这就是元数据管理。元数据记录每个块与节点的映射关系、副本位置、文件大小、权限等信息。分布式系统中的 NameNode 或元数据服务就扮演这个角色。为了让副本不至于都放在一个容易团灭的机房里,系统的节点组织还需要考虑拓扑:同一机架的服务器共享交换机和电闸,跨机架则更安全但通信更慢,于是有了「机架感知」的放置策略。

副本数量与数据可用性之间存在清晰的数学关系。假设单个副本发生故障的概率为 $p$,那么 $r$ 个副本全部坏掉的概率是 $p^r$,数据整体可用的概率就是:

分馆、副本和目录员构成了分布式存储的骨架。有了这份骨架,我们才敢放心地把计算任务分发到各个分馆去执行,因为系统知道数据就在附近,而且不止一处有备份。

A=1−(1−p)rA = 1 - (1 - p)^r
这是「多副本冗余收益公式」:即使单个副本的失效率不低,只要副本数量够多,整体数据丢失概率也会降得极低。
  1. $1 - p$(单副本失效率)一个存储副本在统计周期内损坏或不可用的概率,相当于一本馆藏图书被损毁的概率。
    1−p1 - p
  2. $(1 - p)^r$(全部副本同时失效)$r$ 个彼此独立的副本全部不可用的概率。哪怕一个分馆遭受火灾,只要别的分馆还有副本,数据就不会丢。
    (1−p)r(1 - p)^r
  3. 整体相减用 1 减去「全部失效」这个最坏情况,得到系统仍然存活的概率,即整体可用性。
    A=1−(1−p)rA = 1 - (1 - p)^r

计算数据协同:读者去书库,而不是书跑向读者

图书馆最怕什么?怕所有读者都坐在总馆,却要求把散布各分馆的书全部调到总馆来。聪明的做法是:哪位读者要看哪本书,就请他去对应分馆就座。分布式计算引擎也遵循同样的原则——移动计算而非移动数据。MapReduce、Spark 在调度任务时,会把计算任务尽量分配到持有输入数据块的节点上,让任务在本地读取数据。

这与就近计算的思想一脉相承:调度器会查看任务队列中每个任务所需数据块的位置,优先选择数据所在节点执行。但完全追求局部性可能导致某些节点被塞满任务,而其他节点闲置,因此还要兼顾负载均衡——在「数据就近」和「任务均匀」之间寻找平衡点。毕竟,图书馆如果所有读者都涌向一个分馆,座位也会不够。

为什么要如此执着地减少网络开销?因为传输数据比本地磁盘读取贵得多。数据搬运的耗时由固定延迟和数据量除以带宽共同决定:

读者去书库,只有一个人走路;书运向读者,则要动用整支车队。移动计算把「数据搬运问题」变成「任务调度问题」,省下的正是传输大宗数据的时间——这是数据局部性思想最核心的落地法则。

T总=T延迟+DBT_{\text{总}} = T_{\text{延迟}} + \frac{D}{B}
数据传输总时间 = 网络固定延迟 + 数据量除以带宽。这个公式解释了为什么移动计算更划算:计算程序通常只有几 MB ~ 几百 MB,而数据动辄 TB 级。
  1. $T_{\text{延迟}}$(网络往返准备)建立连接、处理请求首包所需的固定等待时间,相当于货车出发前司机就位、车辆点火的时间。
    T延迟T_{\text{延迟}}
  2. $D$(数据体积)需要移动的数据总量。数据量越大,搬起来越慢。
    DD
  3. $B$(网络带宽)单位时间内信道能传输的数据量,相当于高速公路的限速与车道数。
    BB
  4. $\frac{D}{B}$(传输耗时)用数据量除以带宽,得到数据在网络管线上奔跑的时间。
    DB\frac{D}{B}

HDFS机制:藏书怎么切、怎么放

有了分馆和调度思想,我们来看一个具体实现:HDFS。它是 Hadoop 生态的分布式文件系统,把文件切成固定大小的块来存储,默认块大小为 128MB。为什么不是 4KB?因为 HDFS 面向「一次写入、多次读取」的大文件场景,大块能减少元数据条目数,让顺序读吞吐更高——这就像图书馆不按「页」管理书籍,而是按「册」打包上架。

HDFS 的块存储设计把文件抽象为块的序列,块作为独立单元被复制和调度。接着引入机架感知:每个 DataNode 启动时会上报自己的机架 ID,NameNode 由此知道集群的网络拓扑。基于这份拓扑,HDFS 执行著名的副本放置策略:第一个副本放在客户端所在节点;第二个副本放在不同的机架;第三个副本与第二个副本放在同一机架的不同节点。这样既保证跨机架容灾,又控制跨机架流量。写入时,数据沿着 DataNode 链依次传递,形成流水线写入:客户端只把数据发给第一个节点,第一个节点传给第二个,第二个再传给第三个,像图书馆总馆将新书沿途分发给各分馆。

一个文件最终会被切成多少个块呢?

HDFS 用「大书箱 + 拓扑感知 + 三副本 + 流水线」这套组合拳,让每一册藏书既安全又不至于太远。当计算任务到来时,NameNode 的调度信息能让任务轻易找到就近书箱,这就是数据局部性在文件系统层面的精密演绎。

N块=⌈S文件S块⌉N_{\text{块}} = \left\lceil \frac{S_{\text{文件}}}{S_{\text{块}}} \right\rceil
文件块数 = 文件总大小除以块大小后向上取整。HDFS 中 128MB 是常见块大小,块数决定了副本调度的最小单位。
  1. $S_{\text{文件}}$整个文件的大小,表示一本书的总篇幅。
    S文件S_{\text{文件}}
  2. $S_{\text{块}}$单个数据块的大小。HDFS 默认 128MB,相当于图书馆统一规格的书箱容量。
    S块S_{\text{块}}
  3. $\lceil \cdot \rceil$(向上取整)除不尽时,剩余内容也要占用一个完整块,因此块数只多不少。
    ⌈S文件S块⌉\left\lceil \frac{S_{\text{文件}}}{S_{\text{块}}} \right\rceil

对象存储:仓库编号直接提货

如果说 HDFS 是一所精心布局的图书馆,那么对象存储更像一座巨型自动化仓库:每个货物都有唯一编号,你报出编号,机械臂直接取货,不需要知道它在哪排哪架。对象存储的扁平寻址正是如此——每个对象拥有全局唯一的 ID,客户端用这个 ID 直接发起请求,没有文件夹层级遍历的过程。

这种设计能成立,靠的是元数据分离。对象存储将对象的数据本体与描述它的元数据分开存放:数据散布在海量存储节点,元数据则集中在索引集群或借助分布式表格存储管理。检索对象时先查索引,再按索引指向的位置拉取数据。正因为寻址路径短,对象存储可以支撑百亿级对象;而传统文件系统的目录树查询,每深入一层都要做一次查找,路径一长就会变慢。

对象存储在一致性上通常选择最终一致模型:写入完成后,索引系统通过异步复制向各节点扩散最新状态,短时间内的读请求可能拿到旧数据,但最终会看到最新版本。这像是图书馆把新书信息先在内部系统登记,再慢慢同步到各分馆查询终端,读者稍等片刻就能查到。为了弥补性能差距,对象存储还会做性能优化:热门对象缓存到 CDN 或内存层,按前缀分区存放相关对象,提高扫描与列举效率。

理论上,对象寻址的时间开销是常数级:

对象存储与 HDFS 并非谁替代谁的关系:HDFS 适合大规模流式读取的批处理场景,对象存储适合海量小文件、互联网应用和高并发访问。二者都把「计算找数据」作为设计出发点,只是用了不同的货架方式。

T寻址=O(1)T_{\text{寻址}} = O(1)
对象存储的寻址时间复杂度为常数:不管仓库里是 1 万个还是 1 亿个对象,凭唯一 ID 定位一次就能取到数据。
  1. $T_{\text{寻址}}$从发起请求到定位到数据所在位置所消耗的时间,相当于从报出编号到机械臂开始移动的时间。
    T寻址T_{\text{寻址}}
  2. $O(1)$(常数时间)定位耗时不随对象总数增长,因为底层用哈希表或索引直接命中。
    O(1)O(1)

优化策略:让「找书」更快

最后,我们把目光投向系统性能的持续优化。数据局部性不只是「把任务放在数据旁边」这一锤子买卖,而是贯穿存储、传输、调度全链路的精细化艺术。

第一招是数据压缩:把书改成紧凑的小字号排版,同样一本书占用的书架空间更小,运输也更轻便。分布式系统中常对文件做压缩存储,减少磁盘占用和网络传输量。第二招是缓存加速:把刚被读过的热门书放到前台阅览桌,下一次读者直接拿取,不再进书库翻找——这正是时间局部性在工程上的直接应用。第三招是感知调度:调度器像熟悉每座分馆馆藏的资深馆员,分配任务时参考数据块的位置、机架拓扑和节点负载,做到「谁手里有货,任务就优先给谁」。第四招是分层存储:把常读的热数据放到高速 SSD 或内存层,把不常读的冷数据转移到低成本的机械硬盘或归档库,按访问热度安置数据。

压缩带来的空间节省可以直观量化:

回到我们的超级图书馆:分馆、书箱、目录员、读者调度、货架布局共同构成了一套高效运转的系统。数据局部性不是某个单一技术,而是一整套「把书放到离读者最近的地方」的思维方式。掌握了它,你就能理解并优化自己身边的分布式系统。

η=S原始−S压缩S原始×100%\eta = \frac{S_{\text{原始}} - S_{\text{压缩}}}{S_{\text{原始}}} \times 100\%
压缩节省率 = 节省的空间除以原始空间。压缩让数据体积变小,传输和存储成本同步降低,且不影响局部性调度策略。
  1. $S_{\text{原始}}$压缩前数据占用的空间,例如一本书的原始字号排版后的页数。
    S原始S_{\text{原始}}
  2. $S_{\text{压缩}}$压缩后数据占用的空间,相当于小字号重新排版后的页数。
    S压缩S_{\text{压缩}}
  3. $\eta$(节省率)用原始空间减去压缩空间,再除以原始空间,得到节省的百分比。
    η=S原始−S压缩S原始×100%\eta = \frac{S_{\text{原始}} - S_{\text{压缩}}}{S_{\text{原始}}} \times 100\%

AI 应用场景

大规模数据并行训练中的数据分片加载

阶段:数据准备与加载优化

解决的问题:大模型训练动辄需要 TB 级语料,若所有 GPU 节点都从中央存储读取全部数据,网络会成为瓶颈,训练效率极低。基于数据局部性原则,训练框架先把数据集按 shard 切分,再让每个节点优先读取本地 shard,只在必要时才做少量跨节点补读。

具体案例:某团队训练千亿参数大语言模型时,将 10TB 语料按序列长度切成 128MB 左右的 shard,并打散存储在 32 台训练节点的本地 NVMe 上。训练时每个节点只读本地数据,IB 网络流量下降约 85%,数据加载不再是训练瓶颈。

Spark 离线作业的本地化任务调度

阶段:分布式计算任务调度

解决的问题:Spark 执行 SQL 或机器学习任务时,如果 Executor 被调度到不持有输入数据的节点,就要通过网络拉取数据块,产生大量 shuffle 流量和延迟。调度器读取数据块的位置信息,把 task 发射到拥有该数据副本的 Executor 上,实现「计算追着数据跑」。

具体案例:某电商数仓跑 TPC-DS 99 个查询,开启 Spark 的 locality 等待策略后,查询扫描阶段的本地读取率从 64% 提升到 96%,整体 Shuffle 数据量降低一半,批处理作业耗时缩短约 35%。

对象存储冷热分层与缓存加速

阶段:存储架构选型与成本优化

解决的问题:海量训练样本、日志、模型快照存放在对象存储中,全量放在高性能层成本高企,全放冷存储又拖慢访问。利用对象存储的分层与缓存机制,把频繁读取的热数据放在 S3 标准层或挂接缓存,把不常用的历史快照沉降到归档层。

具体案例:一家 AI 视觉公司把当前迭代期的训练集放在对象存储标准层并启用 CDN 缓存;每个实验结束后,上一版本数据集自动沉降到低频层。存储成本下降 62%,而热数据的读取延迟仍保持在百毫秒量级。

Python 演示

python63 行
import random class DistributedFileSystem:    def __init__(self, node_count=6, block_size=128, replication=3):        self.node_count = node_count        self.block_size = block_size        self.replication = replication        self.blocks = {}     def write_file(self, file_size_mb):        num = (file_size_mb + self.block_size - 1) // self.block_size        for i in range(num):            size = min(self.block_size, file_size_mb - i * self.block_size)            owners = random.sample(range(self.node_count), self.replication)            self.blocks["block_%03d" % i] = (size, owners)        return num     def transfer_mb(self, schedule):        total = 0.0        for block_id, target_node in schedule:            size, owners = self.blocks[block_id]            if target_node not in owners:                total += size        return total     def local_owned_counts(self):        counts = [0] * self.node_count        for _, owners in self.blocks.values():            for node_id in owners:                counts[node_id] += 1        return counts  def locality_schedule(dfs):    plan = []    for block_id, (_, owners) in dfs.blocks.items():        plan.append((block_id, random.choice(owners)))    return plan  def remote_schedule(dfs, target_node):    return [(block_id, target_node) for block_id in dfs.blocks]  def main():    random.seed(42)    dfs = DistributedFileSystem(node_count=6, replication=3)    num_blocks = dfs.write_file(file_size_mb=1024)    print("文件被切分为 %d 个块:" % num_blocks)    for node_id, cnt in enumerate(dfs.local_owned_counts()):        print("  N%d 本地持有 %d 块" % (node_id, cnt))     remote_plan = remote_schedule(dfs, target_node=0)    local_plan = locality_schedule(dfs)    remote_cost = dfs.transfer_mb(remote_plan)    local_cost = dfs.transfer_mb(local_plan)    print("\n集中式调度(全部任务放 N0):传输 %.0f MB" % remote_cost)    print("局部性调度(任务跟随数据):传输 %.0f MB" % local_cost)    print("减少传输量:%.1f%%" % ((1 - local_cost / remote_cost) * 100))  if __name__ == "__main__":    main()
目的:模拟一个文件在 6 节点集群上的分块与多副本存储,并对比「任务集中到一个节点」与「任务按数据位置调度」的网络传输量,直观展示数据局部性的收益。
  1. owners = random.sample(range(self.node_count), self.replication)为每个块随机选出 $r$ 个存储节点,模拟副本放置。
  2. if target_node not in owners:判断该块是否在目标计算节点本地;不在就要计入远程传输量。
  3. plan.append((block_id, random.choice(owners)))局部性调度把每个块的计算任务派发给持有该块副本的随机节点。
  4. total += size累加所有需要跨节点传输的块大小,得到网络传输总量。
  5. (1 - local_cost / remote_cost) * 100计算局部性调度相比集中式调度节省的传输百分比。

常见误区

误区缓存不就是数据局部性吗?给系统加个 Redis 或者本地缓存,局部性就搞定了。

正解缓存只是时间局部性的一种应用,数据局部性是更宏观的工程原则:从数据如何分块、副本如何放置,到任务如何调度,都在追求「计算靠近数据」。缓存是前台的热门书架,而数据局部性决定整座图书馆怎么建。

为何常见:初学者最常接触的局部性概念来自 CPU 缓存和 Redis,容易把「缓存」这个具体手段当成目标本身。

误区最彻底的数据局部性不就是每个节点都存一份完整数据?这样任何任务都在本地读!

正解全量复制意味着存储成本乘以节点数,同时每次更新都要广播到所有节点,一致性维护成本高到无法接受。工程上通过合理设置副本数(如 3 副本)和智能放置策略,在成本、可用性、局部性之间取平衡。

为何常见:把「局部性最优」误解为「数据副本无限多」,忽略了分布式系统永远在多个目标间做权衡。

误区HDFS 和 S3 都是存大文件的,换个接口而已,局部性原理也应该完全一样。

正解二者设计哲学差异显著。HDFS 是「可挂载的文件系统」,用目录树定位文件、以块为调度单位;对象存储用扁平 ID + 索引直查对象,元数据与数据分离,天然适合海量小对象。局部性的实现路径也不同:HDFS 靠副本放置 + 计算调度,对象存储靠索引和缓存层。

为何常见:从使用者视角看,两者都是「存文件、读文件」,容易忽略底层定位与一致性模型的本质区别。

误区数据放得远一点近一点,只是快慢问题,结果都是一样的。

正解在分布式系统中,局部性与一致性强相关。读到本地旧副本可能会得到过期结果;副本之间的同步延迟会带来「写后读不一致」。像「最终一致」模型这类局部性伴随的设计,正是对正确性和性能的联合权衡。

为何常见:单机系统读写强一致,让人误以为分布式只是加减速,忽略了副本同步带来的数据可见性差异。

误区数据都压缩成密文一样的小块了,原来的空间相邻关系、访问模式全乱了,局部性还有什么用?

正解压缩改变的是数据的体积和编码形态,不改变数据块的分布位置与副本拓扑。压缩后的数据块依然放在离计算近的节点上,局部性调度照常生效;压缩减少传输量,反而让「移动计算」更轻便。

为何常见:把「局部性」误理解为「数据的物理相邻」,而实际上它指的是「计算与数据的逻辑距离」。

面试题

Q1. 数据局部性经典地分为哪两个基本维度?

单选题 · mid

  • A.时间局部性与空间局部性← 正确答案
  • B.计算局部性与存储局部性
  • C.网络局部性与磁盘局部性
  • D.顺序局部性与随机局部性

答案:A。数据局部性的两个经典维度是时间局部性(刚用过的数据很快再用)和空间局部性(刚用过的数据附近的数据很快会用到)。计算/网络等说法并非经典分类,故选 A。

Q2. HDFS 默认三副本策略中,第三个副本通常放置在哪里?

单选题 · hard

  • A.与第一个副本同一节点的另一个磁盘
  • B.与第二个副本同机架的不同节点← 正确答案
  • C.与第一个副本同一机架的不同节点
  • D.随机选择数据中心任意一个节点

答案:B。HDFS 默认策略:第一个副本在客户端所在节点,第二个副本放在不同机架,第三个副本与第二个副本同机架但不同节点。这样兼顾跨机架容灾与控制机架间流量,故选 B。

Q3. 数据局部性调度的核心思想是什么?

单选题 · easy

  • A.将所有数据预先复制到每一个计算节点
  • B.尽量将计算任务调度到数据所在节点← 正确答案
  • C.把数据全部迁移到中心节点统一处理
  • D.在传输数据时使用更高带宽的网络

答案:B。局部性调度主张「移动计算胜于移动数据」,把任务发射到持有数据副本的节点。全量复制不现实,中心迁移违背初衷,故选 B。

Q4. 假设单副本可用性 $p=0.99$,副本数 $r=3$,系统的数据可用性约为多少?

单选题 · mid

  • A.99.00%
  • B.99.99%
  • C.99.9999%← 正确答案
  • D.97.03%

答案:C。代入公式 $A = 1 - (1-p)^r = 1 - 0.01^3 = 99.9999\%$。三个副本全部损坏的概率是百万分之一,故选 C。

Q5. 以下哪些是提升分布式系统数据可用性的常见手段?

多选题 · mid

  • A.多副本冗余存储← 正确答案
  • B.纠删码(Erasure Coding)← 正确答案
  • C.降低副本数量以节省空间
  • D.心跳检测与故障自动转移← 正确答案

答案:ABD。多副本和纠删码都以冗余保证可用性;心跳检测能及时发现并转移故障节点上的服务。降低副本数只会降低可用性,故选 A、B、D。

Q6. 对象存储相比传统文件系统,在寻址方式上最核心的特点是什么?

单选题 · hard

  • A.使用层级目录路径逐级定位
  • B.使用扁平命名空间和唯一对象 ID 直接定位← 正确答案
  • C.使用块号和偏移量定位数据
  • D.使用内存指针访问远程数据

答案:B。对象存储采用扁平命名空间,每个对象一个唯一 ID,通过索引直接命中,无需遍历目录。层级目录是文件系统特征,故选 B。

Q7. 数据局部性调度能为分布式计算带来哪些好处?

多选题 · mid

  • A.降低跨节点数据传输量← 正确答案
  • B.减少任务等待数据的延迟← 正确答案
  • C.提升系统整体吞吐能力← 正确答案
  • D.彻底消除硬件故障

答案:ABC。局部性调度减少远程传输,自然降低传输量和等待延迟,吞吐提升。但它无法消除硬件故障,故选 A、B、C。

Q8. 「移动计算而不是移动数据」的核心目标是什么?

单选题 · easy

  • A.将计算任务发送到数据所在节点,降低网络开销← 正确答案
  • B.减少计算节点数量以节约成本
  • C.将数据拷贝到客户端本地
  • D.牺牲吞吐换取存储空间

答案:A。核心目标是把计算派发到数据身边,因为代码比数据小得多,移动代码更划算。这是大数据处理框架的基本调度哲学,故选 A。

Q9. 在 HDFS 中,文件默认块大小通常是多少?

单选题 · mid

  • A.4KB
  • B.128MB← 正确答案
  • C.1GB
  • D.8MB

答案:B。Hadoop 2.x/3.x 默认块大小为 128MB(早期为 64MB)。4KB 是操作系统页大小,8MB 是传统文件系统常见块大小,故选 B。

Q10. 下列哪些策略有助于优化数据局部性?

多选题 · mid

  • A.对数据做压缩以减少传输体积← 正确答案
  • B.把热数据放入缓存加速读取← 正确答案
  • C.调度时优先选择数据所在节点← 正确答案
  • D.随机放置副本位置

答案:ABC。压缩、缓存、感知调度都能直接或间接提升局部性收益;随机放置副本会破坏数据与计算的亲近关系,是反面做法,故选 A、B、C。