hadoop:是一个生态圈,核心是分布式存储和计算
1、datanode:
一个文件被划分成多个block进行存储,datanode是用来存储这些block的,datanode启动时候会把他存储的blocklist发送给namenode。
datanode会定期给namenode发送心跳信号,namenode长时间没收到某个datanode的心跳,就认为他宕掉了,他上面的数据就会被转
移到其他datanode。
2、namenode:
是用来存储hdfs元数据信息的,比如用来存储一个文件分成了多少个block,这些block分别存储在哪个datanode节点上面。
hadoop2.x中namenode采用ha方式进行部署,一个是active的一个是standby的,active的挡掉后,standby的自动切换为active的。
3、hdfs写文件流程:
client向namenode发起写文件的请求,namenode返回哪些datanode有资源存储。
client自己把file切分成多个block,先把第一个block上传到返回的一个datanode中,这个datanode写完这个block后,流水线方式写给备份的datanode。
这些datanode写完后通知namenode更新相应的元数据信息。
namenode通知client第一个block写完了,开始写后面的block,方式类似直到写完所有的block。
4、hdfs读取文件流程:
client向namenode发起读文件请求,namenode把这个文件对应block所在的datanode列表返回给client。
client就可以分块的从不同datanode上面读取文件,都读取完后文件就下载完成了。
一个block会有多个备份的block,如果配置了机架感知策略,client就可以选择从近的datanode上面读取block。
5、mapreduce:是一种编程模型
输入的大文件split后得到多个分片
每个分片交给一个map方法处理
汇总各个map的计算结果,并且得到最终的结果,这就是reduce方法
spark有很丰富的算子(即方法),mapreduce只有map和reduce两个方法
分为split、map、shuffle、reduce4个阶段,其中map和reduce2个阶段需要我们自己写代码实现
hadoop1.x默认block大小为64M
hadoop2.x默认block大小为128M
一个map处理一个split的数据,默认一个split对应一个block,这个可以设置,即可以设置一个map处理几个block的数据
一个datanode中map的个数最好不要超过100个
一个小文件也会占用一个block的
为了减少网络传输,有些是可以在map端增加combiner过程的,即本地的reducer,先进行部分合并后减少了数据量在网络传输给reducer
应该mapreduce的作业中,partition的数量、reduce的数量、reduce端输出文件的数量3个是相同的
在应该reducer中,所有数据都会按照key值进行升序排序,所以如果reduce端的输出文件中如果包括key,那么这个文件一定是有顺序的
应该mapreduce作业中,如果只有应该reducer那么在reduce阶段那么其他节点闲置,资源利用率不高,可以把reducer数量设置大些,最大为72个
partition是在reduce之前发生的,相同的key值一定会进入同一个partitoner,reduce过程会按照key进行排序
Mapper类和reducer类上面的泛型指定的是输入key的类型、输入value的类型、输出key的类型、输出value的类型
6、hadoop的分布式缓存:
多个mapper可能要共享一些信息,如果数据量不大,可以把它从hdfs中加载到内存中,这就是hadoop的分布式缓存机制
在job执行之前就把数据加载到内存中,每个从节点各自缓存一份相同的数据,如果共享数据太大,可以将共享数据分批缓存,重复执行作业
job.addCacheArchive()可以把一个hdfs文件做为缓存文件加载到分布式缓存中,这样在mapper的setup(初始化)方法中就可以使用FileReader读取,并使用这个缓存文件了
比如把缓存文件的内容读取到mapper的成员变量list中,这样map方法中就可以使用这个list中的数据了
每个map方法中看到的是一个相同的list,都是来源于job添加进去的缓存文件
框架负责把任务add进来的hdfs文件加载到hdfs的分布式缓存中,并且给这个文件起一个别名,然后我们在mapper中就可以
通过FileReader读取那个别名使用这个分布式缓存文件了。
7、yarn中的概念:
yarn:是hadoop2.x中的资源管理器,支持多种计算框架。
ResourceManager:是master,负责分配调度资源、启动并监控ApplicationMaster、监控NodeManager
ApplicationMaster:为作业申请资源、切分数据、监控作业的执行及容错
NodeManager:管理单个节点的资源,处理来自ResourceManager和ApplicationMaster的命令。
8、hbase:分布式数据库
hadoop适合存储大文件,如果是大量小文件可以考虑使用hbase来存储,设计的表结构如下:
rowkey是filename的hash值,列族cf,包括size(大小)、type(txt等)、author(作者)、content(内容)这下列
9、spark:是基于内存的分布式计算框架