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

  1. 常见的窗口排序函数你知道哪些?说一下他们各自作用。
  2. HDFS如何保证数据的可靠性和高可用性?它的副本机制是如何工作的?
  3. ES是如何保证数据高可用性的?如果一个节点宕机,系统会如何处理?
  4. Hive表里的分桶有哪几种形式,分桶与分区的区别?什么时候要去做分桶?
  5. Spark调优思路?

常见的窗口排序函数你知道哪些?说一下他们各自作用。

常见的窗口排序函数主要包括 ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE() 等,它们常配合窗口函数 OVER(PARTITION BY ... ORDER BY ...) 使用,作用是对分组内的数据进行排序和排名。ROW_NUMBER() 是最常用的,给每一行按顺序分配唯一的序号,不会出现重复;RANK() 会对相同值的记录赋相同名次,跳过后续名次(比如并列第 2,下一名是第 4);DENSE_RANK() 同样对相同值的记录赋相同名次,但不会跳过名次(并列第 2,下一名是第 3);NTILE(n) 是把分组内的记录按顺序平均分成 n 份,为每行分配一个从 1 到 n 的桶编号。它们常用于如 TopN 查询、分组内排序、分位分析等场景,能在保留全部数据的同时进行灵活排名。

HDFS如何保证数据的可靠性和高可用性?它的副本机制是如何工作的?

HDFS 通过副本机制来保证数据的可靠性和高可用性,每个文件被切分成多个块(Block),每个块默认会在集群中存储 3 个副本,分别保存在不同的 DataNode 上,从而避免因单点故障导致数据丢失。当某个副本所在的节点宕机或数据损坏时,NameNode 会感知并在其他健康节点上重新复制该副本,自动修复数据,确保副本数维持在配置值以上;同时,HDFS 的 NameNode 虽然是管理元数据的核心,但通过配置 主备 NameNode(HA 高可用架构),结合 Zookeeper 实现故障自动切换,避免了单点故障风险。整体上,HDFS 通过副本冗余、故障感知、自愈机制和主备架构,保障了系统的稳定性与数据安全。

ES是如何保证数据高可用性的?如果一个节点宕机,系统会如何处理?

Elasticsearch 通过主分片和副本分片机制来实现数据的高可用性。每个索引的数据会被划分为多个主分片(primary shard),并为每个主分片配置一个或多个副本分片(replica shard),这些分片分布在不同的节点上。当一个节点宕机时,集群中的 Master 节点会立即检测到,并将其上的主分片的副本分片提升为新的主分片,继续对外提供读写服务,同时将缺失的副本在其他节点上重新分配和恢复,确保数据不丢失、服务不中断。此外,Elasticsearch 的分布式架构可以自动进行分片重分配、数据均衡和故障转移,从而实现系统的自我修复和持续可用。

Hive表里的分桶有哪几种形式,分桶与分区的区别?什么时候要去做分桶?

Hive 中的分桶是通过对某一列进行哈希计算,再将数据平均分配到固定数量的桶中,常见形式是在建表时使用 CLUSTERED BY (列名) INTO N BUCKETS 来定义分桶。分桶和分区的主要区别在于:分区是将数据按目录层级物理划分,适用于大范围数据的筛选,提升查询效率;而分桶是在分区或全表内部的进一步划分,提高了数据的分布均匀性和采样、Join 的效率。通常在以下场景下需要使用分桶:一是当需要对大表做 桶映射 Join(bucket map join),提升 Join 性能;二是在使用 抽样查询(tablesample) 时保证样本均匀性;三是为了优化数据倾斜问题或提升并行度。简而言之,分区适用于大粒度的数据划分,分桶适用于细粒度的数据优化。

Spark调优思路?

Spark 调优的整体思路可以从 资源配置、并行度控制、Shuffle 优化、缓存策略和代码逻辑 五个方面入手。首先是资源配置,要合理设置 executor 的数量、内存(executor-memory)和 CPU 核数(executor-cores),避免资源浪费或不足;其次是并行度控制,通过设置 spark.sql.shuffle.partitions 或 RDD 的 repartition 来调整任务并行度,防止过多或过少的分区导致性能问题;在 Shuffle 优化 方面,要尽量减少 shuffle 操作,比如用 map-side joinbroadcast join 替代大表 shuffle;对于 缓存策略,使用 persistcache 缓存重用的中间结果,减少重复计算;最后,优化 代码逻辑,如避免冗余转换、过滤尽量提前、少用宽依赖操作等,提升 DAG 执行效率。调优过程中还要结合 Spark UI 分析瓶颈,定位 Stage 执行慢的具体原因,做到有的放矢。

#牛客AI配图神器#

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

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

全部评论

相关推荐

拼多多 暑期实习 二面,总共用时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
7
分享

创作者周榜

更多
牛客网
牛客企业服务