(1)扩容能力
(2)成本低
(3)高效率
(4)可靠性
(1)HDFS
(2)MapReduce
(3)Yarn
目前hadoop有1.x、2.x、3.x。三个版本
NameNode、DataNode、SecondaryNameNode
ResourceManager、NodeManager
Standalone mode(独立模式)
Pseudo-Distributed mode(伪分布式模式)
Cluster mode(群集模式)
ntpdate cn.pool.ntp.org
/etc/sysconfig/network
/etc/hosts
(1)准备linux环境
(2)虚拟机联网,关闭防火墙,关闭selinux
(3)安装jdk1.7
(4)安装maven
(5)安装findbugs
(6)在线安装一些依赖包
(7)安装protobuf
(8)安装snappy
(9)下载cdh源码准备编译
(1)bin:Hadoop最基本的管理脚本和使用脚本的目录
(2)etc:Hadoop配置文件所在的目录
(3)include:对外提供的编程库头文件
(4)lib:该目录包含了Hadoop对外提供的编程动态库和静态库
(5)libexec:各个服务对用的shell配置文件所在的目录
(6)sbin:Hadoop管理脚本所在的目录
(7)share:Hadoop各个模块编译后的jar包所在的目录,官方自带示例
(1)hadoop-env.sh
(2)core-site.xml
(3)hdfs-site.xml
(4)mapred-site.xml
(5)yarn-site.xml
(6)Slaves
bin/hdfs namenode -format或者bin/hadoop namenode –format
hadoop-daemon.sh start namenode
**hadoop-daemon.sh start datanode**
yarn-daemon.sh start resourcemanager
**yarn-daemon.sh start nodemanager**
start-dfs.sh启动脚本 stop-dfs.sh 停止脚本
start-yarn.sh启动脚本 stop-yarn.sh停止脚本
start-all.sh 启动命令 stop-all.sh 停止命令
默认端口是50070
默认是8088
mr-jobhistory-daemon.sh start historyserver 启动
mr-jobhistory-daemon.sh stop historyserver 关闭
默认端口是19888
core-site.xml文件中配置
fs.trash.interval
Hdfs的主要功能作用是分布式存储大量的数据
(1)Master/slave架构
(2)分块存储
(3)名字空间
(4)元数据管理
(5)数据存储
(6)副本机制
(7)一次写入,多次读出
(8)-ls 显示文件、目录信息
(9)-mkdir 在hdfs上创建目录,-p表示会创建路径中的各级父目录
(10)-put 将单个src或多个srcs从本地文件系统复制到目标文件系统
(11)-get 将文件复制到本地文件系统
(12)-appendFile 追加一个文件到已经存在的文件末尾
(13)-cat 显示文件内容
(14)-tail 将文件的最后的内容
(15)-chmod 改变文件的权限。使用-R将使改变在目录结构下递归进行
(16)-copyFromLocal 从本地文件系统中拷贝文件到hdfs路径去
(17)-copyToLocal 从hdfs拷贝到本地
(18)-cp 从hdfs的一个路径拷贝hdfs的另一个路径
(19)-mv 在hdfs目录中移动文件
(20)-rm 删除指定的文件。只删除非空目录和文件。-r 递归删除
(21)-df 统计文件系统的可用空间信息
(22)-du 显示目录中所有文件大小,当只指定一个文件时显示此文件的大小
Hadoop fs -mkdir /test
hdfs dfsadmin -setQuota 3 /test
hdfs dfsadmin -clrQuota /test
hadoop dfsadmin -setSpaceQuota 1g /test
hadoop dfsadmin -clrSpaceQuota /test
一是管理文件系统文件的元数据信息(包括文件名称、大小、位置、属性、创建时间、修改时间等等)
二是维护文件到块的对应关系和块到节点的对应关系
三是维护用户对文件的操作信息(文件的增删改查)
(23)client 发起文件上传请求,通过 RPC 与 NameNode 建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
(24)client 请求第一个 block 该传输到哪些 DataNode 服务器上;
(25)NameNode 根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的 DataNode 的地址,如:A,B,C
(26)client 请求 3 台 DataNode 中的一台 A 上传数据(本质上是一个 RPC 调用,建立 pipeline),A 收到请求会继续调用 B,然后 B 调用 C,将整个pipeline 建立完成,后逐级返回 client;
(27) client 开始往 A 上传第一个 block(先从磁盘读取数据放到一个本地内存缓存),以 packet 为单位(默认 64K),A 收到一个 packet 就会传给 B,B 传给 C;A 每传一个 packet 会放入一个应答队列等待应答。
(28) 数据被分割成一个个 packet 数据包在 pipeline 上依次传输,在pipeline 反方向上,逐个发送 ack(命令正确应答),最终由 pipeline中第一个 DataNode 节点 A 将 pipeline ack 发送给 client;
(29)当一个 block 传输完成之后,client 再次请求 NameNode 上传第二个block 到服务器。
(30)Client 向 NameNode 发起 RPC 请求,来确定请求文件 block 所在的位置;
(31)NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址;
(32)这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
(33)Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据;
(34)底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
(35)当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
(36)读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
(37)read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
(38)最终读取来所有的 block 会合并成一个完整的最终文件。