大数据相关面试题每日五问(三)

  1. 对ES的倒排索引了解多少?工作原理?如何提高其查询效率?
  2. 了解MySQL中的事务吗?它的ACID特性指的是什么?
  3. 简述数据仓库中“维度”和“事实”表的区别及其作用
  4. 构建数仓的模型有哪些?展开讲讲。
  5. HDFS 的写数据流程是怎样的?如果一个 DN在写入过程中发生故障,Hadoop 会如何处理?

(1)https://www.nowcoder.com/discuss/738791848554086400

(2)https://www.nowcoder.com/discuss/739079633773023232

对ES的倒排索引了解多少?工作原理?如何提高其查询效率?

Elasticsearch 使用的是倒排索引(Inverted Index),这是实现全文检索的核心机制。其原理是:将每个文档中的字段内容进行分词处理,然后为每个词项建立一个词典(term),记录该词在哪些文档(文档 ID)中出现,以及出现的位置和频率。这样查询时不是遍历每个文档去找关键词,而是直接查词典获取相关文档列表,极大提升了检索效率。为了进一步提高查询性能,可以采取多种优化手段:一是合理设置字段类型和分词器,减少无效字段的索引;二是使用 keyword 类型字段做精确匹配,避免不必要的全文分词;三是通过设置合适的 filter 缓存结果、避免重复计算;四是开启 doc_values 支持聚合、排序等操作,减少内存消耗;五是避免过度嵌套结构,必要时使用 flattenedjoin 优化文档结构。此外,合理的索引设计、分片分配和冷热数据分离也是保障查询效率的重要手段。

了解MySQL中的事务吗?它的ACID特性指的是什么?

MySQL 中的事务是指一组操作的集合,要么全部执行成功,要么全部回滚撤销,常用于保证数据的一致性与完整性。事务具有四大特性,也就是 ACID原子性(Atomicity) 指事务中的操作要么全部完成,要么全部不做,出现错误可以回滚;一致性(Consistency) 保证事务执行前后数据都满足数据库的约束规则,不会出现破坏数据逻辑的状态;隔离性(Isolation) 表示多个事务并发执行时互不干扰,常见的隔离级别包括读未提交、读已提交、可重复读、串行化;持久性(Durability) 指事务一旦提交,对数据的修改就是永久性的,即使系统宕机也不会丢失。MySQL 中默认使用 InnoDB 引擎来支持事务,其通过 redo log、undo log 和锁机制来实现对 ACID 的保障。

简述数据仓库中“维度”和“事实”表的区别及其作用

在数据仓库中,维度表和事实表是构建星型或雪花模型的核心组成部分事实表(Fact Table) 用于存储与业务事件相关的度量值或指标数据,例如订单金额、销售数量等,通常数据量大,记录的是“发生了什么”;而 维度表(Dimension Table) 则存储描述事实的维度信息,比如时间、地区、产品、用户等,是对事实的多角度分析视角。二者的主要区别在于:事实表关注“数值和业务行为”,维度表关注“描述和分类信息”;事实表一般包含外键关联多个维度表,而维度表一般数据量小但字段丰富,便于查询和筛选。在实际应用中,通过维度表可以对事实表的数据进行分组、聚合、切片和钻取,是实现多维分析(OLAP)的基础。

构建数仓的模型有哪些?展开讲讲。

构建数仓的常见模型主要包括星型模型、雪花模型和事实星座模型星型模型是最常用的一种,其特点是一个中心事实表直接连接多个维度表,结构简单、查询高效,适合于查询频繁、维度较少的场景;雪花模型是在星型模型基础上对维度表进一步规范化,将维度表拆分为多个层级子表,形成树状结构,减少冗余、节省存储,但查询时关联复杂、效率较低;事实星座模型(也叫复合星型模型)是多个事实表共享维度表的结构,适用于存在多个业务过程(如订单、支付、退货等)且共享维度的复杂分析需求。选择哪种模型需根据业务需求、数据复杂度和查询性能权衡,实际开发中也常采用分层建模(ODS、DWD、DWS、ADS)与上述模型相结合,实现数据的稳定、复用与灵活分析。

HDFS 的写数据流程是怎样的?如果一个 DN在写入过程中发生故障,Hadoop 会如何处理?

 HDFS 中的写数据流程从客户端开始,首先客户端向 NameNode 请求文件写入权限。NameNode 确认文件不存在后,将文件写入的权限以及负责存储数据块的 DataNode 信息返回给客户端。客户端然后会与 DataNode 建立连接,并通过一个个数据块的方式进行写入。每个数据块(Block)会按照一定的副本策略(默认三个副本)分配到多个 DataNode 上。客户端向每个 DataNode 传输数据时,会将数据写入第一个数据块,完成后接着写第二个、第三个,以此类推。如果在写入过程中,某个 DataNode 发生故障,NameNode 会根据副本机制将数据复制到其他健康的 DataNode 上,确保数据不会丢失。通过心跳机制和副本机制,DataNode 故障会被检测到,并且数据会自动恢复到最新副本。故障发生时,HDFS 会根据剩余副本的数据恢复丢失的部分。

1、Client通过Distributed FileSystem模块向NN请求上传文件,NN检查目标文件是否已存在,父目录是否存在
2、NN返回是否可以上传
3、Client请求第一个block上传哪几个DN服务器上
4、NN返回3个DN节点,分别为DN1、DN2、DN3
5、Client通过FSDataOutputStream模块请求DN1建立传输通道,DN1收到请求会继续调用DN2,DN2继续调用DN3
6、DN3应答DN2,DN2应答DN1,DN1应答Client
7、Client开始往DN1上传第一个block(先读取数据放到一个本地磁盘缓存),以packet为单位,DN1收到一个packet就会上传给DN2,DN2传给DN3;DN1每传一个packet会放入到一个应答队列等待应答
8、当一个block传输完成后,Client会再次请求NN上传第二个block的服务器,重复执行3-7

引自:https://github.com/GTyingzi/BigDATA/blob/main/%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%A1%86%E6%9E%B6/Hadoop.md#hdfs%E5%86%99%E6%B5%81%E7%A8%8B

#牛客AI配图神器#

#牛客解忧铺##数据人的面试交流地#
大数据相关面试题合集 文章被收录于专栏

努力找实习中,整理一些大数据相关面试题和大家分享,共同学习进步,有建议或批评欢迎留言!

全部评论
data故障可以说一下pipe管道和ack确认,感觉更想听这些
1 回复 分享
发布于 04-28 09:08 山东
想问HDFS故障细节
点赞 回复 分享
发布于 04-09 15:14 湖北
关于问题2️⃣回答的补充: Elasticsearch 采用倒排索引(Inverted Index)来提高全文搜索的效率。倒排索引的核心思想是将文档的内容预处理,建立从“词”到“文档 ID”映射的索引结构,而不是像传统数据库那样按行存储数据。具体过程是:首先对文档中的文本进行分词(Tokenization),将其拆分成单个词项(Term),然后建立词项到文档 ID 的映射表。这种方式使得查询时不需要逐个扫描文档,而是可以直接查找词项并快速定位包含该词的所有文档,大幅提高查询效率,特别适用于全文检索。 
点赞 回复 分享
发布于 04-09 14:44 湖北

相关推荐

拼多多 暑期实习 二面,总共用时1h 左右, 被面试官疯狂拷打, 估计凉凉。首先介绍项目, 对方完全不感兴趣: 你做的这些和后端开发有什么关系?我简单介绍了下后端相关的,面试官可能觉得太简单了,没有继续问。然后就是痛苦的手撕拷打,持续50mins 左右。问题1: 给你两个班级, 每个班级共有 k 个人,你是班主任,要从每个班级中挑出1个人,使得他们的身高差最小。回答: 先排序, 然后遍历A班级,二分查找B班级中的第一个大于等于(lower_bound)A班级里的那个 的位置,然后比较那个位置和前一个位置。面试官和我不太同频,问我为什么要找第一个大于等于?二分查找不就是找一个位置吗? 面试官笑眯眯的问我是第一次接触二分搜索吗?然后计算时间复杂度。感觉完全不同频。问还有更优解法吗?回答双指针,还是固定遍历A, 然后另一个指针从B开始找比A大的,然后在和前一个也比较,取最小的。这样就是O(n).面试官提示一下,不要局限在当前这个和前一个比较,换种思路。 然后我一直在思考,对方问我双指针要怎么初始化?  因为我还没想好,就没回答。面试官: 双指针要怎么初始化?这你都不懂吗。。。? 怎么不回答我。我说新思路还没想好,面试官表示刚才那种思路的双指针要怎么初始化? 答:都初始化在第一个位置。问题2: 两个班级, 换成 N 个班级, 每个班级选1个人, 要求算出来的人里的 max - min 最小。答没思路, 面试官提示下多个指针? 考虑下指针应该如何移动。我想了想,移动最小的那个指针,直到所有指针都走到末尾,每次移动,从这个N个人里面取最大的,最小的,比较。然后算时间复杂度:n个班,每个班k个人,  我想整体的数据规模是 N = n*k , 然后我用 N 去后续表示。面试官:你为什要定义新的符号N? 算完时间复杂度,问我“从这个N个人里面取最大的,最小的”这部分可以优化吗? 我回答可以使用 map (cpp里的),面试官表示你直接说数据结构,不要说语言中的名字。问这个的时间复杂度,答logn面试官:那你开始写吧。写了大概 3 分钟。 他看了眼。问题3: ping 100ms  , curl http://1.2.3.4:8080/hello  需要多少时间?这里我考虑了4次挥手, 面试官:需要考虑这个吗?答 200ms. 问题4: 直播间,打赏金额最高的100个用户? 你应该如何实现维护?我回答使用 redis 的 zset ,  可以高效的获取top 100.面试官问:这样有什么问题吗? 如果用户特别多的情况。我想了一会,也没想出什么问题,回答没什么思路。面试官:用户太多了会有 大 key 问题, zset 删除的时候会阻塞几秒。 (我不太理解)面试官:你应该考虑怎么优化?答: string 配合 zset 使用, string kv 中存 user, money,  而 zset 中只维护 top 100 的。同时更新这俩。最后, 反问部门业务:拼多多直播带货。技术栈: 面试官看我的简历里面,cpp 太底层了我们这边不用,golang 也不用,主要是 java , 然后 redis, mysql, kafka这些。面试官问我懂不懂二分, 我当时多少有点生气💢, 不过总的来说面试官人还不错,还算友善,给了很多引导。
查看13道真题和解析 牛客创作赏金赛
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务