Java开发+大数据开发-凉面考点总结

1、HDFS数据完整性校验

    (a)校验和:Hadoop在写入数据到HDFS上时,会为每一个固定长度(默认是512字节)的数据执行一次“校验和”,“校验和”的值和数据一起保存起来。在传输前和传输后分别计算一个校验和,比较两者之间的值,常采用32位循环校验码的方式(CRC32)。

    (b)数据块检测程序DataBlockScanner:DataNode运行着一个后台进程(DataBlockScanner),定期对存储在其上面的block进行检测“检验和”,然后将检测结果向NameNode报告。

注:检查到坏数据如何处理?
        1)客户端在发现坏数据后,会把坏的block和block所在的datanode报告给Namenode;
        2)NameNode会把这个block标记为“已损坏”,NameNode就不会为客户端指向这个block,也不会用这个block去复制到其他DataNode;
        3)NameNode会把一个好的block复制到另一个DataNode上;
        4)NameNode删除掉坏的block。

2、HDFS上传数据的block与HDFS存储的block关系

      一致的,都是128M,在hadoop2.7.3之前是64M。

3、Java的同步机制

4、Synchronized静态方法、非静态方法和代码块的区别

      同步非静态方法时,锁是对象实例本身,即this被系统隐式处理;

      同步静态方法Static时,锁是本类class;

      同步代码块时,需要传递锁对象,表示该对象正为我服务(可以为Object,Integer,String等)

5、Synchronize的缺陷,它与Lock区别

     1)Synchronize关键词获取锁的线程由于IO或者其他原因被阻塞,又没有释放锁,其他线程将会无限期等待,影响效率,通过Lock可以办到;

     2)多线程读写文件时,read-write和write-write会发生冲突,read-read不会发送冲突,采用Synchronize就不能read-read同时进行,通过Lock可以办到;

     3)Synchronize不能查看线程是否获取到锁,通过Lock可以办到,holdLock()方法。

     4)Lock是一个接口,Synchronize是内置关键字。Lock需要手动释放锁,Synchronize自动释放锁。

 6、Lock接口的实现子类常见的有哪些

     Lock接口提供了多种方法:lock(普通加锁,类似于Synchronize)、unlock(释放锁)、tryLock(尝试获取锁,不会阻塞)、lockInterruptibly(中断锁,未获取到锁的线程可以被中断)。

     1)ReentrantLock(排他锁):采用非公平锁

     2)ReentrantReadWriteLock(读写锁):分为读锁(共享锁)与写锁(独占锁)

7、Thread.join()的作用

     1)让主线程将锁让给从线程

     2)将并发线程变为串行线程

8、wait()/notify()与suspend()/resume()区别

    wait()/notify()阻塞时不会释放占用锁,该方法属于Object类,可以在任何位置使用;

    suspend()/resume()阻塞时会释放占用锁,该方法属于Thread类,在Synchronize修饰的方法或代码块中使用(才会有锁释放的意义)。

9、ThreadLocal为何会导致内存泄漏

    ThreadLocal为每个线程创建一个单独的变量副本,每个线程可以访问自己内部的副本变量。对外提供四种方法:set()、get()、remove()、initialValue()。通过取出Thread中ThreadLocals引用的map,然后从这个map中根据当前ThreadLocal作为参数,取出数据,只是借助ThreadLocal去获取,不是存放与ThreadLocal。

    ThreadLocal实现:每个Thread维护一个ThreadLocalMap映射表,映射表key是ThreadLocal示例本身,value是真正需要存储的Object。而ThreadLocalMap使用ThreadLocal的弱引用来作为key,当把ThreadLocal实例置为null以后,没有任何强引用指向ThreadLocal实例,所以key将会被gc回收。但是,我们的value却不能回收,因为存在一条从CurrentThread连接过来的强引用。因此出现内存溢出。

10、除了锁,其他保障线程安全的方式

      CAS(compare and swap)实现的volatile关键词

11、什么是事务,其具备什么特性

      事务是有一步或多步数据库操作序列组成的逻辑执行单元,一个最小的不可再分的工作单元,这系列操作要么全部执行,要么全部放弃执行。具备四个特性:原子性、一致性、持久性、隔离性。

12、MyISAM和InnoDB的区别

     1)MyIASM是非事务安全的,而InnoDB是事务安全的;

     2)MyIASM锁的粒度是表级的,而InnoDB支持行级锁;

     3)MyIASM支持全文类型索引,而InnoDB不支持;

     4)MyIASM的Select性能更好,InnoDB的Insert和Update性能更好;

     5)MyIASM表保存为文件形式,跨平台使用更加方便。

13、死锁的四个条件

      请求与保持、互斥、不可抢占、循环等待。

14、什么是间隙锁

      间隙锁是一个在索引记录之间的间隙上的锁,保证摸个间隙内的数据在锁定情况下不会发生任何改变。如查找时,使用唯一索引搜索唯一行时,不需要间隙锁定;没建立索引、非唯一索引、多个查询条件都会产生间隙锁。

15、实现多线程的集中方式

      1)实现Runnable接口,实现其中run方法;

      2)继承Thread类,实现其中run方法;

      3)实现Callable接口,重写call方法,通过Submit交给线程池运行。

其中,Runnable方式与Callable类似,但是Callable具有返回值、可以抛出异常、Future对象监测计算是否完成。

16、Java线程池种类,核心线程与非核心线程区别

      1)newCacheThreadPool:创建一个可缓存线程池(线程数量不定)

      2)newFixedThreadPool:创建一个定长的线程池(只有核心线程)

      3)newScheduleThreadPool:创建一个定长线程池(包含核心线程与非核心线程)

      4)newSingleThreadPool:只有一个核心线程的线程池(非同步线程池)

核心线程:固定线程数,可闲置,不会被销毁;非核心线程:闲置超时,会被回收。

17、Java如何终止一个正在运行的线程

      stop(非安全)、Interrupt(终止阻塞线程、不会终止运行线程)、标志位

18、Sql优化

      1)Sql尽量使用索引,通过索引查询

      2)子查询通过left join

19、从输入URL到页面显示的过程

      1)浏览器解析URL:解析网络协议、地址、路径资源

      2)DNS域名解析:URL——>IP地址(迭代、递归寻找)

      3)浏览器获取端口号:http默认80

      4)建立TCP/IP连接,发送HTTP请求:TCP3次握手、Nginx反向代理

      5)服务器重定向响应,返回结果:301永久重定向,302暂时重定向

      6)浏览器渲染解析:HTML与CSS解析

20、OSI七层网络协议的各自功能、职责

      1)应用层:针对特定应用规定各层协议、时序、表示等、进行封装,如HTTP。

      2)表示层:规定数据的格式化表示、数据格式的转换。

      3)会话层:规定通信时序;数据交换的定界、同步、创建检查点等。

      4)传输层:节点之间可靠地分发数据包。

      5)网络层:路由( IP寻址)、拥塞控制。

      6)数据链接层:检错与纠错(CRC码)、多路访问、寻址。

      7)物理层:定义机械特性,电气特性。

21、RDD的五大特性

      1)A list of partitions:RDD由许多partition组成

      2)A function for computing each split:对RDD做计算,相当于对RDD的每个split或partition做计算

      3)A list of dependencies on other RDDs:RDD之间有依赖关系

      4)Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned):可为key-value数据自定义分区函数

      5)Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file):运算向数据靠拢

22、堆和栈的区别

      从两个方面进行回答,内存分区和数据结构两部分。

      内存分区:堆属于线程共享部分,栈属于线程独享部分;堆由系统自动释放,栈需要手动释放和分配;堆的大小大于栈,一般堆可以分配整个内存,栈在win64为1M,Lunix为10M;堆内存地址由低到高,栈地址由高到低。

      数据结构:堆属于非线性结构,是一种特殊的完全二叉树,节点大小大于或小于父节点,即大根堆与小根堆;栈属于操作受限的线性结构,只能在一端插入删除,属于先进后出。

23、线程池任务拒绝策略

      当线程池的任务缓存队列已满并且线程吃中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务决绝策略,通常包括如下四种:
      1)ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常;

      2)ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常;

      3)ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程);

      4)ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

24、动态规划与递归的区别与关系

      递归:自己调用自己,问题由上至下解决

      动态规划:把问题划分为更小规模的子问题,通过寻找局部最优解得到全局最优解,实际是记忆性的递归,问题自底向上解决。

      引申:递归与迭代的区别:迭代是A不停调用B,利用变量原值推算变量的一个新值。

你可能感兴趣的:(Java基础,大数据,数据库)