hadoop是受google论文的启发,开发出来的。是一个适合大数据的分布式存储和计算平带,Hadoop的核实新是 HDFS(Hadoop distributed file system)分布式文件系统,用来管理文件的。当然Hadoop爷爷支持MapReduce分布式并行计算框架。

Hadoo的核心

  • HDFS:Hadoop Distributed File System 分布式文件系统
  • YARN: Yet Another Resource Negotiator 资源管理调度系统
  • Mapreduce:分布式运算框架

hdfs和mapreduce都是主从结构,管理与被管理这种关系,分为管理者和被管理者,被管理者通常做具体的事物,管理着通常是组织、 协调、管理的。

  • 主节点,只有一个NameNode,负责各个节点数据的组织管理
  • 从节点,有很多的DataNode,负责存储数据,数据节点

NameNode对外DataNode对内,NameNode接收用户的操作请求,NameNode负责协调管理,不是真正的存放数据会把把数据分散到各个 节点上去存储。

当然一般都是只有一个NameNode,但在某些情况下着是不可靠的。因此Hadoop还提供SecondaryNameNode着种方式。

NameNode:是Master节点,是大领导。管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间; SecondaryNameNode:是一个小弟,分担大哥namenode的工作量;是NameNode的冷备份;合并fsimage和fsedits然后再发给namenode。 DataNode:Slave节点,奴隶,干活的。负责存储client发来的数据块block;执行数据块的读写操作。     热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作。     冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。 fsimage:元数据镜像文件(文件系统的目录树。) edits:元数据的操作日志(针对文件系统做的修改操作记录) namenode内存中存储的是=fsimage+edits。 SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量。

NameNode 的工作机制尤其是对元数据管理机制,可以增强HDFS工作原理的理解,可以更好的进行性能调优,Namenode故障问 题的分析解决能力。NameNode的主要职责:

  • 负责客户端请求(读写数据,请求)的响应
  • 维护目录结构树(元数据的管理:查询,修改)
  • 配置和应用副本存放策略
  • 管理集群数据块负载均衡问题

NameNode对数据的管理采用了俩种存储形式:内存和磁盘。其中内存中有一份完整的元数据(内存metadata),磁盘中有一个“准完整” 的元数据镜像fsimage文件(在namenode的工作目录中)。当客户端对hdfs中的文件进行新增或者修改操作,记录首先会写入到磁盘中 edits文件中,当操作成功后,相应的元数据才会更新到内存的metadata中,随后才后写入到fsimage文件即同步到磁盘中。

磁盘元数据镜像文件fsimage_0000000000000000555等价于edits_0000000000000000001-0000000000000000555合并的结果。 数据预写入操作日志文件edits_inprogress_0000000000000000556成功后会优先写入到内存的metadata中。

DataNode 的工作职责就就是负责存储管理用户的文件块数据,定期向namenode汇报自身持有的block信息(通过心跳信息)上报。 datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间。 HDFS默认的超时时长为10分钟+30秒,如果定义超时为timeout, 则超时时长的计算公式为: timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

SecondaryNameNode的作用就是分担namenode的合并元数据的压力,所以在配置secondaryName的工作节点时,一定切记,不 要和namenode处于同一节点。但事实上,只有在普通的伪分布式集群中才会有secondaryNamenode这个角色,在HA或者联邦集群中都 不再出现该角色,再HA和联邦集群中,都是有standbyName承担。每隔一段时间,会由 secondary namenode 将 namenode 上积 累的所有 edits 和一个最新的 fsimage 下载到本地,并加载到内存进行 merge(这个过程称为 checkpoint)

Hadoop的核心配置

hadoop的核心配置文件有如下即可

## 一般是修改一些环境变量等sh文件
xx/etc/hadoop/hadoop-env.sh
xx/etc/hadoop/yarn-env.sh
xx/etc/hadoop/mapred-env.sh
xx/etc/hadoop/savles

## 具体的配置
xx/etc/hadoop/core-site.xml
	fs.defaultFS		配置hdfs系统的地址,在那一台配,Namenode就在那一台启动
	io.file.buffer.size 该属性值单位为KB,131072KB即为默认的64M
xx/etc/hadoop/hdfs-site.xml
	dfs.replication  分片数量、伪分布式将其配置成1即可
    dfs.namenode.name.dir 命名空间和事务在本地文件系统永久存储的路径
    dfs.blocksize	大文件系统HDFS块大小为256M,默认值为64M
xx/etc/hadoop/mapred-site.xml
	mapreduce.framework.name 执行框架设置为 Hadoop YARN.
	mapreduce.map.memory.mb	 对maps更大的资源限制的.
	mapreduce.map.java.opts	 maps中对jvm child设置更大的堆大小
	mapreduce.reduce.memory.mb	设置 reduces对于较大的资源限制
	mapreduce.task.io.sort.factor 在文件排序中更多的流合并为一次
	mapreduce.reduce.shuffle.parallelcopies 通过reduces从很多的map中读取较多的平行
	
xx/etc/hadoop/yarn-site.xml
	# 配置ResourceManager 和 NodeManager
	yarn.resourcemanager.address 客户端对ResourceManager主机通过 host:port 提交作业
	yarn.resourcemanager.scheduler.address ApplicationMasters 
    通过ResourceManager主机访问host:port跟踪调度程序获资源

HADOOP HA和联邦模式

常规的HADOOP集群或伪集群都存在单节点故障,如果NameNode挂了,整个集群都不可用,为此HADOOP提供了HA和联邦模式来解决这个问题。

HA方案

HDFS有俩个NameNode组成,一个处于Active状态,另一个处于standby状态。处于激活状态的NameNode会响应集群中所有的客户端, 备份状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速转移。为了让standby NameNode与处于Active NameNode 的状态同步,这俩个Node都与一组称谓JNS的相互独立的经常保持通讯(Journal Nodes).当Active Node上更新了namespace, 它将记录修改日志发送给JNS的多数派。Standby noes将会从JNS中读取这些edits,并持续关注它们对日志的变更。Standby Node 将日志变更应用在自己的namespace中,当failover发生时,Standby将会在提升自己为Active之前,确保能够从JNS中读取所有的 edits,即在failover发生之前Standy持有的namespace应该与Active保持完全同步。

为了支持快速failover,Standby node持有集群中blocks的最新位置是非常必要的。为了达到这一目的,DataNodes上需要同时配 置这两个Namenode的地址,同时和它们都建立心跳链接,并把block位置发送给它们。

任何时刻,只有一个Active NameNode是非常重要的,否则将会导致集群操作的混乱,那么两个NameNode将会分别有两种不同的数据 状态,可能会导致数据丢失,或者状态异常,这种情况通常称为“split-brain”(脑裂,三节点通讯阻断,即集群中不同的Datanodes 却看到了两个Active NameNodes)。对于JNS而言,任何时候只允许一个NameNode作为writer;在failover期间, 原来的Standby Node将会接管Active的所有职能,并负责向JNS写入日志记录,这就阻止了其他NameNode基于处于Active状态的问题。

Federation 联邦模式

Federation 中文意思为联邦,联盟,是 NameNode 的 Federation,也就是会有多个NameNode。多个 NameNode 的情况意味着有 多个 namespace(命名空间),区别于 HA 模式下的多 NameNode,它们是拥有着同一个 namespace。HDFS Federation 并没有 完全解决单点故障问题。虽然 namenode/namespace 存在多个,但是从单个 namenode/namespace 看,仍然存在单点故障:如果 某个 namenode 挂掉了,其管理的相应的文件便不可以访问。Federation中每个namenode仍然像之前HDFS上实现一样,配有一个 secondary namenode,以便主 namenode 挂掉一下,用于还原元数据信息。所以一般集群规模真的很大的时候,会采用 HA+Federation 的部署方案。也就是每个联合的 namenodes 都是 ha 的。

这也可以是hadoop最大的败笔所在。

FS Shell

调用文件系统(FS)Shell命令应使用 bin/hadoop fs args的形式。 所有的的FS shell命令使用URI路径作为参数。 URI格式是scheme://authority/path。对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file。 其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。 一个HDFS文件或目录比如*/parent/child可以表示成hdfs://namenode:namenodeport/parent/child*,或者更简单的 /parent/child(假设你配置文件中的默认值是namenode:namenodeport)。大多数FS Shell命令的行为和对应的 Unix Shell命令类似,不同之处会在下面介绍各命令使用详情时指出。出错信息会输出到stderr,其他信息输出到stdout

cat

使用方法:hadoop fs -cat URI [URI …]

将路径指定文件的内容输出到*stdout*。

示例:

- hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2
- hadoop fs -cat file:///file3 /user/hadoop/file4

返回值:
成功返回0,失败返回-1。

chgrp

使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …] Change group association of files. With -R, make the change recursively through the directory structure. The user must be the owner of files, or else a super-user. Additional information is in the Permissions User Guideopen in new window. -->

改变文件所属的组。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。 更多的信息请参见HDFS权限用户指南open in new window

chmod

使用方法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI …]

改变文件的权限。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。
更多的信息请参见[HDFS权限用户指南](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html)

chown

使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]

改变文件的拥有者。使用-R将使改变在目录结构下递归进行。命令的使用者必须是超级用户。
更多的信息请参见[HDFS权限用户指南](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_permissions_guide.html)

copyFromLocal

使用方法:hadoop fs -copyFromLocal <localsrc> URI

除了限定源路径是一个本地文件外,和[**put**](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html#putlink)命令相似。

copyToLocal

使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>

除了限定目标路径是一个本地文件外,和[**get**](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_shell.html#getlink)命令类似。

cp

使用方法:hadoop fs -cp URI [URI …] <dest>

将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。 
示例:

- hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
- hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir

返回值:

成功返回0,失败返回-1。

du

使用方法:hadoop fs -du URI [URI …]

显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。
示例:
hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1 
返回值:
成功返回0,失败返回-1。 

dus

使用方法:hadoop fs -dus <args>

显示文件的大小。

expunge

使用方法:hadoop fs -expunge

清空回收站。请参考[HDFS设计](http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html)文档以获取更多关于回收站特性的信息。

get

使用方法:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst> 

复制文件到本地文件系统。可用-ignorecrc选项复制CRC校验失败的文件。使用-crc选项复制文件以及CRC信息。

示例:

- hadoop fs -get /user/hadoop/file localfile
- hadoop fs -get hdfs://host:port/user/hadoop/file localfile

返回值:

成功返回0,失败返回-1。

getmerge

使用方法:hadoop fs -getmerge <src> <localdst> [addnl]

接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于指定在每个文件结尾添加一个换行符。

ls

使用方法:hadoop fs -ls <args>

如果是文件,则按照如下格式返回文件信息:
文件名 <副本数> 文件大小 修改日期 修改时间 权限 用户ID 组ID 
如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下:
目录名 <dir> 修改日期 修改时间 权限 用户ID 组ID 
示例:
hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile 
返回值:
成功返回0,失败返回-1。 

lsr

使用方法:hadoop fs -lsr <args> 
ls命令的递归版本。类似于Unix中的ls -R。

mkdir

使用方法:hadoop fs -mkdir <paths> 

接受路径指定的uri作为参数,创建这些目录。其行为类似于Unix的mkdir -p,它会创建路径中的各级父目录。

示例:

- hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
- hadoop fs -mkdir hdfs://host1:port1/user/hadoop/dir hdfs://host2:port2/user/hadoop/dir

返回值:

成功返回0,失败返回-1。

movefromLocal

使用方法:dfs -moveFromLocal <src> <dst>

输出一个”not implemented“信息。

mv

使用方法:hadoop fs -mv URI [URI …] <dest>

将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。 
示例:

- hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
- hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1

返回值:

成功返回0,失败返回-1。

put

使用方法:hadoop fs -put <localsrc> ... <dst>

从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。

- hadoop fs -put localfile /user/hadoop/hadoopfile
- hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
- hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile
- hadoop fs -put - hdfs://host:port/hadoop/hadoopfile 
    从标准输入中读取输入。

返回值:

成功返回0,失败返回-1。

rm

使用方法:hadoop fs -rm URI [URI …]

删除指定的文件。只删除非空目录和文件。请参考rmr命令了解递归删除。
示例:

- hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir

返回值:

成功返回0,失败返回-1。

rmr

使用方法:hadoop fs -rmr URI [URI …]

delete的递归版本。
示例:

- hadoop fs -rmr /user/hadoop/dir
- hadoop fs -rmr hdfs://host:port/user/hadoop/dir

返回值:

成功返回0,失败返回-1。

setrep

使用方法:hadoop fs -setrep [-R] <path>

改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。

示例:

- hadoop fs -setrep -w 3 -R /user/hadoop/dir1

返回值:

成功返回0,失败返回-1。

stat

使用方法:hadoop fs -stat URI [URI …]

返回指定路径的统计信息。

示例:

- hadoop fs -stat path

返回值:
成功返回0,失败返回-1。

tail

使用方法:hadoop fs -tail [-f] URI

将文件尾部1K字节的内容输出到stdout。支持-f选项,行为和Unix中一致。

示例:

- hadoop fs -tail pathname

返回值:
成功返回0,失败返回-1。

test

使用方法:hadoop fs -test -[ezd] URI

选项:
-e 检查文件是否存在。如果存在则返回0。
-z 检查文件是否是0字节。如果是则返回0。 
-d 如果路径是个目录,则返回1,否则返回0。

示例:

- hadoop fs -test -e filename

text

使用方法:hadoop fs -text <src> 

将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream。

touchz

使用方法:hadoop fs -touchz URI [URI …] 

创建一个0字节的空文件。

示例:

- hadoop -touchz pathname

返回值:
成功返回0,失败返回-1。

Hadoop的那些端口

//以下操作需要开启SSH免密登陆 //内部端口:外部端口 namenode 对内端口8020 对外端口50070 resourcemanager 对内端口8032 对外端口8088

配置MapReduce日志历史和日志聚合

再配置文件mapred-site.xml中配置
--》指定历史服务器所在位置及端口号
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>bdqn.linux.com:10020</value>
    </property>
    --》指定历史服务器所在的外部浏览器交互端口号及机器位置
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>bdqn.linux.com:19888</value>
    </property>

日志聚合
作用:
一、将我们操作的日志文件聚合到一起,通过web界面方便我们查看,并可以设置日志保存时间,可节省空间
二、在网页能够查看map和reduce的任务日志
三、存储在HDFS上的,比较容易读取
配置:yarn-site.xml
--》开启日志聚合功能
<property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    --》指定日志保存时间(单位为秒)
<property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>

 启动节点进行测试:
    sbin/mr-jobhistory-daemon.sh start historyserver

    jps查看节点:
    9331 JobHistoryServer

    web页面查看:
    bdqn.linux.com:19888

    关闭节点的方法:
    sbin/mr-jobhistory-daemon.sh stop historyserver