大数据面试整理

  •  

    ## **参考博客:**
    https://www.csdn.net/tags/MtjaUgwsMzkwNTItYmxvZwO0O0OO0O0O.html#1_HDFS_35

    # 本博客仅供自己大数据面试整理, 如果您不小心看到了这个博客, 请带着一种批判的角度阅读,方便的话,欢迎指正其中的错误,小白谢谢你啦。
    ## 1.Hadoop
    Hadoop 三大核心: HDFS, MapReduce, YARN.
    HDFS: 分布式存储系统, 主要构成有 HDFS client, Name node, Data Node, Secondary node.
    HDFS Client 主要是用来和Name node 还有 Data node 交互的
    Name node 是存储 data node 元数据的, 比如data node 位置, 空间,是否可用之类的
    Data node 是真正存储数据的东东
    Secondary node 没太细看,应该和Name node 一起作用的,Name node 是把元数据信息写内存里, 但是 Secondary node 是把数据写到磁盘中。

    HDFS 读写过程
    读:HDFS 向 Name node 发送请求读数据,然后Name node 检查client 是不是有权限, 如果有权限,Name node 会返回给HDFS client允许读文件,然后HDFS client 提供给Name node 需要读的数据,Name node 会返回这数据所在的block和相关的data node, HDFS client 会从最近的datanode 读取数据,即***读取数据的高效性***。如果读取过程中发生错误,会从下一个相对较近的副本 data node 中读取,读完了,会关闭与data node 的连接。
    写:HDFS client 向name node 申请写数据,然后name node 会查看是否文件和目录已经存在, 若, 存在则报出异常。HDFS client把文件分解,告诉name node 需要几个block,Name node 会根据信息找到哪些data node 是可用的, 且空间够用,然后将信息传递给HDFS client。 HDFS 按照信息找到对应的data node. 比如需要三个data node A,B,C. HDFS 先和A建立通信,A-->B,B-->C, 通信建立完成后, 需要返回给HDFS 返回data node 状态。C-->B-->A-->HDFS Client, 链式的管道搭建完成后,HDFS 知道所有的data node 都是可用的,于是开始准备往A写数据,A写完了之后, A把数据写入B , B 把数据写入C,C告诉B写入完成, B 告诉A 写入完成,当所有节点数据完成后,即***数据再节点保持了一致性***,HDFS client才会开始写入第二个block的内容,直到所有的节点写入都完成。

    MapReduce: split -- map(map data by function) --shuffle (same key/hash in same partition) -- Reduce(聚合输出最终结果)

    | age|ID|
    |13|1|
    |13|1|
    |12|1|
    |13|2|

    select count(distinct ID) , age from above_table group by age;

     

     


    Yarn: 主要负责任务管理调度
    Resource Manager, Application master, Node manager, container
    Resource Manager 负责资源监控,和Node Manager 配合监控资源并启动监视应用程序
    Node manager 管理yarn 集群所有工作节点,和RM 交互,提供节点的资源和任务情况,和AM 交互,启动或停止任务。
    container 是物理封装了CPU,内存, 磁盘,网络等的资源抽象, 每个application再向RM 请求资源时, 都被分配固定的container.
    Application master 发送请求给resource manager ,Resource manager 为应用程序提供container ,并与对应的Node Manager 通讯,在container 中启动application master, application master 向RM 注册,这样用户可以通过 RM 查看程序运行状态。application mater 为程序的各个任务请求资源 , 申请到资源后, 与node manager 通信, 要求启动任务,任务向application master 报告状态,结束后, AM 申请从RM 中注销掉自己。
    例子: 比如运行一个HIVE query。
    1. 特定用户提交Tez query, 用户本身在一个applicationID中
    2. 提交代码后,其实是Application 向 resource manager 申请资源, 然后不同的组已经预定了固定的container
    3. Resource Manager 和 Node Manager 交互,查看当前container下,是否有可用的节点, 如果没有,Application 的 Query 只是显示accept,如果有的话,Node manager 会接受Application master 命令来对应的启动任务。

    ## 2.Hive
    1.分区表和分桶表
    1)分区表字段是表外字段, 通常是日期,方便按分区查询,而不是全表扫描, 但不是所有表都适用分区表,有的数据可能再某个定义分区没有内容
    2)分桶表的字段是表内字段,是按列的HASH 来分桶,因为可能即使分区后,数据还是很大,就需要更细力度来分桶,分桶通常用于抽样,提高join效率,join时会直接找到列相同的桶join. 比如 男女数据, 男的一个桶, 女的一个桶。
    2.Hive 性能优化 - 参考B站老王
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/8e38862b8b5c49309bc0b209566fd67d.png)

    1)减少数据量,避免全表扫描
    比如 select * from a join b on a.col1=b.col2 where b.col3<>'aa'
    优化后应该是 select * from a join (select * from b where b.col3<>'aa')b on a.col1=b.col2
    2)join避免数据倾斜

    大表join小表用map join
    Null数据转化成随机数
    倾斜字段打散

    3) 根据文件大小,资源调整参数 - 合并小文件
    输入文件是小量大文件, 减少map数,如果大量小文件, 增加map 数, 提高并发处理。
    Reduce 数太多,会产生大量小文件, 增加HDFS压力, reduce数太少,每个reduce需要处理大量文件 容易发生内存溢出。
    大量小文件应该合并处理。
    count distinct 相当于只有一个reduce, group by 打散
    减少job数,就是减少stage。job数少,申请资源的次数少, 效率会更高。Union all 应该都所有表union后再进行聚合。

  • Group by 时候, 某个字段的value 很多,group by 发生了数据倾斜。设置参数 hive.groupby.skewindata=True来实现负载均衡,原理就是把数据量大的值先进行map 和reduce,然后再和剩下的value进行第二次聚合。
  • Count(distinct) 默认只使用一个reduce job,select count(1) from (select uri from table group by uri)这个query是可以通过设置mapreduce.job.reduces来获得更好性能的。
  • 小表join大表,join/inner join 都可以通过设置参数 set hive.auto.convert.join = true;,实现 将小表数据缓存到内存中,默认<25M即小表,但是相对的参数。left join 不能把表放缓存中
  •  

     参考:blog.csdn.net/hongmofang10/article/details/118413758

  • b站UP:无聊的小过
posted @   超级小白23233  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示