一、hadoop的核心组件
- hadoop通用组件 - Hadoop Common
- 包含了其他hadoop模块要用到的库文件和工具
- 分布式文件系统 - Hadoop Distributed File System(HDFS)
- 运行于通用硬件上的分布式文件系统,高吞吐、高可靠
- 资源管理组件 - Hadoop YARN
- 用于管理集群中的计算资源并在这些资源上调度用户应用
- 分布式计算框架 - Hadoop MapReduce
- 用于处理超大数据集计算的MapReduce编程模型的实现
二、Hadoop关联项目
- Apache Ambari是一种基于web的工具,支持Apache Hadoop集群的供应、管理和监控。Apache Ambari支持HDFS、MapReduce、Hive、Pig、Hbase、Zookeeper、Sqoop和Hcatalog等的集中管理。也是5个顶级hadoop管理工具之一。
- Avro 数据序列化系统
- Cassandra 开源分布式NoSQL数据库系统。
- chukwa 开源的用于监控大型分布式系统的数据收集系统。构建在Hadoop的HDFS和MapReduce框架之上的,包含了一个强大灵活的工具集,可用于展示、监控和分析已收集的数据
- Hive 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询,可以将sql语句转换为MapReduce任务进行运行
- Mahout提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发更加方便的创建智能应用程序。包括聚类、分类、推荐过滤、频繁子项挖掘
- Apache Pig 高级过程语言,适合于使用Hadoop和MapReduce平台来查询大型半结构化数据集。通过允许对分布式数据集进行类似SQL的查询,Pig可以简化Hadoop的使用
- Apache Spark 是专为大规模数据处理设计的快速通用的计算引擎。能更好的适用于数据挖掘与机器学习等需要迭代的MapReduce算法
- Tez 支持DAG作业的开源计算框架,能更好的处理实时的查询处理及机器学习等
- Zookeeper 分布式的开源应用程序协调服务,是Hadoop和Hbase的重要组件。功能包括:配置维护、域名服务、分布式同步、组服务等
- HBase 分布式、高可用、高性能、面向列、可伸缩的分布式存储系统
三、HDFS架构
- HDFS client
- NameNode 管理文件系统的命名空间
- 1.管理文件和目录的元数据(运行时,元数据发内存),block副本个数、时间、权限、block列表信息
- 2.本地持久化:命名空间镜像文件(fsimage) 和编辑日志(edits log)
- 3.fsimage文件不记录每个block所在的DataNode信息,每次系统启动时从DataNode重建,通过心跳向NameNode报告block信息,DataNode向NameNode注册时NameNode请求DataNode发送block信息(文件名和路径、文件大小、文件所属关系、block块大小等)
- 每三秒向NN汇报一次,10分钟未收到消息,NN认为DN宕机
- 在core-site.xml中指定在哪个节点启动
- DataNode 存放数据块, 存储模型
- 按字节切割
- block分散存储在集群节点中
- 单一文件block大小一致,文件与文件可以不一致:hdf dfs -D dfs blocksize=104876 -D dfs.replicationn=3 -put hello.txt /opt // replication副本数
- block可以设置副本数,副本分散在不同节点中
- 副本数不超过节点数
- 承担计算
- 提供容错
- 同一时刻只有一个写入者,可以有多个读取者
- 可以append追加数据
- 副本存放策略
- 如果上传文件的节点数就是一个datanode,则第一个副本放在本地如果在集群外上传文件则随机挑选一个CPU不太忙,存储不太满的节点存放
- 第二个副本放在和第一个副本不同机架上的一个节点
- 第三个副本放在和第二个副本相同机架的不同节点
- 其他副本随机存放
- 用slaves来记录DN在哪个节点运行,每行一条记录,每个记录表示DN所在的节点ip地址/主机名
- SecondaryNameNode 定期合并fsimage和edits log,将NameNode内存中的文件系统元数据生成检查点,条件:每一小时一次,不足一小时,则看edits log记录的事务数达到100万则合并,默认每分钟检查事务数量
- 防止edits log过大,在重启时会花费很长时间执行
- 合并流程
- 通知namenode要合并了
- namenode将现在的edits log文件重命名,同时生成一个空的edits log
- snn从NN通过HTTP GET的方式下载fsimage和最新的edits log,不是正在使用的
- snn首先将fsimage加载到自己的内存,然后对内存数据执行edits log中的记录
- 执行结束后,将内存镜像写到磁盘,形成新的fsimage,此时fsimage就是原来的fsimage+edits log
- snn将新生成的fsimage推送给NN(HTTP PUT)
- NN使用
- hdfs-site.xml中指定启动节点
四、hadoop安装配置
- core-site.xml配置
-
<configuration> <!-- 指定访问HDFS的时候路径的默认前缀 / hdfs://centos7:9000 --> <property> <name>fs.defaultFS</name> <value>hdfs://shan1:9000</value> </property> <!-- 指定hadoop的临时目录位置,给namenode、secondarynamenode以及datanode的存储目录指定前缀 --> <property> <name>hadoop.tmp.dir</name> <value>/var/bjsxt/hadoop/pseudo</value> </property> </configuration>
- hdfs-site.xml配置
-
<configuration> <!-- 指定block副本数 --> <property> <name>dfs.replication</name> <value>1</value> </property> <!-- 指定secondarynamenode所在的位置 --> <property> <name>dfs.namenode.secondary.http-address</name> <value>shan1:54321</value> </property> </configuration>
- vi workers 写入shan1 节点名 hadoop安装目录下的etc/hadoop/workers 2.x为slaves
- 执行格式化 hdfs namenode -format命令
- 启动 start-dfs.sh
- 查看进程 jps
- 浏览器访问shan1:50070 50070是固定的这是hadoop管理页面
- 若启动失败可以在hdfs-site.html中添加以下内容,重新启动hadoop
- hdfs dfs -D dfs.blocksize=1048576 -D dfs.replication=1 -put hello.txt / 上传本地文件到hadoop,blocksize块大小,replication表示副本数
- hadoop3.x 在workers中设置从节点
五、HDFS的写流程和读流程
- 写流程(重点)
- 客户端连接namenode写元数据,该元数据不包含block列表信息,Namenode会做检查,首先有没有权限创建文件,是否存在同名文件,如果通过,则将元数据首先写到edits log文件中,然后更新内存状态,返回客户端success
- 客户端请求上传当前block块的datanode信息,namenode返回datanode列表,每个datanode上传当前block块一个副本,默认3个datanode,看指定的副本个数
- 客户端维护两个对列,一个是数据对列,放要发送的数据包,一个是确认对列放要确认的数据包。客户端将block以packet的形式(64KB)数据包向datanode发送。三台datanode构成一个管线,管线间传递packet,客户端只需要向第一个datanode发送数据即可,时间线重叠
- 如果在传输时管线中有datanode挂掉,首先关闭管线,将确认对列中的packet添加到数据对列的前端,等待重发,给好的datanode上block块部分数据一个新的标记,同时将标记通知namenode为了防止坏的datanode重启后向namenode汇报信息,如果namenode发现block块标记不存在,则让datanode删除,剩下的datanode组成新的管线,继续传输数据
- 每传输完一个block,datanode向namenode汇报列表信息,客户端向namenode申请下一个block块的上传位置
- 客户端将所有block传输完成,同时namenode对每个block至少有一个副本,就算传输成功
- 读流程(重点)
- 客户端请求namenode,查找一个文件的元数据,如果该文件存在,发送该文件的block块位置信息给客户端
- 客户端获取到文件的block块位置信息后找到最近邻datanode读取数据
- 每次读完block块之后,请求下一波block块位置,接着读取
- 当所有的block块读取完毕,读流程结束
- 由于客户端一边下载数据,一边进行校验,如果发现当前block块数据损坏,首先通知namenode,然后找次近邻副本读取,如果datanode宕机,记下该datanode位置,以防重复读取该节点上的其他block块。
六、Hadoop HA
- 解决单点故障和内存受限问题
- namenode从节点代替主节点,需要内存状态信息一致
- 主节点写edits log到集群节点,集群节点同步edits log到从节点
- datanode向主节点和从节点汇报block信息和心跳
- JQM解决从节点代替主节点的问题,cap 一致性、可用性、分区容忍性,超过半数集群节点收到edits log 记录认为成功
- 备节点用来合并fsimage和edits log,然后同步给主节点
- 只能由主节点向外提供服务
- 手动HA示意图
- 自动HA: 基于Zookeeper实现
- Zookeeper Failover Controler :监控NameNode健康状态,并向Zookeeper注册NameNode
- NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC锁的NameNode变为active
- Zookeeper的分布式锁,keepalived
- 启动ha的hadoop
- 启动zookeeper集群 --> zkServer.sh start
- 在shan1、shan2、shan3上启动三台journalnode --> hadoop-daemon.sh start journalnode
- 任意选择shan1,格式化HDFS --> hdfs namenode -format,格式化后,启动namenode进程,hadoop-daemon.sh start namenode 若已经格式化过,不需要再格式化
- 在另外一台shan2上同步元数据 --> hdfs namenode -bootstrapStandby
- 先在shan4节点启动zookeeper客户端 --> 执行zkCli.sh,会有下图信息
- 执行命令 get -s /hadoop-ha/mycluster/ActiveStandbyElectorLock
- 初始化zookeeper上的内容 --> hdfs zkfc -formatZK
- 启动hadoop集群,可在shan1到shan4这四台服务器上任意位置执行 --> start-dfs.sh