Hadoop学习笔记
Hadoop是什么
1、是一个开源的大数据框架
2、是一个分布式计算的解决方案
3、HDFS(分布式文件系统) + MapReduce(分布式计算)
HDFS
数据块:抽象的概念而非整个文件作为存储单元,默认大小64M、
NameNode:管理文件系统的命名空间,存储文件元数据。维护文件系统所有的文件和目录,文件和数据块的映射。记录每个文件中各个块在数据节点的信息。
DataNode:存储并检索数据块,向NameNode更新所储块的列表。
优点:
1、适合大数据的存储,并有副本策略
2、可以构建在廉价的机器上,并有一定的容错和恢复机制
3、支持流式数据访问,一次写入,多次读取最高效
缺点:
1、不适合大量小文件的存储
2、不适合并发的写入,不支持文件随机修改
3、不适合随机读等低延时的访问方式
问题1:数据块大小多少合适?
通常设置为128M。数据块太小,数据块数目就越多,NameNode所消耗的内存越大。数据块越大,数据块数目越少,并行性会有一定的影响,而且数据恢复也更困难。
问题2:如果NameNode挂掉了怎么办?
Hadoop2有两个NameNode节点,一个主节点sh处于运行状态,一个备用节点,两个节点数据时刻保持一致,当主节点挂掉了,则会立即切换到备用节点。
HDFS写流程
先写块1、再写块2。Client向NameNode发生存储数据请求,NameNode返回可用于存储信息的DataNode块(DataNode-1,DataNode-2,DataNode-3)。Client将Data分块(这里分为两块),然后将数据块1以及NameNode发给它相关 DataNode的信息一起传给了DataNode-1,DataNode-1将数据块1保存,然后将数据块1传给DataNode-2,数据块DataNode-2将该块传给了DataNode-3,当DataNode-1,2,3存储完数据块1后,反馈给NameNode已经存储完数据块1。NameNode更新相关元数据信息的列表并告诉Client数据块1存储完成。数据块2存储过程与数据块1一致。
HDFS读流程
Client向NameNode发起读数据请求
NameNode找出距离最近的DataNode节点信息
Client从DataNode分块下载文件
Shell命令操作HDFS
常用shell命令
类Linux系统:ls, cat, mkdir, rm, chmod, chown等
HDFS文件交互: copyFromLocal, copyToLocal, get(下载), put(上传)
Python编程操作HDFS
QuickStart:https://hdfs3.readthedocs.io/en/latest/quickstart.html
API:https://hdfs3.readthedocs.io/en/latest/api.html
MapReduce
Yarn
ResourceManager:分配和调度资源,启动并监控ApplicationMaster, 监控NodeManager
ApplicationMaster:为MR类型的程序申请资源,并分配给内部任务。负责数据的切分。监控任务的执行以及容错
NodeManager:管理单个节点的资源,处理来自ResourceManager的命令,处理来自ApplicationMaster的命令。
Hadoop体系架构
HDFS架构图
工作流程(以wordcount为例)
分片输入
由于NameNode内存的限制,HDFS适合存放大文件
对于小文件可以采用压缩的输入格式CombineFileInputFormat
dfs.block.size可以调整块的大小
Map的任务数和mapred.map.tasks和mapred.min.split.size参数有关
本地合并
job.setCombinerClass(MyReduce.class)