本教程主要参考hadoop实战和炼数成金视频教程
在一个全配置的集群上,运行hadoop意味着在网络分布的不同服务器上运行一组守护进程。这些守护进程有特殊的角色,一些仅存在与单个服务器上,一些则运行在多个服务器上,他们包括:NameNode(名字节点)、DataNode(数据节点)、Secondary NameNode(次名字节点)、JobTracker(作业跟踪节点)、TaskTracker(任务跟踪节点)
NameNode:hadoop在分布式计算与分布式存储中都采用了主从(master/slave)结构。分布式存储系统被称为hadoop文件系统,或简称为HDFS。NameNode位于HDFS的主端,它指导从端的DataNode执行底层的I/O任务。NameNode跟踪文件被分成文件块,被哪些节点存储已经运行状态是否正常。运行NameNode的是服务器不会运行别的任务,一旦这个服务器失效,那就完蛋了。DataNode将HDFS数据块读取或写入到本地文件系统的实际文件中。当希望对HDFS文件进行读写时,文件被分割成多个块,由NameNode告诉客户端每个数据块驻留在哪个DataNode。同时DataNode之间互相通信,实现数据块的复制。Secondary NameNode是一个用于监测集群状态的辅助守护进程。分布式计算也分为主从结构,主就是jobtracker,他负责对提交的应用程序制定计划,决定怎么干。tasktracker其实就是从,管理每个分节点的情况。
hadoop的HDFS:
HDFS也就是hadoop distributed file system,hadoop 分布式文件系统,一个简单的操作就是将本地文件上传到HDFS,然后MR处理。HDFS的命令样式:
hadoop fs -cmd 比如 hadoop fs -ls这个就类似于shell中的ls,把HDFS下根目录的内容列出来
将本地的上传到HDFS使用put命令,而从HDFS取回用get命令
显示文件内容用cat命令 很多shell下能用的HDFS也可以
通过web可以了解hadoop的活动
(1)通过用浏览器和http访问obtracker所在节点的50030端口监控jobtracker
(2)通过用浏览器和http访问NameNode所在节点的50070端口监控集群
HDFS的设计基础与目标:
1.硬件错误是常态的。因此需要冗余
2.流式数据访问。即数据批量读取而非随机读写,hadoop擅长做的就是数据分析而不是事务处理
3.大规模数据集
4.简单一致性模型,为了降低系统复杂度,对文件采用一次性写多次读的逻辑设计,即是文件一经写入,关闭,就再也不能修改
5.程序采用“数据就近“原则分配节点执行
HDFS体系结构包括NameNode、datanode、secondarynamenode、事务日志和映像文件。
读取数据流程:
客户端要访问HDFS中的一个文件,首先从NameNode获得组成这个文件的数据块位置列表,根据列表知道存储数据块的datanode,访问datanode,NameNode并不参与数据实际传输
HDFS的可靠性:
冗余副本策略:可以在hdfs-site.xml中设置复制因子指定副本数量,所有数据块都有副本
机架策略:一般在本机存放一个副本,在其他机架再存放别的副本,这样可以防止机架失效时丢失数据,也可以提高带宽利用率
心跳机制:NameNode周期性从datanode接收心跳信号和块报告,NameNode根据块报告验证元数据
没有按时发送心跳的DataNode会被标记为宕机,不会再给他任何I/O请求
安全模式:在此阶段NameNode会收集各个DataNode的报告,当数据块达到最小副本数以上时,会被认为是安全的。
校验和:在文件创立时,每个数据块都会产生校验和,校验和作为单独一个隐藏文件保存在命名空间下,客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏,如果损坏,继续读取其他副本
回收站:可以快速恢复,可以设置一个时间,当存放超时,彻底删掉
元数据保护:在NameNode上,副本多了可以增加安全性
快照:HDFS可以恢复到某个时间点
接下来我们开始说mapreduce模型:
这里的数据是每一行是一个单位数据,要抽取的是每一年最高的温度,首先对于input数据导入HDFS,然后split为一行一行的数据,然后进入map,此时的key是行偏移量,不用管,value是每一行。map过程是把每一行的年和温度提取出来,然后通过一个shuffle的过程,shuffle做了一个sort,为了将同样的key的value放在一起,然后将数据拷贝到很少的reduce机器上,做一个merge的过程,因为不同的机器上可能有一样的数据。
然后做reduce的过程,其实就是对之前每一个key对应的list进行遍历,取最大值,然后输出即可
Mapper:
Map-Reduce的思想就是”分而治之“ Mapper负责分,即把复杂的任务分解成若干个简单的任务执行,简单的任务有几个含义:1.数据或计算规模相对于原任务要大大缩小 2.就近计算,即会被分到存放了所需数据的节点进行计算 3.这些小任务可以进行并行计算,彼此间几乎没有依赖关系
Reducer:
Reduce的数目由mapred-site.xml配置文件里的项目 mapred.reduce.tasks决定。缺省值为1,用户可以覆盖之
Shuffler:
在mapper和reduce之间的一个步骤(可以没有)
可以把mapper的输出按照某种key值重新切分和组合成n份,把key值符合某种范围的输出送到特定的reducer那里去处理
可以简化reducer过程
性能调优:
输入:大文件优于小文件
减少网络传输:压缩map的输出
优化每个节点能运行的任务数:mapred.tasktracker.map.tasks.maximum和 mapred.tasktracker.reduce.tasks.maximum(缺省值均为2)