大数据面试题

Posted 小徐xfg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据面试题相关的知识,希望对你有一定的参考价值。

 


Big Data 面试题总结

JAVA相关

1-1List set 的区别?

老掉牙的问题了,还在这里老生常谈:List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复

 

1-2)数据库的三大范式?

原子性、一致性、唯一性

 

1-3java io类的图解

 

1-4)对象与引用对象的区别

对象就是好没有初始化的对象,引用对象即使对这个对象进行了初始化,这个初始化可以使自己的直接new的也可以是直接其他的赋值的,那么背new或者背其他赋值的我们叫做是引用对象,最大的区别于

 

1-5)谈谈你对反射机制的理解及其用途?

反射有三种获取的方式,分别是:forName  / getClass / 直接使用class方式 使用反射可以获取类的实例

1-6)列出至少五种设计模式

设计方式有工厂法,懒加载,观察者模式,静态工厂,迭代器模式,外观模式、、、、

 

1-7RPC 原理?

Rpc分为同步调用和一部调用,异步与同步的区别在于是否等待服务器端的返回值。Rpc的组件有RpcServer,RpcClick,RpcProxy,RpcConnection,RpcChannel,RpcProtocol,RpcInvoker等组件,

 

1-8ArrayListVectorLinkedList 的区别及其优缺点?HashMapHashTable 的区别及优缺点?

    ArrayList Vector 是采用数组方式存储数据的,是根据索引来访问元素的,都可以

根据需要自动扩展内部数据长度,以便增加和插入元素,都允许直接序号索引元素,但

是插入数据要涉及到数组元素移动等内存操作,所以索引数据快插入数据慢,他们最大

的区别就是 synchronized 同步的使用。

    LinkedList 使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但

是插入数据时只需要记录本项的前后项即可,所以插入数度较快!

如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用 Vector

ArrayList 都可以。如果是对其它指定位置的插入、删除操作,最好选择 LinkedList

HashMapHashTable 的区别及其优缺点:

     HashTable 中的方法是同步的 HashMap 的方法在缺省情况下是非同步的 因此在多线程环境下需要做额外的同步机制。

    HashTable 不允许有 null key value 都不允许,而 HashMap 允许有 null keyvalue 都允许 因此 HashMap 使用 containKey()来判断是否存在某个键。

HashTable 使用 Enumeration ,而 HashMap 使用 iterator

     Hashtable Dictionary 的子类,HashMap Map 接口的一个实现类。

1-9)使用 StringBuffer 而不是 String

当需要对字符串进行操作时,使用 StringBuffer 而不是 StringString read-only 的,如果对它进行修改,会产生临时对象,而 StringBuffer 是可修改的,不会产生临时对象。

1-10)集合的扩充

ArrayList  list = new ArrayList(90000); list扩充多少次??

 public ArrayList()

        this(10);

默认的扩充是10由此计算

 

1-11java的拆包与封包的问题

 

System.out.println("5" + 2);

52

 

1-12JavaClass.forNameClassLoader.loadClass的区别

Class.forName("xx.xx")等同于Class.forName("xx.xx",true,CALLClass.class.getClassLoader()),第二个参数(bool)表示装载类的时候是否初始化该类,即调用类的静态块的语句及初始化静态成员变量。

 

ClassLoader loader = Thread.currentThread.getContextClassLoader(); //也可以用(ClassLoader.getSystemClassLoader())

 

Class cls = loader.loadClass("xx.xx"); //这句话没有执行初始化

 

forName可以控制是否初始化类,而loadClass加载时是没有初始化的。

 

1-13hashMaphashTable的区别

                   HashMap                Hashtable

 

父类               AbstractMap          Dictiionary

 

是否同步                                        

 

kv可否null        是                            否

 

 

HashtableHashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

 

1-14)怎样实现数组的反转

ArrayList arrayList = new ArrayList();  

 arrayList.add("A");  

 arrayList.add("B");

 

对数组进行反转

Collections.reverse(arrayList);

 

1-15)请使用JAVA实现二分查找

一般的面试者都是些向看看你的思路,所以一般答题时只需要把思路写出来即可。

具体的实现如下:

二分查找就是折半查找,要想折半就必须把原来的数据进行排序,才能方便的查找:

实现代码如下:

 public static int binarySearch(int[] srcArray, int des)   

        int low = 0;   

        int high = srcArray.length-1;   

        while(low <= high)   

            int middle = (low + high)/2;   

            if(des == srcArray[middle])   

                return middle;   

            else if(des <srcArray[middle])   

                high = middle - 1;   

            else   

                low = middle + 1;   

              

          

        return -1;  

   

 

 

1-16java 中有两个线程怎样等待一个线程执行完毕

可以使用join关键字

 

1-17hashmap hashtable currentHashMap的使用区别

     hashmap hashtable 的醉的的区别在于hashtable 是线程安全的,而hashmap 不是线程安全的,currentHashMap也是线程安全的。

     ConcurrentHashMap是使用了锁分段技术技术来保证线程安全的。所分段的技术是:讲数据分成一段一段的储存,给每一段的数据添加一把锁,当线程访问一个数据时,其他的数据可以被访问。

 

1-18)简单描述一下javagc机制,常用的JAVA调优的方法,OOM如何产生的,如何处理OOM问题???

1、程序在运行时会产生很多的对象的信息,当这些对象的信息没有用时,则会被gc回收

2、调优的方式主要是调节年轻代与老年代的内存的大小

3、OOMOutOfMemory的缩写(搞得跟多高大上似的)就是线程创建的多了,没有及时的回收过来所产生的,代码如下:

public class JavaVMStackOOM  

    private void dontStop()  

        while (true)  

              

          

      

      

    public void stackLeakByThread()  

        while (true)  

            Thread thread = new Thread(new Runnable()  

                @Override  

                public void run()  

                    dontStop();  

                  

            );  

            thread.start();  

          

      

      

    public static void main(String[] args)  

        JavaVMStackOOM oom = new JavaVMStackOOM();  

        oom.stackLeakByThread();  

 

 

4、既然知道以上的现象,在写代码时应该注意,不要过多的创建线程的数目。

 

 

Linux 相关

2-1)关闭不必要的服务

A、使用ntsysv命令查看开启与关闭的服务

B、停止打印服务

[root@hadoop1 /]# /etc/init.d/cups stop

[root@hadoop1 /]# chkconfig cups off

2-2)关闭IP6

[root@hadoop1 /]# vim /etc/modprobe.conf

在下面添加一下配置:

alias net-pf-10 off

alias ipv6 off

2-3)调整文件的最大的打开数

查看当前的文件的数量:[root@hadoop1 /]#ulimit -a

修改配置:
[root@hadoop1 /]# vi /etc/security/limits.conf 在文件最后加上:

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

2-4)修改 linux 内核参数

[root@hadoop1 /]# vi /etc/sysctl.conf

在文本的最后追加一下内容:

net.core.somaxconn = 32768

 

表示物理内存使用到 90%100-10=90)的时候才使用 swap 交换区

2-5)关闭 noatime

在最后追加一下内容

/dev/sda2 /data ext3 noatime,nodiratime 0 0

 

 

2-6)请用shell命令把某一个文件下的所有的文件分发到其他的机器上

Scp  -r  /user/local   hadoop2:/user/local

 

2-7echo 1+1 && echo "1+1" 会输出什么

 

[root@hadoop1 ~]# echo 1+1 && echo "1+1"

1+1

1+1

 

[root@hadoop1 ~]# echo 1+1 && echo "1+1" && echo "1+" 1

1+1

1+1

1+ 1

 

2-8)在当前的额目录下找出包含祖母a并且文件的额大小大于55K的文件

[root@hadoop1 test]# find  .|  grep -ri "a"

a.text:a

 

后半句没有写出来,有时间在搞

 

 

2-9linux用什么命令查看cpu,硬盘,内存的信息?

Top 命令

 

Hadoop相关

3-1)简单概述hdfs原理,以及各个模块的职责

 

 

 

 

1、客户端向 nameNode 发送要上传文件的请求

2nameNode 返回给用户是否能上传数据的状态

3、加入用户端需要上传一个 1024M 的文件,客户端会通过 Rpc 请求 NameNode,并返回需要上传给那些 DataNode(分配机器的距离以及空间的大小等),namonode会选择就近原则分配机器。

4、客户端请求建立 block 传输管道 chnnel 上传数据

5、在上传是 datanode 会与其他的机器建立连接并把数据块传送到其他的机器上

6dataNode namenode 汇报自己的储存情况以及自己的信息

7、档第一个快上传完后再去执行其他的复制的传送

 

 

 

3-2mr的工作原理

 

 

 

 

1、当执行mr程序是,会执行一个Job

2、客户端的jobClick会请求namenodejobTracker要执行任务

3、jobClick会去HDFS端复制作业的资源文件

4、客户端的jobClick会向namenode提交作业,namenode做准备

5、NamenodejobTracker会去初始化创建的对象

6、Namenode会获取hdfs的划分的分区

7、Namenode去检查TaskTracker的心跳信息,查看存活的机器

8、当执行的datenode执行任务时Datenode会去HDFS获取作业的资源的文件

9、TaskTracker会去执行代码,并登陆JVM的执行渠道

10、JVM或执行MapTask或者ReduceTask

11、执行终结

 

 

3-3)怎样判断文件时候存在

这是linux上的知识,只需要在IF[ -f ] 括号中加上-f参数即可判断文件是否存在

 

 

3-4fsimageedit的区别?

 

大家都知道namenode与secondary namenode 的关系,当他们要进行数据同步时叫做checkpoint时就用到了fsimage与edit,fsimage是保存最新的元数据的信息,当fsimage数据到一定的大小事会去生成一个新的文件来保存元数据的信息,这个新的文件就是edit,edit会回滚最新的数据。

 

3-5hdfs中的block默认保存几份?

不管是hadoop1.x 还是hadoop2.x 都是默认的保存三份,可以通过参数dfs.replication就行修改,副本的数目要根据机器的个数来确定。

 

3-6列举几个配置文件优化?

Core-site.xml 文件的优化

 

fs.trash.interval

默认值: 0

说明: 这个是开启hdfs文件删除自动转移到垃圾箱的选项,值为垃圾箱文件清除时间。一般开启这个会比较好,以防错误删除重要文件。单位是分钟。

 

dfs.namenode.handler.count

默认值:10

说明:hadoop系统里启动的任务线程数,这里改为40,同样可以尝试该值大小对效率的影响变化进行最合适的值的设定。

 

mapreduce.tasktracker.http.threads

默认值:40

说明:mapreduce是通过http进行数据传输的,这个是设置传输的并行线程数。

 

3-7) 谈谈数据倾斜,如何发生的,并给出优化方案

     数据的倾斜主要是两个的数据相差的数量不在一个级别上,在只想任务时就造成了数据的倾斜,可以通过分区的方法减少reduce数据倾斜性能的方法,例如;抽样和范围的分区、自定义分区、数据大小倾斜的自定义侧咯

 

3-8)简单概括安装hadoop的步骤

1.创建 hadoop 帐户。

2.setup.改 IP。

3.安装 java,并修改/etc/profile 文件,配置 java 的环境变量。

4.修改 Host 文件域名。

5.安装 SSH,配置无密钥通信。

6.解压 hadoop。

7.配置 conf 文件下 hadoop-env.sh、core-site.sh、mapre-site.sh、hdfs-site.sh。

8.配置 hadoop 的环境变量。

9.Hadoop namenode -format

10.Start-all.sh

 

3-9)简单概述hadoop中的角色的分配以及功能

Namenode:负责管理元数据的信息

SecondName:做namenode冷备份,对于namenode的机器当掉后能快速切换到制定的Secondname上

DateNode:主要做储存数据的。

JobTracker:管理任务,并把任务分配到taskTasker

TaskTracker:执行任务的

 

3-10)怎样快速的杀死一个job

1、执行hadoop  job -list  拿到job-id

2、Hadoop job kill hadoop-id

 

3-11)新增一个节点时怎样快速的启动

Hadoop-daemon.sh start datanode

 

3-12)你认为用java , streaming , pipe 方式开发map/reduce,各有什么优点

开发mapReduce只用过java与hive,不过使用java开发mapreduce显得笨拙,效率也慢,基于java慢的原因于是hive,这样就方便了查询与设计

 

3-13)简单概述hadoopjoin的方法

Hadoop 常用的jion有reduce side join  , map side  join ,  SemiJoin 不过reduce side join 与 map side join 比较常用,不过都是比较耗时的。

 

3-14)简单概述hadoopcombinetpartition的区别

combinepartition都是函数,中间的步骤应该只有shuffle combine分为map端和reduce端,作用是把同一个key的键值对合并在一起,可以自定义的,partition是分割map每个节点的结果,按照key分别映射给不同的reduce,也是可以自定义的。这里其实可以理解归类。

3-15 ) hdfs 的数据压缩算法

 Hadoop 的压缩算法有很多,其中比较常用的就是gzip算法与bzip2算法,都可以可通过CompressionCodec来实现

 

3-16hadoop的调度

Hadoop 的调度有三种其中fifo的调度hadoop的默认的,这种方式是按照作业的优先级的高低与到达时间的先后执行的,还有公平调度器:名字见起意就是分配用户的公平获取共享集群呗!容量调度器:让程序都能货到执行的能力,在队列中获得资源。

 

3-17reduce 后输出的数据量有多大?

输出的数据量还不是取决于map端给他的数据量,没有数据reduce也没法运算啊!!

 

3-18) datanode 在什么情况下不会备份?

Hadoop保存的三个副本如果不算备份的话,那就是在正常运行的情况下不会备份,也是就是在设置副本为1的时候不会备份,说白了就是单台机器呗!!还有datanode 在强制关闭或者非正常断电不会备份。

3-19combine 出现在那个过程?

Hadoopmap过程,根据意思就知道结合的意思吗,剩下的你们就懂了。想想wordcound

 

3-20) hdfs 的体系结构?

HDFSnamenodesecondraynamenodedatanode 组成。

namenode 负责管理 datanode 和记录元数据

secondraynamenode 负责合并日志

datanode 负责存储数据

3-21) hadoop flush 的过程?

Flush 就是把数据落到磁盘,把数据保存起来呗!

 

3-22) 什么是队列

队列的实现是链表,消费的顺序是先进先出。

 

3-23)三个 datanode,当有一个 datanode 出现错误会怎样?

第一不会给储存带来影响,因为有其他的副本保存着,不过建议尽快修复,第二会影响运算的效率,机器少了,reduce在保存数据时选择就少了,一个数据的块就大了所以就会慢。

 

3-24mapReduce 的执行过程

首先map端会Text 接受到来自的数据,text可以把数据进行操作,最后通过contextkeyvalue写入到下一步进行计算,一般的reduce接受的value是个集合可以运算,最后再通过context把数据持久化出来。

 

3-25Cloudera 提供哪几种安装 CDH 的方法

· Cloudera manager

· Tarball

· Yum

· Rpm

 

3-26)选择题与判断题

http://blog.csdn.net/jiangheng0535/article/details/16800415

 

3-27hadoopcombinetpartition效果图

 

 

3-28hadoop 的机架感知(或者说是扩普)

看图说话

数据块会优先储存在离namenode进的机器或者说成离namenode机架近的机器上,正好是验证了那句话不走网络就不走网络,不用磁盘就不用磁盘。

 

3-29)文件大小默认为 64M,改为 128M 有啥影响?

这样减少了namenode的处理能力,数据的元数据保存在namenode上,如果在网络不好的情况下会增到datanode的储存速度。可以根据自己的网络来设置大小。

 

3-30datanode 首次加入 cluster 的时候,如果 log 报告不兼容文件版本,那需要namenode 执行格式化操作,这样处理的原因是?

     这样处理是不合理的,因为那么 namenode 格式化操作,是对文件系统进行格式

化,namenode 格式化时清空 dfs/name 下空两个目录下的所有文件,之后,会在目

dfs.name.dir 下创建文件。

     文本不兼容,有可能时 namenode datanode 的 数据里的 namespaceID

clusterID 不一致,找到两个 ID 位置,修改为一样即可解决。

3-31)什么 hadoop streaming

提示:指的是用其它语言处理

 

3-32MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么?

     一个 MapReduce 作业由 Map 阶段和 Reduce 阶段两部分组成,这两阶段会对数

据排序,从这个意义上说,MapReduce 框架本质就是一个 Distributed Sort。在 Map

阶段,在 Map 阶段,Map Task 会在本地磁盘输出一个按照 key 排序(采用的是快速

排序)的文件(中间可能产生多个文件,但最终会合并成一个),在 Reduce 阶段,每

Reduce Task 会对收到的数据排序,这样,数据便按照 Key 分成了若干组,之后以

组为单位交给 reduce()处理。很多人的误解在 Map 阶段,如果不使用 Combiner

便不会排序,这是错误的,不管你用不用 CombinerMap Task 均会对产生的数据排

序(如果没有 Reduce Task,则不会排序,实际上 Map 阶段的排序就是为了减轻 Reduce

端排序负载)。由于这些排序是 MapReduce 自动完成的,用户无法控制,因此,在

hadoop 1.x 中无法避免,也不可以关闭,但 hadoop2.x 是可以关闭的。

 

3-33hadoopshuffer的概念

Shuffer是一个过程,实在map端到reduce在调reduce数据之前都叫shuffer,主要是分区与排序,也就是内部的缓存分分区以及分发(是reduce来拉数据的)和传输

 

3-34hadoop的优化

1、优化的思路可以从配置文件和系统以及代码的设计思路来优化

2、配置文件的优化:调节适当的参数,在调参数时要进行测试

3、代码的优化:combiner的个数尽量与reduce的个数相同,数据的类型保持一致,可以减少拆包与封包的进度

4、系统的优化:可以设置linux系统打开最大的文件数预计网络的带宽MTU的配置

5、 job 添加一个 Combiner,可以大大的减少shuffer阶段的maoTask拷贝过来给远程的   reduce task的数据量,一般而言combinerreduce相同。

6、在开发中尽量使用stringBuffer而不是stringstring的模式是read-only的,如果对它进行修改,会产生临时的对象,二stringBuffer是可修改的,不会产生临时对象。

7、修改一下配置:

一下是修改 mapred-site.xml 文件

修改最大槽位数

槽位数是在各个 tasktracker 上的 mapred-site.xml 上设置的,默认都是 2

<property>

<name>mapred.tasktracker.map.tasks.maximum</name>

task 的最大数

<value>2</value>

</property>

<property>

<name>mapred.tasktracker.reduce.tasks.maximum</name>

ducetask 的最大数

<value>2</value>

</property>

调整心跳间隔

集群规模小于 300 时,心跳间隔为 300 毫秒

mapreduce.jobtracker.heartbeat.interval.min 心跳时间

北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090

mapred.heartbeats.in.second 集群每增加多少节点,时间增加下面的值

mapreduce.jobtracker.heartbeat.scaling.factor 集群每增加上面的个数,心跳增多少

启动带外心跳

mapreduce.tasktracker.outofband.heartbeat 默认是 false

配置多块磁盘

mapreduce.local.dir

配置 RPC hander 数目

mapred.job.tracker.handler.count 默认是 10,可以改成 50,根据机器的能力

配置 HTTP 线程数目

tasktracker.http.threads 默认是 40,可以改成 100 根据机器的能力

选择合适的压缩方式

snappy 为例:

<property>

<name>mapred.compress.map.output</name>

<value>true</value>

</property>

<property>

<name>mapred.map.output.compression.codec</name>

<value>org.apache.hadoop.io.compress.SnappyCodec</value>

</property>

 

3-35)3 datanode 中有一个 个datanode 出现错误会怎样?

这个 datanode 的数据会在其他的 datanode 上重新做备份。

 

3-36)怎样决定mapreduce的中的map以及reduce的数量

mapreducemap是有块的大小来决定的,reduce的数量可以按照用户的业务来配置。

 

3-37)两个文件合并的问题

给定ab两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出ab文件共同的url

 

    主要的思想是把文件分开进行计算,在对每个文件进行对比,得出相同的URL,因为以上说是含有相同的URL所以不用考虑数据倾斜的问题。详细的解题思路为:

 

可以估计每个文件的大小为5G*64=300G,远大于4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 
    遍历文件a,对每个url求取hash(url)%1000,然后根据所得值将url分别存储到1000个小文件(设为a0,a1,...a999)当中。这样每个小文件的大小约为300M。遍历文件b,采取和a相同的方法将url分别存储到1000个小文件(b0,b1....b999)中。这样处理后,所有可能相同的url都在对应的小文件(a0 vs b0, a1 vs b1....a999 vs b999)当中,不对应的小文件(比如a0 vs b99)不可能有相同的url。然后我们只要求出1000对小文件中相同的url即可。 
    比如对于a0 vs b0,我们可以遍历a0,将其中的url存储到hash_map当中。然后遍历大数据高频面试题:HDFS核心高频面试题

面试题--如何渲染几万条数据并不卡住界面

大数据面试题——Flink面试题

大数据面试题——Flink面试题

大数据面试题:ZooKeeper核心高频面试题

大数据面试题:Hadoop优化核心高频面试题