Hadoop生态从0到1_理论篇_[HDFS|Yarn|MapReduce|Hive]_CodingPark编程公园

本文深入探讨了Hadoop生态系统,包括HDFS、YARN、MapReduce和Hive的基础知识和应用场景。HDFS是分布式文件系统,提供高容错性和大数据存储能力;YARN作为资源管理调度系统,解决了Hadoop1.0的扩展性和单点故障问题;MapReduce是处理大规模数据集的编程模型;Hive则为Hadoop提供了类SQL接口,简化了大数据查询和分析。此外,文章还介绍了Hadoop的安装模式、关键组件的工作原理和故障处理策略。
摘要由CSDN通过智能技术生成

文章介绍:

本文将带领你进入Hadoop的生态世界,本文为Hadoop生态从0到1_理论篇(7日连载),后期会推出Hadoop生态从0到1_实践篇(7日连载)

目录:

  1. 生态总体关系图
  2. Hadoop的诞生与繁荣【故事驱动】
  3. Hadoop必须知道的那些事儿
  4. HDFS (Hadoop Distributed File System 分布式文件系统)
  5. YARN (Yet Another Resource Negotiator资源管理调度系统)
  6. MapReduce
  7. Hive

生态总体关系图

大数据的分布式存储与计算
在这里插入图片描述

Hadoop系统整体架构V1
在这里插入图片描述

Hadoop系统整体架构V2
在这里插入图片描述
Hive - SQL/MR编译器
Pig - Pig-Latin/MR编译器
Zookeeper - 分布式协同调度和锁
Avro - 接口开发工具
HBase - 基于列簇的分布式
NoSQLFlume/NG/Scribe - 日志流汇总工具
Mahout - 基于MR的算法库
Drill/Impala - 内存SQL引擎,Dremel开源实现
Thrift - 接口开发工具
Sqoop - ETL工具
Oozie - 工作流


Hadoop的诞生与繁荣【故事驱动】

Doug Cutting(一位大牛)主导的Apache Nutch项目是Hadoop软件的源头,该项目始于2002年,是Apache Lucene 的子项目之一。

Google在2003年于SOSP上发表了分布式文件系统的论文“The Google File System”–> 2004年,Nutch的分布式文件系统(NDFS)开始开发。

2004年,Google在OSDI上发表了题为“MapReduce: Simplified Data Processing on Large Clusters”的论文 --> Doug Cutting等人开始实现MapReduce计算框架并与NDFS(Nutch Distributed File System)结合起来,共同支持Nutch的主要算法。

2006年,它逐渐成为一套完整而独立的软件,已经到Yahoo!工作的Doug Cutting将这套大数据处理软件命名为Hadoop。

2008年初,Hadoop成为Apache的顶级项目,除Yahoo!之外在众多互联网企业中得到应用。此时的Hadoop系统又称为Hadoop v1,主要由两个核心组件构成:HDFS和MapReduce。

一些围绕在Hadoop周围的开源项目,为完善大数据处理的全生命周期提供了必要的配套和补充。这些软件常用的有ZooKeeper、Hive、Pig、HBase、Storm、Kafka、Flume、Sqoop、Oozie、Mahout等。

2012年5月,Hadoop v2的alpha版本发布,其中最重要的变化是在Hadoop核心组件中增加了YARN(Yet Another Resource Negotiator)。YARN的出现是为了把计算框架与资源管理彻底分离开,解决Hadoop v1由此带来的扩展性差、单点故障和不能同时支持多种计算框架的问题。YARN对标的恰好就是Google的Borg系统。至此,Hadoop方才能够与Google的大数据平台比肩。

Hadoop也成为自Linux以来最成功的开源软件,没有之一。

2013年出现了Spark,在全面兼容Hadoop原有组件的基础上,Spark通过更多的利用内存处理大幅提高系统性能。
在这里插入图片描述


Hadoop必须知道的那些事儿

在这里插入图片描述

Hadoop系统的三种安装模式

  • 单机模式(默认)
    Hadoop系统默认启动运行模式,仅作体验MapReduce使用。

配置文件均为空,Hadoop完全运行在本地
此时的Hadoop系统仅仅是一个独立的Java进程
不需要与其他节点交互,单机模式就不使用HDFS,也不加载任何其他Hadoop的守护进程
该模式主要用于开发调试MapReduce程序的应用逻辑

  • 伪分布式
    使用多个守护线程模拟分布的伪分布运行模式

在“单节点集群”上运行Hadoop,其中所有的守护进程都运行在同一台机器上。
该模式在单机模式之上增加了代码调试功能,允许你检查内存使用情况,HDFS输入输出,以及其他的守护进程交互。

  • 完全分布式
    就是真正多台机器来搭建分布式集群

Hadoop系统中的所有守护进程分别运行在一个集群中的不同机器上。
几个重要的配置文件:
core-site.xml 配置HDFS节点名称和地址
hdfs-site.xml 配置HDFS存储目录,复制数量
mapred-site.xml 配置mapreduce的jobtracker地址

⚠️jobtracker是Hadoop1.0时的叫法,SourceManager是Hadoop2.0的叫法。
⚠️jobtracker&SourceManager 均为MapReduce中的组件。

Hadoop各进程启动命令(三种启动方式)

1.🚩直接启动或者关闭所有的进程(不推荐,由于分布式下,namenode和datanode分布在不同机器上,启动的进程不相同)

在启动hadoop进程的时候我们通常都是直接使用(默认hadoop根目录下) 

 >     sbin/start-all.sh 

 >     sbin/stop-all.sh

但是有时候直接启动进程并不完整,我们就需要使用单独的命令

2.🚩分模块启动(推荐)

2.1.启动和关闭 namenode,secondaryNamenode和datenode (启动hdfs)

 >   sbin/start-dfs.sh      sbin/stop-dfs.sh

2.2启动yarn

 >   sbin/start-yarn.sh     sbin/stop-yarn.sh

3.🚩各个节点单独启动

1. 单独启动namenode守护进程

  sbin/hadoop-daemons.sh start namenode

2. 单独启动DataNode守护进程

   sbin/hadoop-daemons.sh start datanode

3. 单独启动SecondaryNameNode 守护进程

   sbin/hadoop-daemons.sh start SecondaryNameNode  

4.开启resourcemanager

   sbin/yarn-daemon.sh start resourcemanager

5.开启nodemanager

    sbin/yarn-daemons.sh start nodemanager 

 6.启动historyserver

    sbin/mr-historyserver-dameon.sh start /stop historyserver


HDFS

首先放一张简易但清晰的图表明HDFS在Hadoop系统的位置
在这里插入图片描述

什么是HDFS?

Hadoop Distributed File System

Hadoop Distributed File System (HDFS) is the primary storage system used by Hadoop applications.

HDFS creates multiple replicas of data blocks and distributes them on compute nodes throughout a cluster to enable reliable, extremely rapid computations.

HDFS简介

HDFS为了做到可靠性(reliability)创建了多份数据块(data blocks)的复制(replicas),并将它们放置在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。
在这里插入图片描述

HDFS能做什么

存储并管理PB级数据
处理非结构化数据
注重数据处理的吞吐量(latency不敏感)
write-once-read-many存取模式
任何一个节点失效,不影响HDFS服务
HDFS可以自动完成副本的复制

HDFS不适合做什么

存储小文件 (不建议使用)
大量的随机读 (不建议使用)
需要对文件的修改 (不支持)

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

物理部署图

在这里插入图片描述

HDFS系统架构

在这里插入图片描述

HDFS中的数据存储

在这里插入图片描述

HDFS中的文件

文件切分成块(默认大小64M(Hadoop1) )(默认大小128M(Hadoop2)),以块(block)为单位,每个块有多个副本存储在不同的机器(node)上,副本数可在文件生成时指定(默认3)。

NameNode是主节点,存储文件的元数据如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表以及块所在的DataNode等等

DataNode在本地文件系统存储文件块数据,以及块数据的校验和

可以创建、删除、移动或重命名文件,当文件创建、写入和关闭之后不能修改文件内容。
在这里插入图片描述

HDFS — NameNode

Namenode是一个中心服务器,单一节点(简化系统的设计和实现),负责管理文件系统的名字空间(namespace)以及客户端对文件的访问。

文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过NameNode,只会询问它跟那个DataNode联系,否则NameNode会成为系统的瓶颈

⚠️NameNode 一般情况是独立存在于一个物理机中

副本存放在那些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低带块消耗和读取时延

Namenode全权管理数据块的复制,它周期性地从集群中的每个Datanode接收心跳信号和块状态报告(Blockreport)。接收到心跳信号意味着该Datanode节点工作正常。块状态报告包含了该Datanode上所有数据块的列表。

HDFS — DataNode

一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。

DataNode启动后向NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。
心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode 的心跳,则认为该节点不可用。

集群运行中可以安全加入和退出一些机器

Namenode 和 Secondary Namenode

Secondary Namenode可以理解成是NameNode的一个热备(备份)
在这里插入图片描述
在这里插入图片描述

HDFS Data Writing

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

HDFS Data Reading

在这里插入图片描述

HDFS文件校验

在文件创立时,每个数据块都产生校验和
校验和保存在.meta文件内
客户端获取数据时可以检查校验和是否相同,从而发现数据块是否损坏
如果正在读取的数据块损坏,则可以继续读取其它副本

HDFS文件压缩

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

HDFS回收站

删除文件时,其实是放入回收站/trash
回收站里的文件可以快速恢复
可以设置一个时间阈值,当回收站里文件的存放时间超过这个阈值,就被彻底删除,并且释放占用的数据块
☑️shell如果有回收站,会首先放入回收站,然而java代码默认可不放入
🚩回收站配置(每个节点)
在这里插入图片描述
java代码
在这里插入图片描述
在这里插入图片描述

HDFS—HA高可用

1)所谓HA(high available),即高可用(7*24小时不中断服务)。
2)实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA
机制:HDFS的HA和YARN的HA。
3)Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。
4)NameNode主要在以下两个方面影响HDFS集群
NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启
NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用
🚩HDFS HA有 手动切换|自动切换

详细讲解 https://edu.csdn.net/course/play/1409/22250

HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。
在这里插入图片描述

代码实例-直接用JAVA作用于HDFS

package hdfs;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.apache.jasper.tagplugins.jstl.core.ForEach;

import com.cedarsoftware.util.IOUtilities;

public class app1 {
   
	
	public static void main(String[] args) throws IOException, URISyntaxException  {
   
		FileSystem fileSystem = FileSystem.get(new URI("hdfs://icaa:9000"), new Configuration()); // fileSystem抽象类
		System.out.println("fileSystem -> "+ fileSystem);		//其实这里是fileSystem.toString
		System.out.println("fileSystem.getClass -> "+ fileSystem.getClass());		
		
		/*
		 * 
		 * 创建文件夹📁
		 * 
		 * */	
		// 创建文件夹mkdir
		fileSystem.mkdirs(new Path("/dir1"));
		// 创建文件夹mkdir	(多用户)
		fileSystem.mkdirs(new Path("mydir"));
		// 创建文件夹mkdir	 (两个参数->位置,参数)
		fileSystem.mkdirs(new Path("/dir2"), new FsPermission("111"));
		
		/*
		 * 
		 * 上传文件
		 * 
		 * */	
		// FSDatainputStream 输入流
		FileInputStream in1 = new FileInputStream("/root/Downloads/hello");
		
		// 上传文件creat
		// FSDataOutputStream 输出流
		// replication副本	// 这里数字单位:字节  //💡command➕1 是创建变量的快捷键
		// 我写的这个是自定义话比较强的, 如果想用默认,则可使用fileSystem.create(new Path(""));
		FSDataOutputStream out1 = fileSystem.create(new Path("/dir1/file1"), true, 1024000, (short)2, 1048576);
		// 从in进入后 利用IOUtils 进行类似while的工作 给到out
		IOUtils.copyBytes(in1, out1, 1024, true);
		
		
		/*
		 * 换一种方法 	// Progressable 表示进程  想看到进程
		 * */
		final AtomicInteger writeBytes = new AtomicInteger(0);	//writeBytes来看看进程 =进度条
		FSDataOutputStream out2 = fileSystem.create(new Path("/dir1/file2"), new Progressable() {
   
			// Progressable 表示进程
			@Override
			public void progress() {
   
				// TODO Auto-generated method stub
				System.out.println("writeBytes -> "+ writeBytes.get());
			}
		});
		
		FileInputStream in2 = new FileInputStream("/root/Downloads/hello");
		byte[] buffer = new byte[4];
		int readBytes = in2.read(buffer);
		while(readBytes!=-1) {
   
			out2.write(buffer);
			out2.flush();
			out2.hsync();
			writeBytes.addAndGet(readBytes);
			readBytes = in2.read(buffer);
			
		}
		
		
		/*
		 * 
		 * 读取数据
		 * 
		 * */
		FSDataInputStream in = fileSystem.open(new Path("/dir1/file1"));
		IOUtils.copyBytes(in, System.out, 1024, true);
		
		/*
		 * 
		 * 查看数据分布也就在那个结点上 用到了 遍历
		 * 
		 * */
		// 遍历
		FileStatus[] listStatus = fileSystem.listStatus(new Path("/"));
		for(FileStatus fileStatus:listStatus) {
   
			System.out.println(fileStatus);
		}
		// 查看数据分布结点
		FileStatus[] listStatus2 = fileSystem.listStatus(new Path("/"));
		for(FileStatus fileStatus:listStatus2) {
   
			System.out.println(fileStatus);
			if (!fileStatus.isDirectory()) {
   
				BlockLocation[] fileBlockLocations = fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
				for(BlockLocation blockLocation:fileBlockLocations) {
   
					String[] hosts = blockLocation.getHosts();
					for (String hostname : hosts) {
   
						System.out.println("HOST NAME -> "+ hostname);
					}			
				}			
			}
			
		}
		
		
		/*
		 * 
		 * 其他
		 * 
		 * */
		// 遍历
		FileStatus[] listStatus3 = fileSystem.listStatus(new Path("/"));
		for(FileStatus fileStatus:listStatus3) {
   
			System.out.println(fileStatus);
		}
		
		// 删除
		//fileSystem.delete(arg0, arg1);	没有举例
		
		
		//获取工作目录
		//fileSystem.getWorkingDirectory().toString();	没有举例
		
		
	}

}

更多关于HDFS

https://blog.csdn.net/penggougoude/article/details/82357005


YARN

YARN 是怎么来的呢?那首先得从Hadoop1.0的缺陷说起

Hadoop1.0的缺陷

单点故障:MR的JobTracker和HDFS的NameNode两个核心服务均存在单点问题

模型单一:只能用MapReduce处理数据,迭代计算、图计算同样有大数据的处理场景。MR本质上是面向批处理的,并不支持实时或接近实时的处理请求。

低可拓展性:雅虎的Hadoop集群不超过4000个节点。

服务器利用率:JobTracker将管理集群视为很多的Map/Reduce槽(slot),然而在MR用运行的时候,大多数时候都是reduce槽在等待map槽完成(map 100% reduce 0%)。

使用灵活性:部分升级,全部需要升级。

YARN诞生

Hadoop 2.0:由HDFS、MapReduce和YARN三个组建构成;
MapReduce:运行在YARN上的MR
YARN(Yet Another Resource Negotiator):资源管理系统
在这里插入图片描述

Yarn的架构

在这里插入图片描述

YARN运行流程

在这里插入图片描述

  • ResourceManager

整个集群只有一个 , 负责集群资源的统一管理和调度
详细功能:
处理客户端请求
启动/ 监控ApplicationMaster
监控NodeManager
资源分配与调度

  • NodeManager

整个集群有多个 ,负责单节点资源管理和使用
详细功能:
单个节点上的资源管理和任务管理
处理来自ResourceManager 的命令
处理来自ApplicationMaster 的命令

  • ApplicationMaster

每个应用有一个 , 负责应用程序的管理
详细功能:
数据切分
为应用程序申请资源 , 并进一步分配给内部任务
任务监控与容错

  • Container

对任务运行环境的抽象
描述一系列信息
任务运行资源(节点 、 内存 、CPU )
任务启动命令
任务运行环境

YARN的容错性

ResourceManager
 存在单点故障
正在基于ZooKeeper 实现HA

NodeManager
失败后 ,RM 将失败任务告诉对应的AM
AM 决定如何处理失败的任务

ApplicationMaster
失败后 , 由RM 负责重启
AM 需处理内部任务的容错问题
 RMAppMaster 会保存已经运行完成的Task

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TEAM-AG

编程公园:输出是最好的学习方式

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值