大数据知识梳理(Hadoop、HDFS)(更新中。。。)

第1讲 大数据概述
1.1 大数据时代
1.2 大数据概念和影响
1.3 大数据的应用
1.4 大数据的关键技术
1.5 大数据与云计算、物联网

第2讲 大数据处理架构Hadoop
2.1 概述
2.2 Hadoop项目结构
2.3 Hadoop的安装与使用
2.4 Hadoop集群的部署和使用

第3讲 分布式文件系统HDFS
3.1 分布式文件系统HDFS简介
3.2 HDFS相关概念
3.3 HDFS体系结构
3.4 HDFS存储原理
3.5 HDFS数据读写过程
3.6 HDFS编程实践

第4讲 分布式数据库HBase
4.1 HBase简介
4.2 HBase数据模型
4.3 HBase的实现原理
4.4 HBase运行机制
4.5 HBase应用方案
4.6 HBase安装配置和常用Shell命令
4.7 HBase常用Java API及应用实例

第5讲 NoSQL数据库
5.1 NoSQL概述
5.2 NoSQL与关系数据库的比较
5.3 NoSQL的四大类型
5.4 NoSQL的三大基石
5.5 从NoSQL到NewSQL数据库
5.6 文档数据库MongoDB

第6讲 云数据库
6.1 云数据库概述
6.2 云数据库产品
6.3 云数据库系统架构
6.4 Amazon AWS和云数据库
6.5 微软云数据库SQL Azure
6.6 云数据库实践

第7讲 MapReduce
7.1 MapReduce概述
7.2 MapReduce的体系结构
7.3 MapReduce工作流程
7.4 Shuffle过程原理
7.5 MapReduce应用程序执行过程
7.6 实例分析:WordCount
7.7 MapReduce的具体应用
7.8 MapReduce编程实践

第8讲 数据仓库Hive
8.1 数据仓库概念
8.2 Hive简介
8.3 SQL转换成MapReduce作业的原理
8.4 Impala
8.5 Hive编程实践

第9讲 Hadoop再探讨
9.1 Hadoop的优化与发展
9.2 HDFS2.0的新特性
9.3 新一代资源管理调度框架YARN
9.4 Hadoop生态系统中具有代表性的功能组件

第10讲 Spark
10.1 Spark概述
10.2 Spark生态系统
10.3 Spark运行架构
10.4 Spark SQL
10.5 Spark的部署和应用方式
10.6 Spark编程实践

第11讲 流计算
11.1 流计算概述
11.2 流计算处理流程
11.3 流计算的应用
11.4 开源流计算框架Storm
11.5 Spark Streaming、Samza以及三种流计算框架的比较
11.6 Storm编程实践

第12讲 图计算
12.1 图计算简介
12.2 Pregel简介
12.3 Pregel图计算模型
12.4 Pregel的C++ API
12.5 Pregel的体系结构
12.6 Pregel的应用实例——单源最短路径
12.7 Hama的安装和使用

第13讲 大数据在不同领域的应用
13.1 大数据应用概览
13.2 推荐系统
13.3 大数据在智能医疗和智能物流领域运用

第1讲 大数据概述

1.1 大数据时代

(1)对于计算机安装了Windows系统的读者。如果你对Linux系统很熟悉,可以尝试采用双系统安装方式(只要2GB内存就可以顺利运行大数据环境),也就是同时安装Windows系统和Linux系统,开机启动时,可以选择进入哪种操作系统。但是,很多读者对于Linux系统并不熟悉,所以,建议采用在Windows系统中安装Linux虚拟机,这样,可以很容易在自己熟悉的Windows系统中启动进入Linux虚拟机。但是,在Windows系统中安装Linux虚拟机,需要计算机的内存至少在4GB,否则,运行速度会很慢,严重阻碍大数据各项实验的顺利开展。所以,如果你的计算机内存小于4GB,当采用在Windows系统中安装Linux虚拟机这种方式时,建议你采购一条8GB内存增加到你的计算机中,同时,要求划分给Linux虚拟机的磁盘空间要大于等于30GB。

(2)对于苹果Mac笔记本电脑。不需要采用虚拟机的方式,也不需要双系统的方式,可以直接在Mac中安装Hadoop、Spark等各种大数据软件。并且,不需要额外购买内存条,基本上,Mac笔记本电脑的硬件配置,都可以顺畅运行大数据实验环境。

教材:大数据技术原理与应用
在这里插入图片描述
资料:https://dblab.xmu.edu.cn/post/8197/

大数据概念、影响、应用、关键技术
大数据与云计算、物联网的关系

1.1.1第三次信息化浪潮

根据IBM前首席执行官郭士纳的观点,IT领域每隔十五年就会迎来一次重大变革
在这里插入图片描述

1.1.2信息科技为大数据时代提供技术支撑

存储
在这里插入图片描述
计算
在这里插入图片描述
网络
在这里插入图片描述

1.1.3数据产生方式的变革促成大数据时代的来临

在这里插入图片描述

1.1.4大数据的发展历程

在这里插入图片描述

1.2 大数据概念

在这里插入图片描述

1.2.1 数据量大

1根据IDC作出的估测,数据一直都在以每年50%的速度增长,也就是说每两年就增 长一倍(大数据摩尔定律)
2人类在最近两年产生的数据量相当于之前产生的全部数据量
3预计到2020年,全球将总共拥有35ZB的数据量,相较于2010年,数据量将增长近 30倍

1.2.2 数据类型繁多

大数据是由结构化和非结构化数据组成的
– 10%的结构化数据,存储在数据库中 – 90%的非结构化数据,它们与人类信息密切相关
在这里插入图片描述
在这里插入图片描述

1.2.3 处理速度快

在这里插入图片描述
谷歌的Dremel:交互式查询,成千上万台服务器,只需要1秒

1.2.4 价值密度低

价值密度低,商业价值高
以视频为例,连续不间断监控过程中,可能有用的数据仅仅有一两秒,但是具有很高 的商业价值

1.3 大数据的影响

图灵奖获得者、著名数据库专家Jim Gray 博士观察并总结人类自古以来,在科学研究上,先后 历经了实验、理论、计算和数据四种范式 。
在思维方式方面,大数据完全颠覆了传统的思维方式:
– 全样而非抽样 抽取数据存储、计算、分析,而现在包含众多CPU的集群
– 效率而非精确 抽样计算的结果误差全羊上会放大
– 相关而非因果

1.4 大数据的应用

影视剧拍摄、谷歌预测流感:搜索引擎实时收集用户的搜索情况,实时分析

1.5 大数据关键技术

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分布式数据库BigTable、分布式文件系统GFS、分布式并行处理技术MapReduce

1.6 大数据计算模式

在这里插入图片描述
1、批处理
在这里插入图片描述
MapReduce没办法做迭代计算,但Spark可以高效地做迭代计算(数据挖掘)
2、流计算(实时计算)
在这里插入图片描述
在这里插入图片描述
3、图计算
在这里插入图片描述
在这里插入图片描述4、查询分析计算
在这里插入图片描述

1.7 大数据产业

在这里插入图片描述

1.8 大数据与云计算、物联网的关系

云计算:云计算实现了通过网络提供可伸缩的、廉价的分布式计算能力,用户只需要在具 备网络接入条件的地方,就可以随时随地获得所需的各种IT资源 。即通过网络以服务的方式为用户提供非常廉价的IT资源。
在这里插入图片描述
公有云:百度云
私有云:电信云
混合云:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
底层基础设施即服务:把基础设施作为一种服务,卖给你。购买亚马逊的基础设施即服务,亚马逊提供了弹性计算云EC2,可以直接通过网络购买这种EC2的环境,在环境里面去安装各种系统各种应用。亚马逊直接给用户搭建好一个平台,内存CPU存储全给用户提供了,用户直接在平台上面安装系统和应用就可以了。
在这里插入图片描述
在这里插入图片描述
平台即服务:云计算时代,很多时候都需要去开发一些云计算的产品,这个时候作为一个个体来讲,你没有能力去给自己搭建一个云环境,谷歌等公司就专门提供了一个云平台开发环境,你可以在它搭建好的云平台上面,它给你提供了一系列的环境和接口,你去调用它的接口,用它的资源开发各种云计算产品。开发出来的产品,也部署在它的分布式服务器平台上面,它可以把底层成千上万台服务器资源供你去调用它给你搭建起这么一个平台,把这个平台作为服务来买给你用。国内新浪也在做这么一个平台,sina PP Angine,搭建了云计算环境的开发平台,你可以在新浪上面开发各种云应用,在它上面开发、部署,然后卖给别人。
在这里插入图片描述
软件即服务:以前是卖金蝶。云财务软件,用户在任何一个地方,只要有浏览器就可以用。全球这样的公司,salesforce。
云计算解决的问题:
在这里插入图片描述
云计算关键技术包括:虚拟化、分布式存储、分布式计算、多租户等
在这里插入图片描述
在这里插入图片描述
虚拟化:自己在做上机时,
在这里插入图片描述
云计算数据中心:是一整套复杂的设施,包括刀片服务器、宽带网络连接、环境控 制设备、监控设备以及各种安全装置等。 数据中心是云计算的重要载体,为云计算提供计算、存储、带宽等各种硬件资源 ,为各种平台和应用提供运行支撑环境 。全国各地推进数据中心建设 。
在这里插入图片描述
都在云里?各种 数据和应用,并非在“天上云端”,而是位于数据中心里。所有的计算所有的应用都由数据中心来承载的,数据中心是由成百上千台上万台服务器构成的。
一般一个标准的服务中心,可能会包含5000台刀片服务器。
在这里插入图片描述
在这里插入图片描述
数据中心建好了后,就可以收费了。
数据中心修建在冷。电力资源比较丰富的地方。地质稳定的地方。贵州
数据中心能耗非常大。一天30万的电费
在这里插入图片描述
一个数据中心修建需要30~50个亿。
在这里插入图片描述
在这里插入图片描述
并不是一个机箱,机箱是有外壳的,而刀片式服务器都是裸露的,CPU和内存都在上面,插上去就可以了。
云计算的应用:
在这里插入图片描述
• 政务云上可以部署公共安全管理、容灾备份、城市管理、应急管理、智能交通、社 会保障等应用,通过集约化建设、管理和运行,可以实现信息资源整合和政务资源 共享,推动政务管理创新,加快向服务型政府转型
• 教育云可以有效整合幼儿教育、中小学教育、高等教育以及继续教育等优质教育资 源,逐步实现教育信息共享、教育资源共享及教育资源深度挖掘等目标
• 中小企业云能够让企业以低廉的成本建立财务、供应链、客户关系等管理应用系统 ,大大降低企业信息化门槛,迅速提升企业信息化水平,增强企业市场竞争力
• 医疗云可以推动医院与医院、医院与社区、医院与急救中心、医院与家庭之间的服 务共享,并形成一套全新的医疗健康服务系统,从而有效地提高医疗保健的质量

政府把所有这些机器全部统一集中在一个地方,按虚拟化技术构建一个庞大的资源池。大家公用这样一个资源池,可以提高设备的资源利用率 。

云计算产业: 云计算产业作为战略性新兴产业,近些年得到了迅速发展,形成了成熟的产业链 结构,产业涵盖硬件与设备制造、基础设施运营、软件与解决方案供应商、基础 设施即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)、终端设备 、云安全、云计算交付/咨询/认证等环节
在这里插入图片描述

第2讲 大数据处理架构Hadoop

2.1 概述

发展历程、特性、应用现状
在这里插入图片描述
开源的分布式计算平台,免费、极大地降低了使用的复杂性
对我们普通用户,屏蔽了大数据底层实现的细节,只要按照它提供的更高层的接口,做一些简单的编程操作,后台所有的工作全部由整个系统自己实现。完全不像以前学习高性能计算编程方法那么复杂,现在我们做分布式并行编程,要比原来简单的多。Hadoop平台使用Java平台来开发的。

2.1.1简介

Hadoop是Apache软件基金会旗下的一个开源分布式计算平台,为用户提供了系统 底层细节透明的分布式基础架构
•Hadoop是基于Java语言开发的,具有很好的跨平台特性,并且可以部署在廉价的计 算机集群中
•Hadoop的核心是分布式文件系统HDFS(Hadoop Distributed File System)和 MapReduce
•Hadoop被公认为行业大数据标准开源软件,在分布式环境下提供了海量数据的处理 能力
•几乎所有主流厂商都围绕Hadoop提供开发工具、开源软件、商业化工具和技术服务, 如谷歌、雅虎、微软、思科、淘宝等,都支持Hadoop
在这里插入图片描述
扩平台特性。
Hadoop:并不是一个单一的技术,实际上是一系列大数据技术的集合体,是一整套解决方案的统称,我们把它成为一个项目。
在这里插入图片描述
分布式文件系统HDFS、分布式并行框架MapReduce
解决了怎么实现海量数据的分布式存储、怎么实现海量数据的分布式处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Hadoop最初是由Apache Lucene项目的创始人Doug Cutting开发的文本搜索库。Hadoop源自始于2002年的Apache Nutch项目——一个开源 的网络搜索引擎并且也是Lucene项目的一部分。
在这里插入图片描述
在这里插入图片描述
04年Hadoop把GFS纳入自己的平台下,进行了开源实现
• 在2004年,Nutch项目也模仿GFS开发了自己的分布式文件系统 NDFS(Nutch Distributed File System),也就是HDFS的前身
• 2004年,谷歌公司又发表了另一篇具有深远影响的论文,阐述了 MapReduce分布式编程思想 • 2005年,Nutch开源实现了谷歌的MapReduce
• 到了2006年2月,Nutch中的NDFS和MapReduce开始独立出来,成 为Lucene项目的一个子项目,称为Hadoop,同时,Doug Cutting加盟雅虎
在这里插入图片描述
Hadoop把它纳入到了自己的平台下,作为自己的一个核心的开源实现
• 2008年1月,Hadoop正式成为Apache顶级项目,Hadoop也逐渐开始被雅虎之外的其他公司使用
• 2008年4月,Hadoop打破世界纪录,成为最快排序1TB数据的系统, 它采用一个由910个节点构成的集群进行运算,排序时间只用了209秒
在这里插入图片描述
对1TB数据排序只用了209秒
很多的企业和学校都投入到了对
•在2009年5月,Hadoop更是把1TB数据排序时间缩短到62秒。 Hadoop从此名声大震,迅速发展成为大数据时代最具影响力的开源分 布式开发平台,并成为事实上的大数据处理标准

2.1.2特性

Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的,它具有以下几个方面的特性:
• 高可靠性
在这里插入图片描述
• 高效性
在这里插入图片描述
是对集群的运算,把成百上千的机器一起计算,作为一个整体来分布式并行处理,非常高效地处理海量分布式数据集
• 高可扩展性
在这里插入图片描述
可以加到几千个节点
• 高容错性
即使一个副本发生了问题,其他的副本也能正常计算
• 成本低
在这里插入图片描述
可以把之前采购的一些PC机可以利用起来
• 运行在Linux平台上
• 支持多种编程语言
虽然是用Java开发的一种平台,具有很好的跨平台特性。但是它还是支持多种语言进行编程实现,来完成Hadoop应用程序的开发。

2.1.3应用现状

• Hadoop凭借其突出的优势,已经在各个领域得到了广泛的应用,而 互联网领域是其应用的主阵地
• 2007年,雅虎在Sunnyvale总部建立了M45——一个包含了4000个处 理器和1.5PB容量的Hadoop集群系统
• Facebook作为全球知名的社交网站,Hadoop是非常理想的选择, Facebook主要将Hadoop平台用于日志处理、推荐系统和数据仓库等 方面
• 国内采用Hadoop的公司主要有百度、淘宝、网易、华为、中国移动 等,其中,淘宝的Hadoop集群比较
在这里插入图片描述
中国移动
在企业中到底是怎么用的呢?
在这里插入图片描述
最主要的三种应用就是:数据分析、数据实时查询、数据挖掘
从底层数据源得到数据以后,为了支撑上层的这三种应用,Hadoop的相关技术是如何来支撑的呢?
不同的Hadoop组件可以帮助实现不同的企业分析,最底层可以使用Hadoop平台的HDFS分布式文件存储,来满足企业中大量数据存储的需求,存储完就需要进行数据分析。
第一类数据分析:离线分析,我们把很多数据拿过来以后进行批量处理,MapReduce最擅长做批处理,(长处就是可以对批量的数据进行离线分析),可以用数据仓库产品Hive和Pig,来帮助进行离线数据分析。
对于实时数据查询,我们可以用HBase数据库,HBase是支持几十亿行数据的,是非常好的分布式数据库。如果对数据挖掘应用,可以使用Mahout,它把各种数据挖掘、机器学习、商务智能的算法都用MapReduce实现了,这个组件也是开源的,它里面包含了非常多算法的MapReduce实现。如果没有这些开源套件,开发人员就需要自行编写决策树算法,需要自己写。现在不用了,直接把它拿过来用就好了。

2.1.4Apache Hadoop版本演变

•Apache Hadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop 2.0
•第一代Hadoop包含三个大版本,分别是0.20.x,0.21.x和0.22.x,其 中,0.20.x最后演化成1.0.x,变成了稳定版,而0.21.x和0.22.x则增加 了NameNode HA等新的重大特性
•第二代Hadoop包含两个版本,分别是0.23.x和2.x,它们完全不同于 Hadoop 1.0,是一套全新的架构,均包含HDFS Federation和YARN两 个系统,相比于0.23.x,2.x增加了NameNode HA和Wire-compatibility 两个重大特性
在这里插入图片描述

2.1.5 Hadoop各种版本

• Apache Hadoop • Hortonworks • Cloudera(CDH:Cloudera Distribution Hadoop) • MapR • ……
选择 Hadoop版本的考虑因素:
•是否开源(即是否免费) •是否有稳定版 •是否经实践检验 •是否有强大的社区支持
在这里插入图片描述

2.2 Hadoop项目结构

生态系统的各个组件及其功能
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
common为hadoop其他组件提供公用库
在这里插入图片描述

YARN

在这里插入图片描述
处理之前,必须要有相关的框架去调度计算资源,底层这么多资源主要靠YARN框架去调度,专门负责调度内存、CPU、带宽等计算资源。
上面这些组件是完成具体的计算工作的。

MapReduce

专门做离线计算和批处理的
在这里插入图片描述

Tez

会把很多的MapReduce作业进行分析优化,并构建一个有向无环图
在这里插入图片描述
分清有些先做,有些后做,有些不要去重复做。相当于一个流程,Tez可以实现作业优化功能。

Spark

在这里插入图片描述
也是用Redecu函数去做数据处理,与MapReduce的区别是:
在这里插入图片描述
在这里插入图片描述
MapReduce都要把数据写到磁盘当中去,处理结束后,还要把数据写到分布式文件系统当中去
Spark在整个数据处理的过程中,都是在内存当中去执行的,所以Spark要比MapReduce高一个数量级
很多企业都在用Spark去取代一些原来用MapReduce实现的功能

Hive

在这里插入图片描述
数据仓库:专门用于企业决策分析的,它可以把大量的历史数据,都保存在数据仓库当中,建立各种各样的维度,可以对历史数据进行大量的分析,来满足企业的一些决策需求。
在这里插入图片描述
OLAP分析,数据多维分析
Hive上面可以用SQL语句去完成各种分析
在这里插入图片描述
虽然使用SQL操作,但是Hive架构在MapRedude上面,会把你写的SQL语句通过一系列的转化后,把它转换成一维的MapReduce作业再去执行。

Pig

在这里插入图片描述
Pig是帮你完成流数据处理的,Hive是对于批量数据的处理。
Pig也提供了类似SQL语句的语法,Pig Latin,轻量级的脚本语言。
MapReduce编程比较复杂,要写完整的代码段。而Pig只用一两条语句就可以完成

Oozie

在这里插入图片描述
Oozie作业流调度系统:我们在进行应用程序开发的时候,一个完整的工作,可能需要把它分解成很多个工作环节,不同应用程序去配合完成一个工作,那这就需要一个工作流系统来定义。先完成这个,后完成这个。

ZooKeeper

在这里插入图片描述
ZooKeeper分布式协调服务,分布式锁、集群管理。
在这里插入图片描述

HBase

在这里插入图片描述
HBase列族数据库,是做顺序读写的,实际应用中很多是需要随机读写的
随机读写靠什么产品来满足呢?:就是这个面向列存储的HBase数据库。可以支持几十亿行,上百万列的超大型数据库,它执行随机读写和实时应用。

Flume

在这里插入图片描述
Flume日志收集分析框架,比如做流式数据分析的时候,比如用户去访问阿里巴巴这些网站,点击流呀都是实时生成的,实时分析,必须有一套工具帮你把它收集过来。
在这里插入图片描述

Sqoop

在这里插入图片描述
Sqoop用于数据导入导出。历史上有非常多的关系型数据库,
在这里插入图片描述
到了大数据时代,需要把它用Hadoop平台上面的技术去分析,必须要把这些关系型数据库当中相关的产品导入到Hadoop平台上面来。
在这里插入图片描述
进行互导。

Ambari在这里插入图片描述

Ambari部署工具,它会帮你在一个集群上面,非常智能化地区部署和管理一整套Hadoop平台上的各个套件。

2.3 Hadoop的安装与使用

2.3.1 Hadoop安装之前的预备知识

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
单击模式:是Hadoop安装包解压缩后的默认模式,没有任何配置就可以去运行Hadoop了,它访问的是本地磁盘,不会去访问分布式文件系统HDFS
伪分布式:就是在单个节点上模拟多个节点的运行方式。真正的分布式是由一个NameNode和若干个DataNode构成的,如果要把NameNode和DataNode都放在同一个节点上运行,就是伪分布式。
分布式模式:名称节点和数据节点是放在不同机器上去的

真正的分布式模式可以参照实验室教程上的操作去进行。

2.3.2 安装Linux虚拟机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.3 安装双操作系统

在这里插入图片描述
第一步:制作安装U盘 •具体可参考百度经验文章 •http://jingyan.baidu.com/article/59703552e0a6e18fc007409f.html
第二步:双系统安装 •具体可参考百度经验文章 •http://jingyan.baidu.com/article/dca1fa6fa3b905f1a44052bd.html
在这里插入图片描述

2.3.4 详解Hadoop的安装与使用

Hadoop基本安装配置主要包括以下几个步骤:
• 创建Hadoop用户
• SSH登录权限设置
• 安装Java环境
• 单机安装配置
• 伪分布式安装配置
详细安装配置过程请参考厦门大学数据库实验室出品教程 《Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04》
http://dblab.xmu.edu.cn/blog/install-hadoop/ 在“大数据课程学生服务站”中的第二章《学习指南》有该教程链接地址

创建Hadoop用户
如果安装 Ubuntu 的时候不是用的 “hadoop” 用户,那么需要增加一个名为 hadoop 的用户
首先按 ctrl+alt+t 打开终端窗口,输入如下命令创建新用户 :
$ sudo useradd –m hadoop –s /bin/bash
上面这条命令创建了可以登陆的 hadoop 用户,并使用 /bin/bash 作为 shell
接着使用如下命令设置密码,可简单设置为 hadoop,按提示输入两次密码:
$ sudo passwd hadoop
可为 hadoop 用户增加管理员权限,方便部署,避免一些对新手来说比较棘手的权限问题:
$ sudo adduser hadoop sudo

SSH登录权限设置
SSH是什么?
SSH 为 Secure Shell 的缩写,是建立在应用层和传输层基础上的安全协议。SSH 是目前较可 靠、专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程 管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操 作平台。 SSH是由客户端和服务端的软件组成,服务端是一个守护进程(daemon),它在后台 运行并响应来自客户端的连接请求,客户端包含ssh程序以及像scp(远程拷贝)、slogin(远 程登陆)、sftp(安全文件传输)等其他的应用程序 。
配置SSH的原因: Hadoop名称节点(NameNode)需要启动集群中所有机器的Hadoop守护进程,这个过程需要 通过SSH登录来实现。Hadoop并没有提供SSH输入密码登录的形式,因此,为了能够顺利登 录每台机器,需要将所有机器配置为名称节点可以无密码登录它们

安装Java环境
• Java环境可选择 Oracle 的 JDK,或是 OpenJDK
• 可以在Ubuntu中直接通过命令安装 OpenJDK 7 $ sudo apt-get install openjdk-7-jre openjdk-7-jdk
• 还需要配置一下 JAVA_HOME 环境变量
• 具体请参考网络教程:http://dblab.xmu.edu.cn/blog/install-hadoop/

单机安装配置
Hadoop 2 安装文件的下载
Hadoop 2 可以到官网下载,需要下载 hadoop-2.x.y.tar.gz 这个格式的文件,这是 编译好的,另一个包含 src 的则是 Hadoop 源代码,需要进行编译才可使用
•如果读者是使用虚拟机方式安装Ubuntu系统的用户,请用虚拟机中的Ubuntu自带 firefox浏览器访问本指南,再点击下载地址,才能把hadoop文件下载虚拟机ubuntu 中。请不要使用Windows系统下的浏览器下载,文件会被下载到Windows系统中, 虚拟机中的Ubuntu无法访问外部Windows系统的文件,造成不必要的麻烦。 •如果读者是使用双系统方式安装Ubuntu系统的用户,请进去Ubuntu系统,在Ubuntu 系统打开firefox浏览器,再点击下载

单机安装配置
选择将 Hadoop 安装至 /usr/local/ 中
$ sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中
$cd /usr/local/
$sudo mv ./hadoop-2.6.0/ ./hadoop # 将文件夹名改为hadoop
$sudo chown -R hadoop:hadoop ./hadoop # 修改文件权限
Hadoop 解压后即可使用。输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
$ cd /usr/local/hadoop
$./bin/hadoop version
Hadoop 默认模式为非分布式模式(本地模式),无需进行其他配置即可运行。

伪分布式安装配置
•Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离 的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时, 读取的是 HDFS 中的文件
•Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式 需要修改2个配置文件 core-site.xml 和 hdfs-site.xml
•Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现
实验步骤:
修改配置文件:core-site.xml,hdfs-site.xml,mapred-site.xml
初始化文件系统hadoop namenode -format
启动所有进程start-all.sh
访问web界面,查看Hadoop信息
运行实例
修改配置文件 core-site.xml

<configuration>     
<property>         
<name>hadoop.tmp.dir</name>         
<value>file:/usr/local/hadoop/tmp</value>         
<description>Abase for other temporary directories.</description>     
</property>     
<property>         
<name>fs.defaultFS</name>         
<value>hdfs://localhost:9000</value>     
</property> 
</configuration> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

•name为fs.defaultFS的值,表示hdfs路径的逻辑名称
•hadoop.tmp.dir表示存放临时数据的目录,即包括NameNode的数据,也包括 DataNode的数据。该路径任意指定,只要实际存在该文件夹即可
修改配置文件 hdfs-site.xml

<configuration>     
<property>         
<name>dfs.replication</name>         
<value>1</value>     
</property>     
<property>         
<name>dfs.namenode.name.dir</name> 
<value>file:/usr/local/hadoop/tmp/dfs/name</value>     
</property>     
<property>         
<name>dfs.datanode.data.dir</name> 
<value>file:/usr/local/hadoop/tmp/dfs/data</value>     
</property>
</configuration> 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

•dfs.replication表示副本的数量,伪分布式要设置为1
•dfs.namenode.name.dir表示本地磁盘目录,是存储fsimage文件的地方 •dfs.datanode.data.dir表示本地磁盘目录,HDFS数据存放block的地方

关于三种Shell命令方式的区别:

  1. hadoop fs 2. hadoop dfs 3. hdfs dfs
    •hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
    •hadoop dfs只能适用于HDFS文件系统
    •hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统

2.4 Hadoop集群的部署和使用

2.4.1 集群节点类型

在这里插入图片描述
HDFS组件对底层硬件的需求,MapReduce组件对底层硬件的需求。
•Hadoop框架中最核心的设计是为海量数据提供存储的HDFS和对数据进行计算的 MapReduce
•MapReduce的作业主要包括:(1)从磁盘或从网络读取数据,即IO密集工作;(2) 计算数据,即CPU密集工作
•Hadoop集群的整体性能取决于CPU、内存、网络以及存储之间的性能平衡。因此运营团队在选择机器配置时要针对不同的工作节点选择合适硬件类
在这里插入图片描述
HDFS1.0中,只有唯一一个NameNode,一个NameNode和若干个DataNode数据节点,一起构成一个分布式数据节点。
NameNode就像是一个目录服务器一样,应用来取数据的时候,首先去访问这个NameNode,名称节点,去获得关于应用要访问的数据,我们要访问的数据到底被放在了哪些DataNode上面。应用访问的时候,都会先去访问这个NameNode,获得关于数据存储的具体地址的信息,再跑到具体的数据节点上面去取数据。
比如说:有一个名称节点加上三个数据节点,应用节点来了,先到这个名称节点上面去问一下,我要访问这个文件,你告诉我,这个文件被存放到哪里去了,名称节点会告诉你,你这个文件已经被切分成四块,第一块在机器1上面,第二块在机器2上面,拿到这些信息以后,跑到第1机器去取第一块,跑到第2机器去取第2块,取过来以后,把他们拼装起来,就完成了分布式文件系统中对这个数据的访问。
在这里插入图片描述
JobTracker相当于一个作业管家。
在做MapReduce应用程序开发的时候,每次都是以一个MapReduce作业的形式去完成具体的计算任务,那么谁去管理这个作业呢?就是由这个JobTracker负责对整个作业的管理,它会把一个用户的一个大的作业,拆分成很多小作业,分发到不同机器上去执行,JobTracker去协调不同机器去执行。
不同的机器上面部署了TaskTracker,每一个TaskTracker负责跟踪和执行分配给自己那一小部分作业。
一个MapReduce集群做作业的时候,会有一个总管家叫JobTracker来协调很多个位于不同机器上面的,若干个TaskTracker,完成一个大的作业。
整个集群当中就这么几大核心组件。
在这里插入图片描述
还有一类组件叫做SecondaryNameNode,是HDFS的一个组件,它是NameNode的一个备份,它并不是NameNode的热备份,它是冷备份,一旦HDFS的NameNode出了故障以后,SecondaryNameNode是不能马上顶上去的,它需要一个恢复的过程。
在这里插入图片描述
•一个基本的Hadoop集群中的节点主要有
•NameNode:负责协调集群中的数据存储
•DataNode:存储被拆分的数据块
•JobTracker:协调数据计算任务
•TaskTracker:负责执行由JobTracker指派的任务
•SecondaryNameNode:帮助NameNode收集文件系统运行的状态信息

有了这几个角色之后,整个Hadoop集群在选型选硬件的时候,就是为了考虑这几个组建的需求。
首先,在整个集群当中,大部分的机器都是用来做数据节点,因为要存储海量的数据,而且大部分的节点也是用来做TaskTracker,因为TaskTracker是部署在各个节点上面,要负责处理分配给自己的一小部分作业,一个大的作业被切分成很多小块,大部分机器也是运行TaskTracker。
在这里插入图片描述
而且要注意,这个TaskTracker和DataNode可以部署在同一个节点上面,我们可能在一个机器上面,这个机器即是DataNode,同时也是TaskTracker。即这个程序就处理位于这个机器上面的数据。
既然大部分的机器都是用来做数据节点和TaskTracker,对于企业来讲如何选机器呢?

2.4.2 集群硬件配置

在这里插入图片描述
DataNode就是存数据 ,它肯定需要比较大的磁盘空间,一般一个机器挂四个磁盘驱动器,一个盘12个T,要48TB作为DataNode。要支持JBOD,这种磁盘簇和磁盘阵列RAID是不一样的。而且CPU至少要2-5GHZ,对企业级应用来说,要配两个四核CPU,作为数据节点和TaskTracker。内存要16~24GB。虽然它是数据节点,它也要进行数据的传输和处理,TaskTracker也要完成数据的计算,TaskTracker要完成分配给自己的那一小部分任务,也要在内存当中完成计算。
用千兆以太网,去完成节点之间的数据传输。
在这里插入图片描述

在这里插入图片描述
再来看NameNode,在一个集群当中,对于分布式文件系统HDFS而言,NameNode是个总管家。它的元数据会告诉你,一个文件会被拆分成多少块,每块被存放到哪个服务器,它会建立一个映射表,这些映射表的元数据全都是保存到内存当中去。如果一个文件系统支持几百TB上千TB的文件存储,整个的元数据表会非常大,元数据表非常大,意味着什么呢?意味着你必须能够存得下这么多的数据。用来作为NameNode的机器,内存空间要非常大,一定要有很大的内存,这里的内存设置为16GB到72GB。
在这里插入图片描述
双通道或三通道以上的内存。
NameNode本身也需要一些数据传输处理和数据存储。需要8到12个磁盘驱动器,大概需要8TB到16TB。
它的网络带宽要更高,最好达到万兆。
因为NameNode是管家,要和各个数据节点进行连接。带宽要非常高。
在这里插入图片描述
冷备份SecondaryNameNode,如果是一个比较小型的集群,负担不重的时候,可以把冷备份SecondaryNameNode和NameNode放在一起。在大型的集群当中,就不可以这么做了。需要单独设置一台服务器。而且这台服务器,是跟NameNode性能差不多的服务器。

在集群中,大部分的机器设备是作为Datanode和TaskTracker工作的
Datanode/TaskTracker的硬件规格可以采用以下方案:
•4个磁盘驱动器(单盘1-2T),支持JBOD(Just a Bunch Of Disks,磁盘簇) •2个4核CPU,至少2-2.5GHz •16-24GB内存 •千兆以太网

NameNode提供整个HDFS文件系统的NameSpace(命名空间)管理、块管理等所有 服务,因此需要更多的RAM,与集群中的数据块数量相对应,并且需要优化RAM的 内存通道带宽,采用双通道或三通道以上内存。硬件规格可以采用以下方案:
•8-12个磁盘驱动器(单盘1-2T) •2个4核/8核CPU •16-72GB内存 •千兆/万兆以太网

SecondaryNameNode在小型集群中可以和NameNode共用一台机器,较大的群集 可以采用与NameNode相同的硬件

2.4.3 集群规模要多大

在这里插入图片描述
从几台、几十台、几百台、几千台。
对于企业来讲,一定要去估算整个数据量。根据数据量的大小,去设置集群机器的数量。实例:对于一家大型公司来讲,每天增加的数据都有几个TB。如果说数据每周要增加1TB,数据要保存三个副本,即每周要增加3TB,还要存储一些日志文件、其他中间文件,所以还要冗余预留30%的空间,即一共增加4TB。相当于前面给大家配置的一台机器,一台机器配置4个驱动器,一周就要在增加一台机器,一年52周,两年104周,100台服务器。
对于一个小集群,NameNode属于HDFS,JobTracker属于MapReduce。这两个组件是可以运行在一个节点上面的。小集群是可以公用一个机器的,大的就要分开部署。
在这里插入图片描述

2.4.4 集群网络拓扑

在这里插入图片描述
企业机房里摆放很多机架,一个机架里面大概有三十到四十个机器,每一个叫一个服务器,一个刀片服务器,机架里面都是通过高速宽带网络进行连接,机架内部还有个光纤交换机进行连接,机架内部宽带都是1GB的交换机。
在这里插入图片描述
•普通的Hadoop集群结构由一个两阶网络构成
•每个机架(Rack)有30-40个服务器,配置一个1GB的交换机,并向上传输到一个 核心交换机或者路由器(1GB或以上)
•在相同的机架中的节点间的带宽的总和,要大于不同机架间的节点间的带宽总和

2.4.5 集群的建立与安装

把硬件买来,放进机架。安装和部署Hadoop。几百台上前台要部署Hadoop时,企业采用自动化的部署工具
采购好相关的硬件设备后,就可以把硬件装入机架,安装并运行Hadoop 安装Hadoop有多种方法:
•(1)手动安装
•(2)自动化安装
•为了缓解安装和维护每个节点上相同的软件的负担,可以使用一个自动化方法 实现完全自动化安装,比如Red Hat Linux’ Kickstart、Debian或者Docker
•自动化安装部署工具,会通过记录在安装过程中对于各个选项的回答来完成自 动化安装过程。

2.4.6 Hadoop集群基准测试

在这里插入图片描述
DFS:分布式文件系统。

2.4.7 在云计算环境中使用Hadoop

在这里插入图片描述
本地、企业本地、云计算。
企业不要在单位内部构建机房,直接用云计算服务商提供的服务。
可以把整个应用程序的运行环境,通过云、网络的方式廉价的提供给你。
现在企业不需要去购买集群了,直接通过网络去购买服务。
在这里插入图片描述
EC2:弹性计算云。把底层的内存、CPU等机器环境,全都已经部署好了。直接可以把你的Hadoop平台部署到上面去。
•Hadoop不仅可以运行在企业内部的集群中,也可以运行在云计算环境中
•可以在Amazon EC2中运行Hadoop。EC2是一个计算服务,允许客户租用计算机 (实例),来运行自己的应用。客户可以按需运行或终止实例,并且按照实际使用情 况来付费
•Hadoop自带有一套脚本,用于在EC2上面运行Hadoop
•在EC2上运行Hadoop尤其适用于一些工作流。例如,在Amazon S3中存储数据,在 EC2上运行集群,在集群中运行MapReduce作业,读取存储在S3中的数据,最后, 在关闭集群之前将输出写回S3中;如果长期使用集群,复制S3数据到运行在EC2上 的HDFS中,则可以使得数据处理更加高效,因为,HDFS可以充分利用数据的位置, S3则做不到,因为,S3与EC2的存储不在同一个节点上
在这里插入图片描述
你只要远程登录,它以云的方式给你提供服务,部署完后,可以直接用Hadoop平台里面的各种相关服务。存储服务、计算服务,都可以在云端实现。

本章小结:
• Hadoop被视为事实上的大数据处理标准,本章介绍了Hadoop的发展历程,并阐 述了Hadoop的高可靠性、高效性、高可扩展性、高容错性、成本低、运行在 Linux平台上、支持多种编程语言等特性
• Hadoop目前已经在各个领域得到了广泛的应用,雅虎、Facebook、百度、淘宝 、网易等公司都建立了自己的Hadoop集群
• 经过多年发展,Hadoop项目已经变得非常成熟和完善,包括Common、Avro、 Zookeeper、HDFS、MapReduce、HBase、Hive、Chukwa、Pig等子项目,其 中,HDFS和MapReduce是Hadoop的两大核心组件
• 本章最后介绍了如何在Linux系统下完成Hadoop的安装和配置,这个部分是后续 章节实践环节的基础

第3讲 分布式文件系统HDFS

3.1 分布式文件系统HDFS简介

3.1.1 计算机集群结构

在这里插入图片描述
HDFSl:解决分布式存储
在这里插入图片描述
在这里插入图片描述
每一排是一个机架、上面有很多机器
一个机器成为一个节点、一个机架有30~40个机器、节点
在这里插入图片描述
机架内部使用光纤交换机来连接
机架与机架之间使用带宽更高的几个光纤交换机,来完成彼此之间的交互与连接的

3.1.2 分布式文件系统的结构

在这里插入图片描述
把整个文件分布地存储到很多台机器上面去。
这么多机器肯定是有主有从的,有一个作为主节点,其余作为从节点。
主节点承担起数据目录(元数据)服务,从节点要具体完成数据的存储任务。
在这里插入图片描述
在这里插入图片描述
让企业以可承担的成本去存储和处理数据,以前都是需要非常高端的机器,现在只需要廉价的PC机,底层的硬件就是这么廉价低端
传统的数据系统以块为单位,每一次可以读取指定的某一部分数据,HDFS设计的目标就是对大量数据的读写,它不会去访问文件的某个子集,而是为了满足大规模数据的批量处理需求
小几百兆,大TB
文件模型,高效的读写。只允许追加数据,决不允许修改数据。
在这里插入图片描述
满足大规模的流式读写,设计上是为了批量读全部或者大部分数据,而不是非常精确地定位到某一个数据。意味着你想要读一条数据,也需要把整个数据读取出来再将其筛选出来。实时性不高HBase可以满足,有随机读取特性。
主要是通过元数据指示客户端到底到哪个节点寻找相关的文件,因为一个文件会被切分并存储到不同的的节点。这些元数据会被保存到内存中去,在内存中检索。小文件太多的话,这个索引结构会异常庞大,搜索效率低。
只允许追加。

3.2 HDFS相关概念

3.3.1 块

在这里插入图片描述
普通文件系统的一个块一般有几千个字节,HDFS的块大小默认为64MB
HDFS默认一个块64MB,一个文件被分成多个块,以块作为存储单位 块的大小远远大于普通文件系统,可以
在这里插入图片描述
访问HDFS文件,需要经过寻址,去找元数据目录、数据节点、从数据节点中去取数据。设计的块太小,会导致寻址开销太大。
块也不是越大越好,块太大的话:
在这里插入图片描述
在这里插入图片描述
最小化寻址开销 HDFS采用抽象的块概念可以带来以下几个明显的好处:
● 支持大规模文件存储:文件以块为单位进行存储,一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上,因此,一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量 。突破了单击存储容量的限制。
● 简化系统设计:首先,大大简化了存储管理,因为文件块大小是固定的,这样就可以很容易计算出一个节点可以存储多少文件块;其次,方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他系统负责管理元数据 。文件除以块大小,很容易算出一个文件需要多少块。
● 适合数据备份:每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性 。

3.3.2 名称节点和数据节点

在这里插入图片描述
一个文件几个TB,会被切分成非常多的块,这些块会被分布地、打乱地存储到很多不同的机器上面去,谁知道这些快到底被放到哪里去了呢?名称节点记录了这些信息,提供元数据服务,相当于一个数据目录。
在这里插入图片描述
一个HDFS中的名称节点要存储元数据,元数据包括:以上四个内容。
每个数据节点上的数据是被保存到数据节点本地的Linux文件系统中去。
在这里插入图片描述
在HDFS中,名称节点(NameNode)负责管理分布式文件系统的命名空间 (Namespace),保存了两个核心的数据结构,即FsImage和EditLog :
FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据 ;
操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作 。
名称节点记录了每个文件中各个块所在的数据节点的位置信息 。
在这里插入图片描述
FsImage文件 :
•FsImage文件包含文件系统中所有目录和文件inode的序列化形式。每个inode是一 个文件或目录的元数据的内部表示,并包含此类信息:文件的复制等级、修改和访问 时间、访问权限、块大小以及组成文件的块。对于目录,则存储修改时间、权限和配额元数据 。
•FsImage文件没有记录块存储在哪个数据节点。而是由名称节点把这些映射保留在内存中,当数据节点加入HDFS集群时,数据节点会把自己所包含的块列表告知给名称节点,此后会定期执行这种告知操作,以确保名称节点的块映射是最新的。
在这里插入图片描述
当数据节点加入到一个集群当中去,数据节点向名称节点汇报,即它会向管家汇报,自己节点当中都保存哪些数据块,作为管家的名称节点,就可以自己去构建一个清单,他自己就知道我这些数据块,到底分布在哪些节点上面去了。信息是这么得到的,不是通过FsImage来保存的。是通过名称节点和数据节点在运过程中不断地沟通,来实时的维护这些信息的,这些信息是保存在内存大中的。

名称节点启动时,到底是怎么处理这两大数据结构的呢?
在这里插入图片描述
名称节点的启动
•在名称节点启动的时候,用shell命令启动,你可能没看到它后台实际上做了很多事情。它会将FsImage文件从底层磁盘中的内容加载到内存中,之后再执行 EditLog文件中的各项操作,把这两个数据结构进行合并,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作,得到一个新的FsImage。 FsImage记录的是历史的相关数据结构信息,而在系统运行期间你对这些数据的修改是通过EditLog记录的,所以要合并。
•一旦在内存中成功建立文件系统元数据的映射,则创建一个新的FsImage文件和一个空的EditLog文件
•名称节点起来之后,HDFS中的更新操作会重新写到EditLog文件中,因为FsImage 文件一般都很大(GB级别的很常见),如果所有的更新操作都往FsImage文件中添加,这样会导致系统运行的十分缓慢,但是,如果往EditLog文件里面写就不会这样 ,因为EditLog 要小很多。每次执行写操作之后,且在向客户端发送成功代码之前, edits文件都需要同步更新 。所以我们不去动这个FsImage,把增量的后续发送的更新全部记录到EditLog当中去。除了FsImage 我们还需要EditLog,进行了优化处理。
在这里插入图片描述
名称节点运行期间EditLog不断变大的问题
•在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大
•虽然这对名称节点运行时候是没有什么明显影响的,但是,当名称节点重启的时候,名称节点需要先将FsImage里面的所有内容映像到内存中,然后再一条一条地执行EditLog中的记录,当 EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用 。
如何解决?答案是:SecondaryNameNode第二名称节点 ,它就是为了解决EditLog不断变大的问题 。他还可以冷备份。
第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是单独运行在一台机器。
在这里插入图片描述
在这里插入图片描述
它是怎么帮助解决EditLog不断增大的问题的呢?
左边是主名称节点,右边是第二名称节点。
在这里插入图片描述
主名称节点里面维护的FsImage和EditLog,这么两个核心的数据结构,整个EditLog会在运行期间不断增大,第二名称节点会定期地和名称节点进行通信,在某个阶段会请求名称节点停止使用EditLog文件,它就会告诉名称节点,你不要再往EditLog里面写了,它要把EditLog拽到自己机器上面来,他会让名称节点停止写入EditLog。
在这里插入图片描述
名称节点收到请求以后,马上会停止写入EditLog,会生成一个新的edits.new,也就是又生成一个EditLog,名称节点会把新的更新都写到edits.new中去,把原来的旧的EditLog放在一边,让第二名称节点取走,第二名称节点会通过Http Get的方式,从名称节点中把FsImage和EditLog都下载到本地。
在这里插入图片描述
FsImage因为一直保持不动,HDFS在运行期间的修改都是写到EditLog中的。FsImage是静态的,没有变化,第二名称节点把这两个数据结构都拷贝到本地,拷贝过来以后,在第二名称节点作合并操作,得到一个新的FsImage。合并完后再发送给名称节点。
在这里插入图片描述
名称节点就得到了合并以后的比较大的FsImage,然后名称节点就会把edits.new更改成Edit。edits.new在维护期间,记录了所有的新的到达的那些更新信息。通过这种操作,即实现了不断增大的FsImage和EditLog合并,有实现了冷备份的效果。因为都被第二名称节点拽走了。

SecondaryNameNode的工作情况:
(1)SecondaryNameNode会定期和NameNode 通信,请求其停止使用EditLog文件,暂时将新的 写操作写到一个新的文件edit.new上来,这个操作是瞬间完成,上层写日志的函数完全感觉不到 差别;
(2)SecondaryNameNode通过HTTP GET 方式从NameNode上获取到FsImage和EditLog文 件,并下载到本地的相应目录下;
(3)SecondaryNameNode将下载下来的 FsImage载入到内存,然后一条一条地执行 EditLog文件中的各项更新操作,使得内存中的 FsImage保持最新;这个过程就是EditLog和 FsImage文件合并;
(4)SecondaryNameNode执行完(3)操 作之后,会通过post方式将新的FsImage文件发 送到NameNode节点上
(5)NameNode将从SecondaryNameNode 接收到的新的FsImage替换旧的FsImage文件, 同时将edit.new替换EditLog文件,通过这个过程 EditLog就变小了

在这里插入图片描述
数据节点(DataNode)
•数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表
•每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中

3.3 HDFS体系结构

3.4.1 HDFS体系结构概述

在这里插入图片描述
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点( NameNode)和若干个数据节点(DataNode)。名称节点作为中心服务器, 负责管理文件系统的命名空间及客户端对文件的访问。集群中的数据节点一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作。每个数据节点的数据实际上是保存在本地Linux文件系统中的。
很多数据节点放在不同的机架上面去,机架与机架之间是通过光纤高速连接,如果客户端要访问数据,首先和名称节点打交道,获取元数据信息,从而知道,被访问的数据到底存到哪些数据节点上面去了,获得数据块具体存储位置的信息以后,客户端就会跑到各个机器上面去获取它所需要的数据,这是读。写也是一样的,当我们需要写的时候,客户端也是先去问管家,问这个名称节点,这么一个大的文件1个TB2个TB,我要怎么写,名称节点会告诉它,要把这个文件分成多少个块,这个快要存到这个节点,那个快要存到那个节点,得到这个指令之后,客户端就会把相关的块存到相关数据节点上。

3.4.2 HDFS命名空间管理

在这里插入图片描述
• HDFS的命名空间包含目录、文件和块
• 在HDFS1.0体系结构中,在整个HDFS集群中只有一个命名空间,并且只有唯一一个名称节点,该节点负责对这个命名空间进行管理
• HDFS使用的是传统的分级文件体系,因此,用户可以像使用普通文件系统一样,创 建、删除目录和文件,在目录间转移文件,重命名文件等

3.4.3 通信协议

在这里插入图片描述
• HDFS是一个部署在集群上的分布式文件系统,因此,很多数据需要通过网络进行传输
• 所有的HDFS通信协议都是构建在TCP/IP协议基础之上的
• 客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与 名称节点进行交互
• 名称节点和数据节点之间则使用数据节点协议进行交互
• 客户端与数据节点的交互是通过**RPC(Remote Procedure Call)**来实现的。在设计上,名称节点不会主动发起RPC,而是响应来自客户端和数据节点的RPC请求

3.4.4 客户端

• 客户端是用户操作HDFS最常用的方式,HDFS在部署时都提供了客户端
• HDFS客户端是一个库,暴露了HDFS文件系统接口,这些接口隐藏了HDFS实现中的 大部分复杂性
• 严格来说,客户端并不算是HDFS的一部分
• 客户端可以支持打开、读取、写入等常见的操作,并且提供了类似Shell的命令行 方式来访问HDFS中的数据 • 此外,HDFS也提供了Java API,作为应用程序访问文件系统的客户端编程接口

3.4.5 HDFS体系结构的局限性

HDFS只设置唯一一个名称节点,这样做虽然大大简化了系统设计,但也带来了一些明显的局限性,具体如下:
(1)命名空间的限制:名称节点是保存在内存中的,因此,名称节点能够容纳的对象(文件、块)的个数会受到内存空间大小的限制。
(2)性能的瓶颈:整个分布式文件系统的吞吐量,受限于单个名称节点的吞吐量。
(3)隔离问题:由于集群中只有一个名称节点,只有一个命名空间,因此,无法对不同应用程序进行隔离。
(4)集群的可用性:一旦这个唯一的名称节点发生故障,会导致整个集群变得不可用。
冷备份就是不能保证,名称节点一发生故障它就顶上来
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 HDFS存储原理

3.5.1 冗余数据保存

在这里插入图片描述
通常是备份3份。
伪分布式名称节点与数据节点放在一起,只能有1份备份。
在这里插入图片描述
作为一个分布式文件系统,为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点 上,数据块1被分别存放到数据节点A和C上,数据块2被存放在数据节点A和B上。
在这里插入图片描述
这种多副本方式具有以下几个优点:
(1)加快数据传输速度 (2)容易检查数据错误 (3)保证数据可靠性
3个应用同时去三个机器上访问,并发执行。

3.5.2 数据存取策略

1.数据存放
Block的副本放置策略
在这里插入图片描述
两个机架,每个机架上3个节点。第一个块来了以后,复制3份。
•第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
•第二个副本:放置在与第一个副本不同的机架的节点上
•第三个副本:与第一个副本相同机架的其他节点上
•更多副本:随机节点
2. 数据读取
就近读取,凡是机架ID相同的就是说你们这些数据节点在同一个机架内,机架内部带宽高,它的通信是非常快的,代价很小
•HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
•当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID, 当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据

3.5.3 数据错误与恢复

HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态, 而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下几种情形:名称节点出错、数据节点出错和数据出错。
三四千个节点,肯定会有不同的机器出问题。

  1. 名称节点出错
    名称节点保存了所有的元数据信息,其中,最核心的两大数据结构是FsImage 和Editlog,如果这两个文件发生损坏,那么整个HDFS实例将失效。因此,HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时,就可以根据备份服务器SecondaryNameNode中的FsImage和 Editlog数据进行恢复。 HDFS1.0中的服务是要暂停一段事件的,它会把相关的元数据信息从第二名称节点上面恢复过来的。
    在这里插入图片描述
  2. 数据节点出错
    •每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态
    •如何判定数据节点出现问题?当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时,这些数据节点就会被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求 。
    然后把凡是存储在故障机上的数据,这时再重新复制分发到其他正常可用的机器上。那台故障机发生故障后,故障机上的数据肯定在其他机器上还有备份,名称节点作为管家,就可以把那些正常的数据再复制一份。
    •这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子
    •名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本
    •HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置 ,不仅是发生故障的时候可以调整,当负载发生严重不均衡的时候,会均衡调整。
    在这里插入图片描述
  3. 数据出错
    •网络传输和磁盘错误等因素,都会造成数据错误
    •客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据
    •在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面
    •当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块
    在这里插入图片描述

3.5 HDFS数据读写过程

3.5.1 读数据的过程

在这里插入图片描述
坏境配置变量
文件系统实例
路径:文件所在的HDFS目录url类型
输入流打开文件
在这里插入图片描述
•FileSystem是一个通用文件系统的抽象基类,可以被分布式文件系统继承,所有可能使用 Hadoop文件系统的代码,都要使用这个类
•Hadoop为FileSystem这个抽象类提供了多种具体实现
•DistributedFileSystem就是FileSystem在HDFS文件系统中的具体实现
•FileSystem的open()方法返回的是一个输入流FSDataInputStream对象,在HDFS文件系统中 ,具体的输入流就是DFSInputStream;FileSystem中的create()方法返回的是一个输出流 FSDataOutputStream对象,在HDFS文件系统中,具体的输出流就是DFSOutputStream。
在这里插入图片描述

Configuration conf = new Configuration(); //环境配置变量
FileSystem fs = FileSystem.get(conf); //文件对象实例,输入环境配置变量。Configuration的构造方法会默认把工程项目下面的两个配置文件加载出来
FSDataInputStream in = fs.open(new Path(uri)); 
FSDataOutputStream out = fs.create(new Path(uri)); 
  • 1
  • 2
  • 3
  • 4

备注:创建一个Configuration对象时,其构造方法会默认加载工程项目下两个配置文件,分别是 hdfs-site.xml以及core-site.xml,这两个文件中会有访问HDFS所需的参数值,主要是 fs.defaultFS,指定了HDFS的地址(比如hdfs://localhost:9000),有了这个地址客户端就可以通过这个地址访问HDFS了
总结:
在这里插入图片描述
HDFS客户端发起请求,第一步是打开一个文件,用FileSystem类声明一个实例对象 fs, FileSystem.get(conf);
执行这一步代码后,它就会对照它底层的HDFS去实现,它的抽象基类是FileSystem,由于添加了环境配置变量,由于添加了conf,分布式文件系统底层的配置就会被调用。调进来以后就生成一个属于它的子类,叫DistributedFileSystem,此时fs是属于HDFS的实例对象,fs是跟分布式文件系统紧密相关的,但是这在用户编写的代码中是看不出来的,底层的转化和封装过程是看不到的,都被整个Hadoop平台给屏蔽掉了,看不到背后的封装过程,用户只能看到FileSystem相关的输入流输出流,具体底层封装的HDFS输入输出流是看不到的,这是系统自动转化的。第一步打开文件就用这个方法。
打开文件就要创建一个输入流,因为我们要读取相关的数据,按照我们默认的编程方式,都是要先创建一个输入流,那么怎么创建呢?输入流类型是FsDataInputStream,这是客户端编写的时候要创建的输入流,比如:in=fs.open(new path(URI)),这个URI就是你输入的文件地址,hdfs:8080:…。这样子就把文件打开了,生成了一个文件对象,生成了输入流FsDataInputStream,在这个输入流里面封装了DFSInputStream,这是Hadoop平台后台给你封装的,不是你编程实现的,它自动会封装好。真正和名称节点打交道的是封装在里面的DFSInputStream。而用户在客户端编程的时候,只跟前面的FsDataInputStream打交道。
在这里插入图片描述
FsDataInputStream封装了DFSInputStream,这个DFSInputStream会和名称节点进行沟通,通过远程过程调用去沟通,为什么要沟通呢?因为要指导到底数据块被保存到哪些节点。因为要读取数据,就需要指导数据的地址,由DFSInputStream负责发起远程过程调用,通过ClientProtocol.getBlocklocations这个方法去查找下一个数据块,去询问名称节点,我要的数据到底被保存在哪个节点。那么名称节点会把文件的开始一部分位置信息,这个文件数据可能比较大,名称节点接到询问请求后,会把文件的开始一部分位置信息返回给刚才的调用。
在这里插入图片描述
拿到这个地址后做什么呢?客户端获得输入流FsDataInputStream,就可以开始调用read函数读取数据,因为刚才已经拿到了数据位置,名称节点已经返回了数据位置,而且不仅可以返回数据位置,还可以根据距离客户端的远近进行排序,排完序后再返回给客户端,客户端拿到位置信息后,在输入流中 执行read函数,读数据怎么读呢?哪个先读哪个后读,返回这么多数据节点,就选择距离客户端最近的数据节点去建立连接,然后去读数据。
 s
因为刚才已经选择最近的数据节点去读数据,第四步就是把数据从数据节点读到客户端,读完以后,FsDataInputStream要关闭和数据节点的连接。
在这里插入图片描述
和这个数据节点读完了,它有可能还有剩余数据没读完,因为这个文件可能非常大,我只读了一部分数据,第五步就是继续再去读剩余的数据,再让这个输入流通过ClientProtocal.getBLockLocations()查找下一个数据块,去询问名称节点,下一个数据被存到哪里去了。名称节点会把信息返回来,告诉输入流,下一个数据在哪个节点上去,又会给你返回一个数据节点列表,这些节点列表,同样是根据与客户端的距离远近进行排序,这个输入流获得了地址列表以后,继续通过read函数,又开始和那些节点建立连接。
在这里插入图片描述
依次循环往复不断地读,直到完成所有的数据块的读写。
在这里插入图片描述

在这里插入图片描述

3.5.2 写数据的过程

在这里插入图片描述

3.6 HDFS编程实践

3.7.1 HDFS常用命令

Hadoop提供了关于HDFS在Linux操作系统上进行文件操作的常用Shell命令以及Java API。同时还可以利用Web界面查看和管理Hadoop文件系统 备注:Hadoop安装成功后,已经包含HDFS和MapReduce,不需要额外安装。而 HBase等其他组件,则需要另外下载安装。
在学习HDFS编程实践前,我们需要启动Hadoop。执行如下命令:
在这里插入图片描述
进入它的目录,做初始化。
在这里插入图片描述
HDFS有很多shell命令,其中,fs命令可以说是HDFS最常用的命令。利用该命令可以 查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。该命令的用法为:
hadoop fs [genericOptions] [commandOptions]
备注:Hadoop中有三种Shell命令方式:
hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统
在这里插入图片描述
实例: hadoop fs -ls :显示 指定的文件的详细信息
hadoop fs -mkdir :创建 指定的文件夹
在这里插入图片描述
在这里插入图片描述
实例: hadoop fs -cat :将 指定的文件的内容输出到标准输出(stdout)
hadoop fs -copyFromLocal :将本地源文件复制到路径 指定的文件或文件夹中
在这里插入图片描述

3.7.2 HDFS的Web界面

使用web查看:
在这里插入图片描述
在配置好Hadoop集群之后,可以通过浏览器登录“http://[NameNodeIP]:50070”访 问HDFS文件系统
通过Web界面的“Browse the filesystem”查看文件 “hdfs://localhost/home/administrator/tempfile/file1.txt”

3.7.3 HDFS常用Java API及应用实例

利用Java API与HDFS进行交互
实例:利用hadoop 的java api检测伪分布式文件系统HDFS上是否存在某个文件?
准备工作:在Ubuntu系统中安装和配置Eclipse
第一步:放置配置文件到当前工程下面( eclipse工作目录的bin文件夹下面)
第二步:编写实现代码
利用Java API进行交互,可以使用软件Eclipse编写Java程序。
(1)在Ubuntu中安装Eclipse 利用Ubuntu左侧边栏自带的软件中心安装软件,在Ubuntu左侧边栏打开软件中心
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
为项目加载所需要用到的jar包
在这里插入图片描述
如何获取jar包 Java API所在的jar包都在已经安装好的hadoop文件夹里,路径: /usr/local/hadoop/share/hadoop(如果读者安装的hadoop不在此目录,请找到jar包所在 的文件夹)
在这里插入图片描述
在这里插入图片描述

编程实例 利用Hadoop 的Java API检测伪分布式文件系统HDFS上是否存在某个文件?
下面编写一个简单的程序来测试伪分布式文件系统HDFS上是否存在input.txt文件?
第一步:放置配置文件到当前工程下面 需要把集群上的core-site.xml和hdfs-site.xml(这两文件存在/hadoop/etc/hadoop目录 下)放到当前工程项目下,即eclipse工作目录的bin文件夹下面。
在这里插入图片描述
第二步:编写实现代码 import org.apache.hadoop
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
• 分布式文件系统是大数据时代解决大规模数据存储问题的有效解决方案,HDFS 开源实现了GFS,可以利用由廉价硬件构成的计算机集群实现海量数据的分布式 存储
• HDFS具有兼容廉价的硬件设备、流数据读写、大数据集、简单的文件模型、强 大的跨平台兼容性等特点。但是,也要注意到,HDFS也有自身的局限性,比如 不适合低延迟数据访问、无法高效存储大量小文件和不支持多用户写入及任意修 改文件等
• 块是HDFS核心的概念,一个大的文件会被拆分成很多个块。HDFS采用抽象的块 概念,具有支持大规模文件存储、简化系统设计、适合数据备份等优点
• HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点 和若干个数据节点。名称节点负责管理分布式文件系统的命名空间;数据节点是 分布式文件系统HDFS的工作节点,负责数据的存储和读取
• HDFS采用了冗余数据存储,增强了数据可靠性,加快了数据传输速度。HDFS还 采用了相应的数据存放、数据读取和数据复制策略,来提升系统整体读写响应性 能。HDFS把硬件出错看作一种常态,设计了错误恢复机制
• 本章最后介绍了HDFS的数据读写过程以及HDFS编程实践方面的相关知识

版权声明:本文为cainiao-chuanqi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/cainiao-chuanqi/p/13689546.html