hadoop来源
- 创始人 doungcuting
- GFS MAPREDUCE BIGTABLE 谷歌2003年发表的三篇论文
- Java语言实现的
Hadoop是什么
分布式开源的框架 高可用 将硬件故障看作常态
四大模块
- common :工具包 rpc框架(通信框架)
- hdfs :分布式文件系统 Hadoop distributed file system
- namenode 老大
- datanode 小弟
- secondarynamenode 助理
- mapreduce :分布式计算框架
- yarn :资源调度框架
- resourcemanager 老大
- nodemanager 小弟
搭建过程中遇到的问题:
1)主机找不到
- (1)/etc/sysconfig/network /etc/hosts
- (2)重启机器
2)格式化的时候错误
- 配置文件错误 根据错误提示去相应文件进行调整,修改完毕再格式化
启动过程中遇到的问题:
1)某些进程启动不了
-
措施1:暴力,全部关闭集群,重新启动
- stop-dfs.sh 任意节点都可以执行
- stop-yarn.sh 在yarn主节点执行
重新启动:
- start-dfs.sh
- start-yarn.sh
-
措施2:单独启动未启动的进程
- 单独启动hdfs相关的进程
- hadoop-demon.sh start hdfs进程
- hadoop-demon.sh start datanode
- hadoop-demon.sh start secondarynamenode
- 单独启动yarn的相关命令
- yarn-demon.sh start yarn的相关进程
- yarn-demon.sh start resourcemanager
搭建过程的注意事项:
1)集群的成功的格式化只能格式化一次,不成功则一直努力到格式化成功
- 格式化的过程中:创建出来namdnode存储相关的目录
- VERSION文件:记录集群的版本信息,每格式化一次就好生成新版本
- 想要重复格式化:
- 1、删除namenode的数据目录
- rm -rf /home/hadoop/data/hadoop/name
- 2、删除datanode的数据目录
- rm -rf /home/hadoop/data/hadoop/data
- 1、删除namenode的数据目录
集群搭建环境变量配置
jdk hadoop
-
在Linux下修改环境变量有三个地方
- 1、/etc/profile 系统环境变量 针对所有用户
- 2、~/.bashrc 用户环境变量 针对当前用户
- 3、~/.bash_profile 用户环境变量 针对当前用户
-
这三个配置文件的加载顺序:
- /etc/profile > ~/.bashrc > ~/.bash_profile
生效:最后一次加载的生效
时间同步问题:
- 只要是完全分布式或者多个分布式之间一定要做时间同步
- 目的:
- 集群内部各个节点直接时间保持一致
- 为什么?
- 集群内部各个节点需要进行通信,尤其是datanode和namenode之间,它们之间的通信是依靠心跳,心跳是有一个时间控制的,这个时间是630s,所以需要做时间同步
集群搭建模式
1)单机模式
- 直接解压的方式,什么都不配置,并且在一个节点上
- 没有分布式文件系统的,所用的所有文件都来自于本地
- 几乎没人用
- 测试
2)伪分布式
- 可以看做是完全分布式但是跑在一一个节点上,所有的进程全部配置到一个节点上
- 有分布式文件系统的,只不过这个文件系统只有一个节点
- 个人学习测试
3)完全分布式
hdfs为例
- 在宏观_上看就是一一个大的节点,
- 后台采用的硬件配置是三台机器的硬件配置之和,但是对于用户来说完全感觉不到
- 在完全分布式中有主节点,有从节点。
- 主节点namenode只有一个,从节点有多个,真实生产中namenode会单独做-一个节点,
- 如果集群中namenode宕机,整个集群还可以使用吗?不可以
- namenode:
- 1)主要作用存储元数据(管理数据的数据,存储的就是datanode存储数据的描述)
- 数据存储在datanode的哪一一个节点,数据是谁上传的等等
- 2)处理读写请求. 上传、下载
- datanode:负责集群中真正数据存储的
- 如多namenode宕机集群无法使用,这也是完全分布式的一大缺点,存在单点故障问题
- 一般生产中不太使用学习的,公司中测试 节点个数比较少的时候有时候也会使用这种模式
- 节点数目越多namenode宕机的可能性越大 压力太大
- 助理secondarynamenode:只是一个助理,仅仅分担namenode的压力但是不能代替
- 架构:一主多从
4)高可用
最广泛的搭建方式
高可用:集群可以持续对外提供服务 做到7*24小时不间断
依赖于zookeeper
高可用集群架构:双主多从,但是同一时间只有一个是活跃的,我们把这个活跃的namenode成为active,另外一个处于热备状态,称为standby,但是两个主节点存储的
元数据是一模一样的,当active namenode宕机的时候,standby namenode可以立马切换为active namenode对外提供服务,就会做到集群持续对外提供服务的功能,如果
宕机的namenode又活过来了,这个namenode只能是standby-
缺陷:
- 在同一时间中集群只有一个active namenode,也就是说我们集群的主节点的能力只有一个节点,集群中节点个数过多(1000节点)的时候就好造成namenode崩溃
- namenode存储的是元数据,元数据过多的时候会造成namenode崩溃(两个都崩溃)没有真正的分担namenode
实际生产中使用
5)联邦机制
同一个集群中可以有多个主节点,这些主节点的地位是一样的
同一时间可以有多个活跃的active namenode
这些namenode共同使用集群中所有的datanode,每个namenode只负责管理集群中的datanode上的一部分数据
联邦+高可用
超大集群
每个namenode进行数据管理靠的Block PoolID ,不同的namnode管理的Block PoolID不一样
Hadoop
- common
- hdfs
- mapreduce
- yarn
hdfs介绍:
hdfs:分布式文件系统
设计思想:
- 1)分块存储 每个块叫block
- 块的大小不能太大,太大会造成负载不均衡
- hadoop2.x默认的切分块大小为128M
- 如果一个文件不足128M,也会单独存一个块,占用实际文件大小
- 这个分块存储思想中,如果有一个块的存储节点宕机了,这个时候数据的完整性就得不到保障
- 2)HDFS中默认块的存储采用备份机制,默认备份个数是3,测试环境配置的为dfs.replication=2 2份备份,所有备份没有主次之分
相同数据块的副本一定存储在不同的节点上
如果节点总共2个,dfs.replication=3,实际存储2个,另外一个进行记账,当集群节点大于等于3的时候会进行复制这个副本,最终达到3个
假设集群中有4个节点,配置副本3个,有一个副本节点宕机了,这个时候会发现副本个数小于设定的个数,就好进行复制,达到3个副本,这个时宕机的节点恢复,这个时候集群副本个数为4,集群会等待一段时间后如果发现还是4个副本就会删除一个副本备份越多越好吗?
副本越多,数据安全性越高,但是副本数越多会占用过多的存储资源,会造成集群的维护变得困难
hdfs的目录结构和linux操作系统的类似,以/为根节点,我们将这个目录树成为抽象目录树
因为hdfs的目录结构代表的是所有数据节点的抽象出来的目录,不代表任何一个节点
- hdfs: /hadoop. zip 500M 被分成4个块存储
- hdfs中存储的数据块是有编号的 blk_1 blk_2 blk_3 blk_4
- /spark.zip 300M 3个块, blk_5 blk_6 blk_7
- 底层存储的时候每-一个block都有--个唯一的id
- hdfs的数据底层存储的时候,还是存在真正的物理节点上
hdfs的整体架构:
主从结构
一个主节点 多个从节点
-
namenode:
- 用于存储元数据
- 这里的元数据包括:1.抽象目录树 2.存储数据和block的对应关系 3.block存储的实际位置
- 处理客户端的读写请求
- 读--下载 写--下载
- 用于存储元数据
-
datanode:
- 负责真正的存储数据,存储数据block
- 真正处理读写
-
secondarynamenode:
- 冷备份节点:助理 当namenode宕机时不能主动切换成namenode,但是secondarynamenode中存储的数据和namenode中‘相同’
- 主要作用是:
- namenode宕机的时候帮助namenode恢复
- 2)帮助namenode做些事情,分担namenode的压力
hdfs的优缺点
优点:
- 1.可构建在廉价机器上
- 通过多副本提高可靠性,提供了容错和恢复机制
- 2.高容错性
- 数据自动保存多个副本,副本丢失后,自动恢复
- 3.适合批处理
- 移动计算而非数据,数据位置暴露给计算框架
- 4.适合大数据处理
- GB、TB、甚至PB级数据,百万规模以上的文件数量,10K+节点规模
- 5.流式文件访问 不支持数据修改
- 一次性写入,多次读取,保证数据- -致性
缺点:
- 1.不支持低延迟的数据访问,不支持实时/近实时
- 2.不擅长存储大量的小文件 kb级别的
-
1)寻址时间太长,寻址时间大于读取时间 不划算,进行数据访问的时候先找元数据
- 元数据是跟block对应的 1block块对应一条元数据
-
2)造成元数据存储量过大,增加namenode的压力
- 在hdfs中元数据存储一般情况下一条元数据150byte左右
- 1000w条元数据------- 10000000*150 1.5G
-
- 3.不支持文件内容修改
hdfs的应用
hdfs归根结底就是-一个文件系统 类似于linux命令
-
1)hdfs命令方式
-
hdfs文件系统中文件的访问只有一种方式只能通过绝对路径
- / 抽象根目录 具体表示: hdfs://master:9000/ss
-
开启hadoop或hdfs的客户端
- hadoop fs(开启原生文件系统客户端)
- hadoop fs -ls /
hdfs核心功能:上传、下载
-
上传:put
- -put [-f] [-p] [-l] < localsrc>...< dst>
- -put 本地文件目录 hdfs上的目录
- hadoop fs - put hadoop-3.1.2.tar.gz /test
-
-get
- 功能:等同于copyToLocal,就是从hdfs下载文件到本地
- 示例: hadoop fs -get /aaa/jdk.tar.gz
-
-getmerge
- 功能:
- 合并下载多个文件
- 示例:比getmerge
- 如hdfs的目录/aaa/ 下有多个文件:log.1, log.2,log.3,...
- hadoop fs -getmerge /aaa/log.* ./log.sum
- hadoop fs -getmerge /ss/aa.txt /ss/bb.txt /home/hadoop/cc.txt
-
-cp
- 功能:从hdfs的-一个路径拷贝hdfs的另-一个路径
- 示例:
- hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2
-
-cat 查看文件内容
- hadoop fs -cat /ss/aa.txt
-
-rm 删除文件
- -rm -r(递归) -f(强制)
- hadoop fs -rm -f /ss/aa.txt
-
-mv 移动文件/修改文件名
- hadoop fs -mv /ss/bb.txt /ss/test.txt
-
-cp 复制文件
- hadoop fs -cp /ss/bb.txt /ss/cc.txt
-moveFromLocal 从本地剪切到hdfs
-
-appendToFile 文件追加,将本地文件追加到hdfs中,末尾添加
- 将本地bb. txt追加到hdfs的/aa/aa.txt 这个追加是在原始块的末尾追加的,如果超过128M才会进行切分
-
-tail 显示一个文件的末尾
- hadoop fs -tail -f /ss/aa.txt
-
-df
- 功能:统计文件系统的可用空间信息
- 示例: hadoop fs -df -h
-
-du
- 功能:统计文件夹的大小信息
- 示例: hadoop fs -du -S -h /aaa/*
-chgrp
-chmod
-
-chown
- 功能: linux文件系统中的用法- -样,对文件所属权限
- 示例:
- hadoop fs -chmod 666 /hello.txt
- hadoop fs -chown someuser:somegrp /hello.txt
这些命令在集群中任意节点都可以使用,hdfs文件系统中你看到的目录只是一个抽象的目录树,实际存储在集群的节点上
-
2)java API的方法
- linux用到的监听命令: tail -f/F文件路径
- linux的权限管理命令:
-
修改文件权限的:
- chmod文件权限文件
- 文件权限3种:
- 可读 r 4
- 可写 W 2
- 可执行 X 1
- 最大权限是 7
rw-rW- r--
-文件属性 d--目录-文件 连接
-
rw-本用户 rw- 本组用户 r-- (其他用户) 权限
- 6 6 4
-
修改文件所属用户和组:
- chown -R 用户名:组名 文件/目录
-