常见大数据和空间面试题

博客围绕海量数据处理展开,涵盖过滤100亿黑名单URL、找出20亿个数中出现最多的数、40亿个数找未出现的数等问题。针对不同问题,给出了布隆过滤器、哈希函数拆分文件、bitmap等解决方案,还涉及一致性哈希在分布式数据库集群缓存中的应用。

过滤100亿黑名单

题目

假设有100亿个URL的黑名单,每个URL最多占用64B,设计一个过滤系统,判断某条URL是否在黑名单里。

要求

不高于万分之一的判断失误率;额外内存不超过30GB

答案

100亿个64B的URL需要640GB的内存,显然直接存哈希表不合理。考虑布隆过滤器,假设有一个长度为m的bit类型数组,如图所示:

输入阶段:

有k个哈希函数,函数的输出域S大于或等于m,假设哈希函数彼此独立,对于同一个输入(以字符串表示的URL),经过k个哈希函数的计算结果也是相互独立。对计算的每一个结果Mod m,将bit array上对应的位置置1,如下:

一个输入对象会将bitmap某些位置涂黑,处理完所有输入对象,会将bitmap相当多位置涂黑,至此,布隆过滤器生成完毕,代表之前所有输入对象的集合。

 

20亿个数中出现最多的数

问题

包含20亿个全是32位整数的大文件,在其中找出出现次数最多的数。

要求

内存限制:2GB

答案

将20亿个数用hash函数分成16个文件。然后统计每个小文件中,哪个数字出现次数最多。最后再比较每个小文件的次数最多的数。(本题分成16个也是根据题目来的。考虑最极端情况。20亿个数都不同)32位的整数要占4b,key占4b,value占4b。共8b。内存只有2G。所以大概每个小文件存2亿条。就需要10个小文件。但是hash函数必须2的n次方。所以2的4次方。16个

40亿个数找没出现的数

问题

有一个包含40亿个无符号整数的文件,最多使用1GB内存,找到所有没出现的数

分析

最差情况,40亿个数都不同,哈希表保存出现过的数,需要内存4B*40亿,大约16GB内存。

答案

使用bitmap,申请一个长度为4294967295bit类型的bitArray,每个位置只表示0或1,该数组占用空间约500MB。遍历这20亿个数,例如遇到7000,就将bitArray[7000]置1。遍历完成后,再依次遍历bitArray,哪个位置没有置1,哪个数就不在40亿个数中。

40亿个数找第一个没出现的数 。内存只有10M

答案

具体的,第一次遍历,申请长度64的整形数组countArr[0...63],统计每个区间计数增加。例如,当前数是34225522090,34225522090/67108864=51,countArr[51]++。遍历完之后,必定有一个countArr[i]小于67108864,表示i区间内至少有一个数没出现过。此时countArr[]使用的内存是64*4B。

假设在37区间有一个数没出现,申请一个长度为67108864的bitmap,内存大约8MB,记为bitArr[0~67108863]。再一次遍历40亿个数,只关心37区间的数,记为num。将bitAry[num-6710886437]的值置位1。遍历完之后,bitArr必然有没有置1的位置,记为i,则6710886437+i就是没出现过的数。

找出100亿个重复URL以及搜索词汇topK问题

问题

有一个包含100亿URL的大文件,每个URL占64B,找出重复URL;补充,找出top100搜索词汇

常规答案

  1. 大文件通过哈希函数分配到不同机器
  2. 哈希函数将大文件拆分成小文件。

对于每一个小文件,利用哈希表遍历,找出重复的URL,或者分给机器或拆分文件完之后,进行排序,看是否有重复的URL。

补充问题的思路也是通过哈希函数分流,对于每个小文件,简历词频哈希表,建一个大小为100的小根堆,选出每个小文件的top100.每个小文件的top100进行外排序或者接着使用小根堆,就能得到100亿数据的top100.

出现两次的数以及中位数问题

问题

有40亿个无符号32位整数,最多可以使用1GB内存,找出所有出现了两次的数;补充问题,最多使用10MB内存,找到40亿个数的中位数

答案

第一个问题可以用bitmap做,申请长度为2?232bit的bitArr,2个bit表示一个数出现的词频。遍历40亿个数,假设出现num,将bitArr[2num]和bitArr[2num+1]设置为01,第二次出现,设置为10,第三次,设置为11。以后再遇到11的,就不做处理。遍历完成后,再遍历一次,若发现bitArr[2num]和bitArr[2num+1]是10,则num是出现了两次的数。

第二个问题,分区间讨论。长度为2MB的unsigned int数组占用8MB,将区间数目定位232/2M,取整为2148个区间,第0区间0~2M-1,第i区间2Mi~2M(i+1)-1

申请一个长度为2148的unsigned int整数数组arr[0..2147],arr[i]表示i区间有多少个数,arr占用内存小于10MB。遍历40亿个数,当前数num为num,落在区间(num/2M),对应arr[num/2M]++。累加统计每个区间的累计数目,就能找到40亿个数的中位数。例如0~K-1区间数目个数为19.998亿,加上第K个区间就超过了20亿,说要中位数一定在K区间中,并且一定是第K区间的第0.002亿个数。

接着申请长度2M的unsigned int数组countArr[0..2M-1],占用8MB。遍历40亿个数,只关心第K区间的数numi,countArr[numi-K*2M]++。统计完之后在第K区间找地0.002亿个数字即可。

一致性哈希

分布式数据库集群缓存,例如memcached,将数据的id通过哈希函数转换为key,假设有N个机器,计算key%N,得到及其所属编号,增删改查都在这台机器上。一致性哈希能在机器扩容(N发生变化),使得不用重新计算一遍key%N

三台机器处于哈希环,id通过哈希映射为key,在哈希环中顺时针找距离最近的机器。

机器较少的时候可能会出现负载不均衡,如图所示:

答案

### 大数据开发常见面试问题及答案解析 在大数据领域,常见的面试问题通常涵盖多个方面,包括Hadoop生态系统、分布式计算框架(如Spark、Flink)、数据存储系统(如HBase、Hive)以及数据处理优化技术。以下是一些高频出现的问题及其详细解析: #### 1. **HDFS的基本原理是什么?** HDFS 是 Hadoop 的核心组件之一,它是一个分布式文件系统,用于存储大规模数据[^4]。其基本原理包括: - **数据分块**:HDFS 将大文件分割成多个块,默认大小为 128MB,并将这些块分布在整个集群中。 - **高容错性**:为了确保数据的可靠性,每个数据块都会被复制到多个节点上,默认情况下是三个副本。 - **主从架构**:HDFS 使用 NameNode DataNode 的结构。NameNode 负责管理元数据,而 DataNode 负责实际的数据存储。 #### 2. **Flink Spark Streaming 的主要区别是什么?** Flink Spark Streaming 都是用于流处理的框架,但它们的设计理念实现方式有所不同[^2]: - **Flink**:基于事件驱动的实时处理引擎,能够提供低延迟高吞吐量。Flink 的状态管理窗口机制非常强大,适用于需要精确一次语义的应用场景。 - **Spark Streaming**:采用微批处理模型,即将连续的数据流分成小批次进行处理。虽然这种方法可以利用 Spark 的批处理能力,但在实时性延迟方面不如 Flink。 #### 3. **Hive、Spark SQL Presto 的区别是什么?** 这三者都是用于查询分析大规模数据集的工具,但各有特点[^3]: - **Hive**:基于 Hadoop 的数据仓库工具,使用类 SQL 语句进行查询,适合处理大规模离线数据。Hive 查询会被转换为 MapReduce 或 Tez 任务执行。 - **Spark SQL**:Spark 生态系统中的模块,提供 SQL 查询接口,支持多种数据源,可以进行实时离线数据分析。Spark SQL 利用了内存计算的优势,性能优于 Hive。 - **Presto**:由 Facebook 开发的分布式 SQL 查询引擎,专为快速查询大规模数据设计。Presto 支持多种数据源,包括 HDFS、MySQL、Cassandra 等,且具有良好的扩展性灵活性。 #### 4. **如何优化 Hive 查询性能?** 优化 Hive 查询可以从以下几个方面入手: - **分区桶表**:通过对表进行分区或桶化,可以减少查询时扫描的数据量,提高查询效率。 - **压缩存储格式**:选择合适的压缩算法存储格式(如 ORC、Parquet)可以显著减小存储空间并提升 I/O 效率。 - **调整参数**:合理设置 Hive 的配置参数,例如 `hive.exec.reducers.bytes.per.reducer` `hive.optimize.pruner`,以优化查询计划资源利用率。 - **索引**:虽然 Hive 不支持传统意义上的索引,但可以通过创建物化视图或其他辅助结构来加速特定查询。 #### 5. **什么是 MapReduce?它的优缺点是什么?** MapReduce 是一种编程模型,主要用于处理生成大规模数据集。它的工作流程分为两个阶段:Map 阶段 Reduce 阶段。 - **优点**: - **可扩展性强**:可以在大量廉价硬件上运行,轻松扩展到数千个节点。 - **容错性好**:自动处理失败的任务,保证了作业的成功完成。 - **缺点**: - **延迟较高**:由于 MapReduce 是基于磁盘的计算模型,因此不适合实时处理。 - **编程复杂度高**:编写高效的 MapReduce 程序需要较多的代码调试工作。 #### 6. **Spark 中的 RDD DataFrame 有什么区别?** - **RDD**:弹性分布式数据集,是 Spark 最基础的数据抽象,提供了低层次的 API 操作。RDD 是类型化的,用户可以直接操作 JVM 对象。 - **DataFrame**:DataFrame 是基于 RDD 构建的高层抽象,类似于关系型数据库中的表,具有 schema 信息。DataFrame 提供了更简洁的 API,并且内部进行了大量的优化,例如 Catalyst 优化器会自动对查询计划进行优化。 #### 7. **Kafka 的作用是什么?它是如何工作的?** Kafka 是一个分布式流处理平台,广泛应用于构建实时数据管道流应用。Kafka 的主要功能包括: - **消息队列**:Kafka 可以作为高性能的消息中间件,支持发布/订阅模式。 - **持久化存储**:Kafka 将消息持久化到磁盘,支持长时间的消息保留。 - **流处理**:Kafka Streams API 允许开发者直接在 Kafka 上进行流处理。 Kafka 的工作原理主要包括生产者、消费者 broker。生产者将消息发送到指定的主题,broker 接收并存储消息,消费者从 broker 拉取消息进行处理。 #### 8. **HBase 的架构特性是什么?** HBase 是一个分布式的、面向列的 NoSQL 数据库,适用于海量数据的随机读写。HBase 的架构主要包括以下几个组件: - **ZooKeeper**:负责协调管理集群中的各个节点。 - **HMaster**:负责管理表 RegionServer,处理客户端请求。 - **RegionServer**:负责管理一个或多个 Region,处理数据的读写请求。 HBase 的特性包括: - **强一致性**:HBase 提供了强一致性的读写操作。 - **水平扩展**:HBase 可以通过增加更多的 RegionServer 来扩展集群规模。 - **稀疏存储**:HBase 支持稀疏数据存储,节省存储空间。 #### 9. **什么是 Lambda 架构?为什么它在大数据中很重要?** Lambda 架构是一种用于处理大规模数据的架构模式,旨在同时支持批处理实时处理。Lambda 架构的主要组成部分包括: - **批处理层**:处理历史数据,生成批处理视图。 - **速度层**:处理实时数据流,生成实时视图。 - **服务层**:合并批处理视图实时视图,对外提供统一的查询接口。 Lambda 架构的重要性在于它可以兼顾数据的完整性实时性,适用于需要同时处理历史数据实时数据的场景。 #### 10. **如何监控调优 Spark 应用程序?** 监控调优 Spark 应用程序可以从以下几个方面入手: - **Spark UI**:通过 Spark UI 查看应用程序的运行情况,包括任务调度、执行时间资源使用情况。 - **日志分析**:查看详细的日志信息,定位瓶颈异常。 - **参数调优**:合理设置 Spark 的配置参数,例如 `spark.executor.memory` `spark.sql.shuffle.partitions`,以优化性能。 - **数据倾斜处理**:识别并解决数据倾斜问题,例如通过重新分区或使用盐值来均匀分布数据。 ```python # 示例:Spark SQL 查询优化 from pyspark.sql import SparkSession # 创建 SparkSession spark = SparkSession.builder.appName("OptimizeQuery").getOrCreate() # 设置合理的 shuffle 分区数 spark.conf.set("spark.sql.shuffle.partitions", "8") # 读取 Parquet 格式的数据 df = spark.read.parquet("/path/to/data") # 执行查询 result = df.filter(df["column"] > 100).groupBy("category").count() # 显示结果 result.show() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值