1、Hadoop2.0的高可用
有两个NameNode节点,一个active,一个standby(时刻同步active的数据),从而实现高可用。
两个NameNode之间通过JournalNodes的独立进程进行通信,当active中的NameNode的命名空间有任何改变时,便会通知大部分的JournalNode进程。standby的NameNode有能力读取JN中的变更信息,并且一直观察edit log的变化,会将变化的信息读取到自己的命名空间,从而达到了同步的状态。
当active故障后,可以借助于ZooKeeper进行切换。
2、Hadoop集群搭建大致步骤
1)永久关闭防火墙;
2)配置主机名和host文件,方便通信;
3)机器之间免密互通;
4)安装JDK,安装Zookeeper集群;
5)配置conf/下的文件,例如hadoop-env.sh、core-site.xml、hdfs-side.xml、mapred-side.xml、yarn-site.xml、slaves;
6)每台机器配置基本相同,通过scp发送即可,记得要修改的配置文件。
3、MR调优策略
减少数据量的传输;
尽量使用内存;
减少与磁盘IO交互的次数;
增大任务并行数;
4、Hadoop处理小文件的方法
开启Hadoop的JVM重用机制(uber模式),避免海量文件频繁的启停JVM;
利用Hadoop提供的HAR技术(针对已存在的大量小文件);
map side join,将多个小文件合成一个或少量文件 – CombineTextInputFormat
5、为什么HDFS不适合存储大量的小文件?
由于在HDFS有NameNode存储文件位置信息的,使用的是内存,若存在大量的小文件,维护信息会导致NameNode的大部分内存用于存储,不利于NameNode处理。
6、数据倾斜
在MapReduce中,经常会出现数据倾斜的情况,例如订单-商品的业务中,热销产品与冷销产品之间,此时可以利用Map Side Join,就是DistributedCache(Hadoop内置的分布式缓存机制)实现。
或者说单词统计时造成数据倾斜,可以在map端的key后面添加一个随机数,这样可以将一个高频词汇拆分,之后在进行合并。
======================================================================
扩展:Reduce中底层使用了一个地址复用技术,即在迭代values时,取出的值有变化但是地址值不变,也就是不能直接添加取出的值(对象),此时可以使用克隆(clone())