Hi,各位小伙伴们大家好,这是大数据面试系列的第1篇,相比于输出知识点,面试系列的文章能解决更多同学的燃眉之急:找工作!!!因此,在未来的很长一段时间我会持续的对这一系列进行更新,对大数据和机器学习领域感兴趣的同学可以上方↑关注我的账号老陈秀,更新的文章会通过手机推送的方式,让你不会错过精彩的分享你们的支持是我持续输出的动力,欢迎大家点赞,评论和关注
1、自我介绍
答:略
2、Hive内部表和外部表的区别是什么?
答:区别如下:
从建表代码来看,未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
内部表数据由Hive自身管理,外部表数据则由HDFS管理;
内部表数据存储的位置是hive.metastore.warehouse.dir,默认为/user/hive/warehouse,外部表数据的存储位置由自己制定(如果没有LOCATION,Hive将在HDFS上的/user/hive/warehouse文件夹下以外部表的表名创建一个文件夹,并将属于这个表的数据存放在这里);
删除内部表会直接删除元数据(metadata)及存储数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除;
因此,在实际工作当中,hive数据表往往是以外部表的形式存在的。
3、Hadoop中有哪些调度器,这个调度器指的是Yarn中的那三个调度器。
答: 在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair cheduler。
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交的同时获得一定的系统资源。
在FIFO 调度器中,小任务会被大任务阻塞。
而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会预先占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。小任务执行完成之后也会释放自己占用的资源,大任务又获得了全部的系统资源。最终的效果就是Fair调度器即得到了高的资源利用率又能保证小任务及时完成。
4、平常使用哪一类数仓工具比较多?
答:Hive和Spark~
5、MapReduce的执行过程?
答:在我之前的文章中有详细的对MapReduce进行讲解,在这不多赘述了。感兴趣的可以进入我的主页进行查看,快速通道可点击专栏,进入大数据实战专栏进行查阅!!
6、MR过程用到了哪些排序?
答:总共可能发生4次排序过程。
(1)Map阶段
环形缓冲区:当缓冲区的数据达到阈值后,对缓冲区数据进行一次快速排序,再一些到磁盘。排序手段:快速排序(会手写)
溢写到磁盘中:当数据处理完毕后,所有文件进行归并排序。排序手段:分区归并排序(会手写)
(2)Reduce阶段
按照指定分区读取到reduce缓冲中(不够则落盘):磁盘上文件数据达到一定阈值,进行一次归并排序以生成更大的文件。排序手段:归并排序
Reduce task前分组排序:当所有文件拷贝完毕后,Reduce Task统一对内存和磁盘上所有数据进行一次归并排序。
7、你觉得MapReduce有哪些需要优化的地方?
答:略
8、Java中的基本数据类型有哪些?
答:
9、创建线程的方式有哪些?常见线程池有哪些?
答:
继承Thread类创建线程类:定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。创建Thread子类的实例,即创建了线程对象,并通过调用线程对象的start()方法来启动该线程。
通过Runnable接口创建线程类:定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象,调用线程对象的start()方法来启动该线程。
通过Callable和Future创建线程:略
四种常见的线程池:
CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。
SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。
SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。
FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程
10、数组和arraylist的区别。
答:区别如下:
数组和ArrayList的本质区别在于前者是类型安全的,而后者是类型不安全的。
ArrayList为了兼容所有类型对象,使用了Object数组,在使用元素的时候会有装箱和拆箱的操作,降低了程序的性能。
ArrayList会动态扩充容量,容量为原来的2倍。
ArrayList只有把元素添加进去之后才可以通过下标访问相应的元素。
数组在创建的时候就已经确定了数据类型,并且它的长度是固定的,只能通过下标改变各个元素的值和访问。
11、arraylist和linkedlist的区别,它们的查询时间复杂度是多少?
答:arraylist和linkedlist的区别可以理解为数组和链表的区别,对于查询,arraylist支持随机访问,时间复杂度为O(1),而linkedlist需要从头去进行遍历筛选,因此时间复杂度为O(n)。
12、HDFS的副本放置策略是什么?
答:从Hadoop1.0开始,副本存储默认为3份。在Hadoop1.0当中,当客户端提交一个文件进行存储时,若客户端属于服务器集群的一员,第一个副本会提交到客户端所在的结点,否则,存储到集群的随机一个结点。第二个副本存储的位置,会存储到不在第一个副本所在机架的其他任意结点,也即第一个副本和第二个副本不会位于同一个机架。第三个副本则会存储在与第二个副本同一机架下的随机一个结点。
在Hadoop2.0当中,当客户端提交一个文件进行存储时,若客户端属于服务器集群的一员,第一个副本会提交到客户端所在的结点,否则,存储到集群的随机一个结点。第二个副本存储的位置,会存储在第一个副本所在机架的其他任意结点,也即第一个副本和第二个副本位于同一个机架。第三个副本则会存储在与前两个副本不同机架的随机一个结点。