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,利用变量原值推算变量的一个新值。