Hadoop架构基础知识面试题

1.yarn的调度器有三种(了解):

容量调度器:Capacity Scheduler:配置多个队列,同时运行先提交的大任务和后提交的小任务
公平调度器:Fair Scheduler:两个任务公平的共享集群资源,不浪费资源;
先进先出调度器:FIFO Scheduler:按照任务的提交顺序,先提交的任务优先满足其资源需求

2.Flume简介:(了解)

Flume是Cloudera公司的产品,后期捐给Apache进行重构成为顶级项目
Flume 0.9X版本的统称Flume OG ,Flume1.X版本的统称Flume NG
Fluem的核心进程是Agent
Agent由三个部分组成,Source、sink、Channel

3.Phoenix的介绍(了解)

提供标准的SQL以及完备的ACID事务支持
Apache Phoenix让Hadoop中支持低延迟OLTP和业务操作分析 ——oltp就是增删改查的操作
Phoenix不会影响HBase性能,反而会提升HBase性能
Phoenix不可以将SQL推送到所有的NoSQL数据库去执行

4.sqoop简介(重要)

Sqoop是Apache旗下的一款开源工具,13年成为顶级项目
Apache Sqoop是在Hadoop生态体系和SQL体系之间传送数据的一种工具,面向关系型数据库,不是NoSQL
导入表数据子集 时可以使用–where和–query参数
sqoop增量导入是仅导入新添加的表中的行的技术:append和lastmodified
append只能对大于last value的数据追加,不能等于
lastmodified是追加大于和等于last value的数据和最后修改的数据

5.hbase简介(重点)

master只维护表和region的元数据,和读写没关系
任何时刻,一个region只能分配给一个region server
In-memory compaction是指数据 先写入Active segment ,再移动到pipeline中 ,多个pipeline内存中合并
Major Compaction操作是对Region下的Store下的所有StoreFile执行合并操作
常用的Source组件类型有 avro、exec、spooling directory、netcat
常用的sink组件类型有 hdfs、logger、avro 、file_roll 本地文件系统
常用的Channel选择器两种类型,分别是Replicating(复制)和Multiplexing(多路复用)。还有Memory Channel和File Channel两种存储通道。

常用的Sink处理器三个:
DefaultSinkProcessor对应的是单个的Sink
LoadBalancingSinkProcessor和FailoverSinkProcessor对应的是Sink Group,
LoadBalancingSinkProcessor可以实现负载均衡的功能,
FailoverSinkProcessor可以错误恢复的功能。

MemStore默认达到了128M时开始刷写
RegionServer级别的刷写是指所有的memstore达到RegionServer 整个 JVM 内存使用量的 40%的95%开始刷写
MemStore的存活时间超过1小时(默认),触发Flush溢写
当海量请求快速写入memstore时,Region级别的刷写控制默认128*4=512MB 时出现阻塞
对于Hive的String类型相当于数据库的varchar类型
Hive截止3.x共有三种复杂数据类型Array、Map 和 Struct 对象
Hive的复杂数据类型允许任意层次的嵌套
hive类型转化出错它会返回错误,除非使用cast强制转换操作,会返回null

6.hive的窗口函数有哪些:(重点)

  1. 窗口函数over(partition by, order by rows between and)
  2. 窗口聚合函数:count() avg() sum() max() min()
  3. 窗口分析函数:first_value() last_value() lag() lead()
  4. 窗口排序函数:rank dense_rank row_number ntile
  5. 窗口序列函数:cume_dist:小于等于当前值的行数/分组内总行数,
    percent_rank分组内当前行的RANK值-1/分组内总行数-1,适用于复杂算法
  6. 窗口分组函数: GROUPING SETS group by GROUPING__ID WITH CUBE WITH ROLLUP
  7. 反射函数:reflect(classname,method,args)
  8. 抽样函数 Sampling rand() LIMIT DISTRIBUTE+SORT
    DISTRIBUTE BY rand() SORT BY rand() LIMIT 2;
    rand()随机抽样
    TABLESAMPLE (BUCKET x OUT OF y [ON colname]) on rand()|| on 分桶字段
  9. 自定义函数:UDF一进一出,继承UDF ,重写evaluate方法
    UDAF ,聚合函数,多进一出;UDTF表生成函数 一进多出

7.hbase的两种协调器(了解):

  1. observer:Observer 类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。
    Observer 可以实现权限管理、优先级设置、监控、 ddl 控制、 二级索引等功能

  2. endpoint:Endpoint 协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint 协处理器执行一段 Server 端代码,并将 Server 端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作

8. 简述hive的内部表、外部表、临时表、视图、物化视图、索引的特点

内部表:存储数据,可以删除源数据
外部表:不可以删除数据
临时表:只存在于当前会话
视图:逻辑存在,没有实际上的数据。删除或更改基础表,则视图将失败,并且视图不能存储数据,操作数据,只能查询作用是简化查询操作
物化视图:实际存在,有数据,作用是加快查询效率,注意:只能在事务表创建。Hive3.0引入。数据更新需要rebuild
索引:给字段添加索引,基于索引字段加快查询,Hive0.7版本开始,到Hive3.0不再支持,数据更新,维护比较麻烦

实际工作场景中,一般不推荐使用Hive Index,推荐使用ORC文件格式中的索引来代替Hive Index提高查询性能

9. 简述hbase的寻址流程

hbase:1. 先是客户端发送请求通过ZK找到数据库的meta表所在的regionServer的位置
2. 根据meta表中的(原始信息)元数据信息查出 region的位置
3. 根据namespace、表名和rowkey根据meta表中的数据找到对应的region信息
4. 找到对应的region在跟进列蔟找到对应的store。
5. store里面有一块写缓存memstore,首先去memstore中去寻找,如果有直接返回
6. 如果没有再去blackache块缓存,属于regionServer级别,声称读缓存,如果有直接返回
7. 如果还没有最后找storefile,找到后首先把数据扔到客户端,其次在blackache存一份,方便下次读取

10. 简述flume的执行流程

flume:
1. source监察端口或者文件,数据发生变化时提交给channel
channel首先会进入channel执行器 ,然后进入channel拦截器,拦截器可以有一个或多个,次中可以对数据进行预清洗,拦截器出来后再返回一个channel执行器,然后执行器调用channel选择器,选择器中有两种选择,默认选择是复制,另一个是多路复用——会有多种配置,选择好之后跑出channel进入sink
2. 然后channel接收source的数据信息,传输到sink
进入sink,同样sink也有处理器 ,共三种类型,分别是DefaultSinkProcessor、LoadBalancingSinkProcessor和FailoverSinkProcessor,通过配置选择一种执行传输到sink
3.  最后sink接收channel的输出信息,下沉到HDFS或者其他终端。

11. 简述hive的拉链表更新增量数据流程

拉链表:
1. 先创建老表
2. 创建增量数据表,导入增量数据
3. 创建临时表
4. 增量表和老表聚合的数据覆盖导入临时表
5. 老表映射临时表的信息,并覆盖

整体实现过程一般分为三步,第一步先增量采集所有新增数据【增加的数据和发生变化的数据】放入一张增量表。第二步创建一张临时表,用于将老的拉链表与增量表进行合并。第三步,最后将临时表的数据覆盖写入拉链表中

12. 简述flume的事务机制

flume事务是Channel提供的,因为要保证双向一致,所以使用两个独立的事务分别负责从soucrce到channel,以及从channel到sink的事件传递。

Put事务流程:
1、事务开始的时候会调用一个doPut 方法,doPut方法将一批数据放在putList中。
2、putList在向Channel发送数据之前先检查Channel的容量能否放得下,如果放不下一个都不放,只能doRollback;数据批的大小取决于配置参数batch size的值;
3、putList的大小取决于配置Channel的参数transaction capacity的大小,该参数大小就体现在putList上;(Channel的另一个参数capacity指的是Channel的容量);
4、数据顺利的放到putList之后,接下来可以调用doCommit方法,把putList中所有的Event放到 Channel 中,成功放完之后就清空putList;

注意:在doCommit提交之后,事务在向Channel存放数据的过程中,事务容易出问题。如Sink取数据慢,而Source放数据速度快,容易造成Channel中数据的积压,如果putList中的数据放不进去,会如何呢?
此时会调用 doRollback 方法,doRollback方法会进行两项操作:
1、将putList清空
2、抛出 ChannelException异常。

Take事务流程:
1、 事务开始后,doTake方法会将channel中的event剪切到takeList中。
2、 如果后面接的是HDFS Sink的话,在把Channel中的event剪切到takeList中的同时也往写入HDFS的IO缓冲流中放一份event(数据写入HDFS是先写入IO缓冲流然后flush到HDFS);
3、 当takeList中存放了batch size 数量的event之后,就会调用doCommit方法,doCommit方法会做两个操作:
针对HDFS Sink,手动调用IO流的flush方法,将IO流缓冲区的数据写入到HDFS磁盘中;
清空takeList中的数据

注意:flush到HDFS的时候组容易出问题。flush到HDFS的时候,可能由于网络原因超时导致数据传输失败,这个时候调用doRollback方法来进行回滚,回滚的时候由于takeList中还有备份数据,所以将takeList中的数据原封不动地还给channel,这时候就完成了事务的回滚。
但是,如果flush到HDFS的时候,数据flush了一半之后出问题了,这意味着已经有一半的数据已经发送到HDFS上面了,现在出了问题,同样需要调用doRollback方法来进行回滚,回滚并没有“一半”之说,它只会把整个takeList中的数据返回给 channel,然后继续进行数据的读写。这样开启下一个事务的时候容易造成数据重复的问题。

13. 简述hbase的三大机制以及触发时机

hbase:
1. 溢写:当MemStore写入的值变多,触发溢写操作;
Region级别:memstore内存达到128的时候开始溢写 
RegionServer级别:刷写占用jvm40%的95%
自动刷写 :MemStore的存活时间超过1小时(默认),触发Flush溢写
手动刷写:shell命令 flush ‘tablename’或者flush ‘region name’分别对一个表或者一个Region进行flush。


2. 合并:
内存:
major compaction:默认每3.5到10.5天一次随机大合并
minor compaction:默认是3-10个文件进行合并,不会删除其他版本的数据

3. 切分:一个region只能分配给一个region server

第一次切分是256M 以后是10G
2之前是Min(10G,128*2*reginCount^3)

14 .简述flume的数据积压、数据重复、数据丢失场景

flume:
1. 数据积压:由于网络传输不稳定,Source输入块,sink输出慢,在channel中数据达到一定累积就会形成积压
2. 数据丢失:Channel有两种Memory Channel和File Channel
当使用Memory Channel的时候出现停电或程序死亡就会导致数据丢失,因为Memory Channel是基于内存的;
3. 数据重复: sink输出到指定路径输出完成 网络延迟高造成事务回滚再次刷新数据造成重复


15. 简述HDFS的HA实现原理,以及HA环境下的hadoop进程

1. hdfs只有一个namenode,所以只要挂了就不能使用
2. 所以说再启用一个namenode,两个namenode存储的元数据事一样的互为备份
3. 同一时刻分为不同的状态,然后是Active和Standby,只有处于Active状态的提供服务,另外提供备用
4. 防止脑裂所谓脑裂就是存储相同元数据的两个namenode同时服务,
5. 当某一时刻由于网络,namenode不能提供服务,备用的开始提供服务,网络好转后原来事Active的namenode又恢复状态,就会形成同时两个一起服务
6. HA提供了隔离机制,为了防止脑裂,同一时刻只允许一个namenode
7. 就是当namenode处于Active由于网络停止服务时备用的namenode会通过SSh远程登录的方式把进程kill -9。
8. 还要解决元数据的共享问题,原来的时候只有一个namenode,数据都存储在这个namenode的磁盘上,当他挂了的时候,另一台没有元数据不能立刻提供服务,所以要将元数据不要存在本地上,找个共享的地方都能读写。
9. 把处于Active状态的namemode生成的元数据放到一个共享的位置,让处于Standby状态的namenode也能读取到,这样的话,Active的namenode一旦挂掉另一个立刻就能提供服务。
10. 共享的位置比如FTP,一启动文件地址其他用户就可以上传或获取
11. Hadoop提供了journalnode,分布式的共享存储,在运行的时候只有处于Active状态的namenode才能够向共享存储写数据,另一个只能从共享存储读取数据,时刻的保持数据的一致性。
12. SecondaryNameNode为namemode定时的执行编辑日志,把新生的元数据和进fsimage,HA中namenode互为合并,当处于Standby的时候只能读,把读取的数据合并,当处于Active状态的时候把数据上传上去
13. HA还有一个故障转移控制器FailoverController,是一个Java进程,也是ZK的一个客户端,每个namenode都有一个故障转移控制器。负责监控namenode的健康状况,每隔一段时间ping一下,ZKFC会帮namenode在ZK上抢注Active状态。ZK上有监听和锁,起到了协调HDFS的作用。


HDFSHA:数据以块的形式分布在不同的机器上,每台机器上的当前数据都会在临近节点的机器进行备份,比如node-1机器挂了,namenode会寻找其他节点上的数据,然后继续提交执行

16. 简述hive的分区表和分桶表的区别

都是为了避免全表扫描
1. 分区表:分的是文件夹,被分的字段不能存在表中
2. 分桶表:分的是文件
可以优化join连接
可以优化分桶表的抽样查询
SMB join

17. 编写java代码实现以下关于hbase操作:

创建名称为test5的NameSpace
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.junit.Test;

public class Text1 {
    Admin admin=null;
    Configuration configuration=null;


     @Test
     public void test() throws Exception{

        configuration=new Configuration();
         configuration.set("hbase.zookeeper.quorum","node-a-1");
         configuration.set("hbase.zookeeper.property.clientPort", "2181");
         Connection connection=ConnectionFactory.createConnection(configuration);
         admin=connection.getAdmin();
         NamespaceDescriptor.Builder builder=NamespaceDescriptor.create("test5");
         NamespaceDescriptor build=builder.build();
         admin.createNamespace(build);

     }
}
18. 判断test5中是否有表user【列族C1】,如果有则删除,没有则创建
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;


public class text2 {

    @Test
    public void test() throws Exception{
        Configuration con =new Configuration();
        con.set("hbase.zookeeper.quorum","node-a-1:2181");
        Connection connection =ConnectionFactory.createConnection(con);
        Admin admin=connection.getAdmin();
        String TABLE_NAME ="test5:user";
        String COLUMN_FAMILY = "C1";
        if (admin.tableExists(TableName.valueOf(TABLE_NAME))){
            return;
        }

        // 2. 构建表描述构建器
            TableDescriptorBuilder tableDescriptorBuilder =TableDescriptorBuilder.newBuilder(TableName.valueOf(TABLE_NAME));
        
        // 3. 构建列蔟描述构建器
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder =ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(COLUMN_FAMILY));
        // 4. 构建列蔟描述
            ColumnFamilyDescriptor columnFamilyDescriptor =columnFamilyDescriptorBuilder.build();

        // 添加列蔟
            tableDescriptorBuilder .setColumnFamily(columnFamilyDescriptor );
        // 5. 构建表描述
        TableDescriptor build=tableDescriptorBuilder .build();

            admin.createTable(build);

        admin.close();
        connection.close();

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值