一、Hadoop生态圈
HDFS:分布式文件存储系统
对于一个大文件会将其分成很多block块,在每一行最后一个块处理完之后,再取第二行的第一个块,之后每个块舍弃掉第一块。
架构模型:
主:NameNode,保存文件元数据信息,接受客户端的读写服务
从:DataNode,保存文件Block信息(真正信息)
HDFS和NameNode交互元数据信息,和DataNode交互Block信息
DataNode和NameNode保持心跳,如果一段时间没有心跳NameNode判断该DataNode故障。
MapReduce
四大过程
Split
切割文件
Map
键值组对(允许重复)
Shuffer
缓冲区,生成键值对后先放入缓冲区,基于key排序。
大小达到阈值时,会将数据溢写到磁盘,相同的key放到一组。
Reduce
把重复的key的value重新聚合,map的输出是reduce的输入
Yarn
resourceManager:资源管理主服务,负责整个集群资源的管理调度
NodeManager:和DataNode放一起,随机分配任务,把需要的资源汇报给resourceManager,然后分配资源
ZooKeeper
开源的分布式协调服务。
ZKFC:协调NameNode,两只手和隐藏手
一只手:和zookeeper建立心跳
另一只手:和NameNode(Active)建立心跳,如果断了,会通知zookeeper,zookeeper会通知另一个ZKFC启动Standby
隐藏手:ZKFC和别的NameNode也连接,更改active和standby
Sqoop
是一个在结构化数据和Hadoop之间的进行批量数据迁移的工具
二、JVM调优
原则:
1、每次发生Minor GC时都应该尽可能的回收垃圾对象,减少发生Full GC的概率
2、处理吞吐量和时延问题时,可供垃圾回收器使用的内存越大,垃圾的回收效果越好。
3、在内存、延迟、吞吐量三者中按顺序选两个调优
4、在系统周期性出现卡顿时,可能是老年代空间大,而且数据多,在进行Full GC时因为数据很多所以耗时也长,会显著降低性能。
可以通过调整新生代和老年代的比例,让老年代空间缩小,就会提前进行FGC,这时需要释放的对象不是很多,性能也不会明显下降。
项目中的使用
网站访问时十分卡顿,可以使用jstat命令查看各项指标。发现FGC这个数值较大,说明FGC进行很频繁,而且耗时很长,所以推测原因在FGC上,在jvm垃圾回收时会发生stop the world,会使得工作线程停止运行,性能就下降了。在new对象之后,回收时会发生minor GC,进入老年代。这样对象的年龄会增加,到达阈值进入老年代。这样的对象多了老年代中元素就会越来越多,而如果老年代的空间设置的比较大,在进行FGC时就会耗费更多的时间。
解决方法
调整新生代和老年代的比例,降低老年代的内存占用,这样老年代会提前进行FGC,但是需要释放的元素比原来少,性能下降也比原来缓和,最好调整到用户还未有卡顿的感觉时FGC就结束。