Hadoop是一个能够对大量数据进行分布式处理的软件框架
hadoop-overview术语
HDFS: 分布式文件系统,解决海量数据存储
YARN: 作业调度和集群资源管理的框架,解决资源任务调度
MAPREDUCE: 分布式运算编程框架,解决海量数据计算
特点
高扩展性: 集群可以容易的扩展到数以千计的节点
成本低:通过大量廉价的机器组成集群
高效率:并发数据,并发处理
高可靠:多份复制,任务失败后自动重新部署计算任务
进程
HDFS
DataNode
SecondaryNameNode
NameNode
YARN
NodeManager
ResourceManager
配置
hadoop-env.sh
export JAVA_HOME=/root/apps/jdk1.8.0_65
core-site.xml
#可以选择tfs/file/gfs文件系统
<property>
<name>fs.defaultFS</name>
<value>hdfs://node-1:9000</value>
</property>
#运行时产生文件的存储目录
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node-2:50090</value>
</property>
mapred-site.xml
#指定mr运行框架,默认local
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
yarn-site.xml
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
slaves
node-1
node-2
node-3
添加hadoop到环境变量
scp所有配置文件到所有node
格式化namenode
#只能初始化一次,格式化是生成一些文件,在文件内有集群的唯一id,多次初始化会令id发生变化,导致整个集群不可用
hdfs namenode -format
or hadoop namenode -format
启动
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
hadoop-daemon.sh start resourcemanager
hadoop-daemon.sh start nodemanager
或者
#配置了slaves和ssh免密登录
start-dfs.sh
start-yarn.sh
start-all.sh
停止
stop-dfs.sh
stop-yarn.sh
stop-all.sh
集群UI
nameNode: http://nn_host:port 默认50070
ResourceManager http://rm_host:port 默认8088
操作hdfs
hdfs dfs -ls /
hdfs dfs -mkdir /hello
hdfs dfs -put filename /hello
运行mapreduce程序
hadoop jar sample.jar <arg>
HDFS
-
文件分块存储
解决上传下载耗时
解决单机存储容量限制
-
文件块多份复制
解决分布式机器诺机
-
使用NameNode来管理分块和副本位置
解决文件元数据的管理
设计目标
- 硬件故障是常态,成百成千的机器,每个机器都可能出现故障,因此故障检测和自动快速恢复时HDFS的核心架构
- 主要以流式方式读取数据,不适用交互式场景,反应时间长,更注重数据访问的高吞吐量
- 大文件存储,GB/TB,不适用与小文件
- 大部分的文件要求write-one-read-many。简化了数据一致性问题
- 移动计算的代价比移动数据的代价低。把计算移动到数据近的机器,可以让大文件计算更高效
- 可移植性,可以在不同的硬件和软件平台上运行
特性
- 目录树管理文件,与linux文件系统一致
- 分布式
- NameNode管理目录树,文件元数据
- DataNode管理文件存储,定时向NameNode汇报信息
- 文件分块存储
- 副本机制
- 一次写入多次读取,只支持整个文件覆盖或者追加,不支持部分修改,延迟大
HA
hdfs-nnhashell
hadoop fs <args>
hadoop fs -ls hdfs://namenode:host/dir/file
hadoop fs -ls /dir/file
#本地
hadoop fs -ls file:///root/
hadoop fs -ls [-h] [-R] <args>
hadoop fs -mkdir [-p] <paths>
hadoop fs -put [-f] [-p] <localfile> <dst>
hadoop fs -get [ignorecrc] [-crc] [-p] [-f] <src> <localdst>
hadoop fs -appendToFile <localfile> <dst>
hadoop fs -cat [-ignoreCrc] URI
hadoop fs -tail [-f] URI
hadoop fs -chgrp [-R] GROUP URI
hadoop fs -chmod 777 URI
hadoop fs -chown user:grp URI
hadoop fs -cp URI URIDst
hadoop fs -mv URISrc URIDst
hadoop fs -getmerge URI/* localfile
hadoop fs -rm -r URI
hadoop fs -df -h URI
hadoop fs -du URI
hadoop fs -setrep -w num -R URI
NameNode
-
存储HDFS元数据(块列表/位置),目录树,和跟踪集群中的文件
-
块信息在DataNode的位置在启动时,由DataNode上报
-
单点
-
数据存在内存,因此需要配置大内存的机器
DataNode
- 负责存储数据
- NameNode和DataNode保持不断通讯
- 启动时汇报自己持有的块列表
- 关闭某个DataNode不会影响数据和集群的可用性,NameNode会安排其他DataNode进行副本复制和响应
- 需要大量磁盘空间
- 定期向NameNode发送心跳,默认3s,NameNode长时间没有收到心跳,会认为DataNode失效
- DataNode定期汇报块信息,默认6h
- 块大小默认128M
工作机制
hadoop-work写
- client请求上传文件
- NameNode检查目录是否存在/文件是否存在
- client请求第一个block该上传到些DataNode
- NameNode返回副本个数的DataNode地址给client。策略为本地/同机架/不同机架/存储容量
- client请求第一个DataNode建立pipeline,DataNode之间建立pipe,A->B->C
- client向A上传第一个block,以packet上传,默认大小64k,package会从client->A->B->C流的方式传输
- 确认后上传第二个block...
读
- client向NameNode询问文件所在位置
- NameNode返回文件部分或者全部的block列表,列表经过排序,策略为拓扑结构距离client近的靠前,心跳机制超时汇报的靠后
- client选取靠前的DataNode读取block,为每个block启用一个线程下载
- 读取完这批block,会请求下一批block读取
- 读完一个block会进行checksum校验,出现错误时,client会通知NameNode,然后会从列表中的下一个DataNode请求block
- 读完所有的block后,client合并成一个文件
Java API
-
提供跟shell类似的接口
-
提供流式处理的接口
效率更高
YARN
yarn-overview异常
- RM出现异常,由备份RM结果,新RM通知AM重新启动
- NM出现异常,RM通知AM,AM进行任务再调度
- AM出现异常,RM重启AM,由于RM已经记录了AM任务状态信息,已完成的任务不会再运行
MapReduce
核心思想:分而治之。把巨型任务切割成小任务,任务之间没有依赖关系,并对小文件进行分布式并行计算;再把小任务的结果进行汇总计算,并最终得出结果,根据块的多少来决定Map的数量,根据程序指定的数量来决定reduce的数量,多于一个reduce程序,会把结果切割成多个结果文件;多于一个reduce程序,map输出将根据key的hash,进行分区处理,先分区保存在本地,再发送给reduce,reduce收集完后,进行汇总并排序并进行处理
hadoop-MR序列化和反序列化
如果使用自定义类型,则需要实现hadoop提供的序列化和反序列接口,因为java的序列化效率低下
网友评论