md笔记
Hadoop介绍
狭义上Hadoop指的是Apache软件基金会的一款开源软件。
用java语言实现,开源 允许用户使用简单的编程模型实现跨机器集群对海量数据进行分布式计算处理
Hadoop核心组件
Hadoop HDFS(分布式文件存储系统):解决海量数据存储
Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
Hadoop MapReduce(分布式计算框架):解决海量数据计算
官网 http://hadoop.apache.org
广义上Hadoop指的是围绕Hadoop打造的大数据生态圈
Hadoop发展简史
Hadoop之父:Doug Cutting
Hadoop起源于Apache Lucene子项目:
Nutch Nutch的设计目标是构建一个大型的全网搜索引擎。
遇到瓶颈:如何解决数十亿网页的存储和索引问题
Google三篇论文
《The Google file system》:谷歌分布式文件系统GFS
《MapReduce: Simplified Data Processing on Large Clusters》:谷歌分布式计算框架MapReduce
《Bigtable: A Distributed Storage System for Structured Data》:谷歌结构化数据存储系统
Hadoop现状
Hadoop特性优点
扩容能力(scalability)
Hadoop是在可用的计算机集群间分配 数据并完成计算任务的,这些集群可方便灵活的方式扩展到数以千计的节点。
成本低(economical)
Hadoop集群允许通过部署普通廉价的机 器组成集群来处理大数据,以至于成本很低。看重的是集群整体能力
效率高(efficiency)
通过并发数据,Hadoop可以在节点之间动态并行的移动数据,使得速度非常快。
可靠性(reliability)
能自动维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。所以Hadoop的按位存储和处理数据的能力值得人们信赖。
Hadoop架构变迁(1.0-2.0变迁)
Hadoop 1.0
HDFS(分布式文件存储) MapReduce(资源管理和分布式数据处理)
Hadoop 2.0
HDFS(分布式文件存储) MapReduce(分布式数据处理) YARN(集群资源管理、任务调度)
Hadoop 3.0架构组件和Hadoop 2.0类似,3.0着重于性能优化。
通用方面
精简内核、类路径隔离、shell脚本重构
Hadoop HDFS
EC纠删码、多NameNode支持
Hadoop MapReduce
任务本地化优化、内存参数自动推断
Hadoop YARN
Timeline Service V2、队列配置
Hadoop集群整体概述
Hadoop集群简介
逻辑上分离
两个集群互相之间没有依赖、互不影响
物理上在一起
某些角色进程往往部署在同一台物理服务器上
MapReduce集群呢?
MapReduce是计算框架、代码层面的组件没有集群之说
Hadoop集群搭建(Hadoop集群分布式安装)
Step1:集群角色规划
根据软件工作特性和服务器硬件资源情况合理分配
比如依赖内存工作的NameNode是不是部署在大内存机器上?
资源上有抢夺冲突的,尽量不要部署在一起
工作上需要互相配合的。尽量部署在一起
服务器 | 运行角色 |
---|---|
node1 | namenode datanode resourcemanager nodemanager |
node2 | secondarynamenode datanode nodemanager |
node3 | atanode nodemanager |
Step2:服务器基础环境准备
主机名(3台机器) vim /etc/hostname
node1
node2
node3
设置静态IP
node1:
UUID="08d531cc-32bb-4c25-b146-566ad30307af"
IPADDR="192.168.88.131"
node2:
UUID="08d531cc-32bb-4c25-b147-566ad30307af"
IPADDR="192.168.88.132"
node3:
UUID="08d531cc-32bb-4c25-b148-566ad30307af"
IPADDR="192.168.88.133"
Hosts映射(3台机器) vim /etc/hosts
192.168.88.131 node1
192.168.88.132 node2
192.168.88.133 node3
防火墙关闭(3台机器)
systemctl stop firewalld.service #关闭防火墙
systemctl disable firewalld.service #禁止防火墙开启自启
ssh免密登录(node1执行->node1|node2|node3)
ssh-keygen #4个回车 生成公钥、私钥
ssh-copy-id node1、ssh-copy-id node2、ssh-copy-id node3 #
集群时间同步(3台机器)
yum -y install ntpdate
ntpdate ntp4.aliyun.com
创建统一工作目录(3台机器)
mkdir -p /export/server/ #软件安装路径
mkdir -p /export/data/ #数据存储路径
mkdir -p /export/software/ #安装包存放路径
Step3:上传安装包、解压安装包
Step4:Hadoop安装包目录结构
目录 | 说明 |
---|---|
bin | Hadoop最基本的管理脚本和使用脚本的目录,这些脚本是sbin目录下管理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop。 |
etc | Hadoop配置文件所在的目录 |
include | 对外提供的编程库头文件(具体动态库和静态库在lib目录中),这些头文件均是用C++定义的,通常用于C++程序访问HDFS或者编写MapReduce程序。 |
lib | 该目录包含了Hadoop对外提供的编程动态库和静态库,与include目录中的头文件结合使用。 |
libexec | 各个服务对用的shell配置文件所在的目录,可用于配置日志输出、启动参数(比如JVM参数)等基本信息。 |
sbin | Hadoop管理脚本所在的目录,主要包含HDFS和YARN中各类服务的启动/关闭脚本。 |
share | Hadoop各个模块编译后的jar包所在的目录,官方自带示例。 |
配置文件概述
官网文档:https://hadoop.apache.org/docs/r3.3.0/
第一类1个:hadoop-env.sh
第二类4个:
xxxx-site.xml ,site表示的是用户定义的配置,会覆盖default中的默认配置。
core-site.xml 核心模块配置 hdfs-site.xml hdfs文件系统模块配置
mapred-site.xml MapReduce模块配置
yarn-site.xml yarn模块配置
第三类1个:workers
所有的配置文件目录:/export/server/hadoop-3.3.0/etc/hadoop
修改配置文件(配置文件路径 hadoop-3.3.0/etc/hadoop)
hadoop-env.sh
#文件最后添加
export JAVA_HOME=/export/server/jdk1.8.0_241
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
core-site.xml
<property>
<name>fs.defaultFSname>
<value>hdfs://node1:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/export/data/hadoop-3.3.0value>
property>
<property>
<name>hadoop.http.staticuser.username>
<value>rootvalue>
property>
<property>
<name>hadoop.proxyuser.root.hostsname>
<value>*value>
property>
<property>
<name>hadoop.proxyuser.root.groupsname>
<value>*value>
property>
<property>
<name>fs.trash.intervalname>
<value>1440value>
property>
hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>node2:9868value>
property>
mapred-site.xml
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>mapreduce.jobhistory.addressname>
<value>node1:10020value>
property>
<property>
<name>mapreduce.jobhistory.webapp.addressname>
<value>node1:19888value>
property>
<property>
<name>yarn.app.mapreduce.am.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
<property>
<name>mapreduce.map.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
<property>
<name>mapreduce.reduce.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
yarn-site.xml
<property>
<name>yarn.resourcemanager.hostnamename>
<value>node1value>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.nodemanager.pmem-check-enabledname>
<value>falsevalue>
property>
<property>
<name>yarn.nodemanager.vmem-check-enabledname>
<value>falsevalue>
property>
<property>
<name>yarn.log-aggregation-enablename>
<value>truevalue>
property>
<property>
<name>yarn.log.server.urlname>
<value>http://node1:19888/jobhistory/logsvalue>
property>
<property>
<name>yarn.log-aggregation.retain-secondsname>
<value>604800value>
property>
workers
node1
node2
node3
分发同步hadoop安装包
cd /export/server
scp -r hadoop-3.3.0 root@node2:$PWD
scp -r hadoop-3.3.0 root@node3:$PWD
将hadoop添加到环境变量(3台机器)
vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
source /etc/profile
#别忘了scp给其他两台机器哦
Hadoop集群启动
(首次启动)格式化namenode
hdfs namenode -format
脚本一键启动
[root@node1 ~]# start-dfs.sh
Starting namenodes on [node1]
Last login: Thu Nov 5 10:44:10 CST 2020 on pts/0
Starting datanodes
Last login: Thu Nov 5 10:45:02 CST 2020 on pts/0
Starting secondary namenodes [node2]
Last login: Thu Nov 5 10:45:04 CST 2020 on pts/0
[root@node1 ~]# start-yarn.sh
Starting resourcemanager
Last login: Thu Nov 5 10:45:08 CST 2020 on pts/0
Starting nodemanagers
Last login: Thu Nov 5 10:45:44 CST 2020 on pts/0
Web UI页面
错误1:运行hadoop3官方自带mr示例出错。
错误信息
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Please check whether your etc/hadoop/mapred-site.xml contains the below configuration:
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${full path of your hadoop distribution directory}</value>
</property>
解决 mapred-site.xml,增加以下配置
<property>
<name>yarn.app.mapreduce.am.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
<property>
<name>mapreduce.map.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
<property>
<name>mapreduce.reduce.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
Hadoop集群启停
每台机器上每次手动启动关闭一个角色进程,可以精准控制每个进程启停,避免群起群停。
HDFS集群
#hadoop2.x版本命令
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
#hadoop3.x版本命令
hdfs --daemon start|stop namenode|datanode|secondarynamenode
YARN集群
#hadoop2.x版本命令
yarn-daemon.sh start|stop resourcemanager|nodemanager
#hadoop3.x版本命令
yarn --daemon start|stop resourcemanager|nodemanager
shell脚本一键启停
HDFS集群
YARN集群
地址:http://resourcemanager_host:8088 其中resourcemanager_host是resourcemanager运行所在机器的主机名或者ip 如果使用主机名访问,别忘了在Windows配置hosts
文件系统定义
传统常见的文件系统
数据、元数据
海量数据存储遇到的问题
成本高
传统存储硬件通用性差,设备投资加上后期维护、升级扩容的成本非常高。
如何支撑高效率的计算分析
传统存储方式意味着数据:存储是存储,计算是计算,当需要处理数据的时候把数据移动过来。
程序和数据存储是属于不同的技术厂商实现,无法有机统一整合在一起。
性能低
单节点I/O性能瓶颈无法逾越,难以支撑海量数据的高并发高吞吐场景。
可扩展性差
无法实现快速部署和弹性扩展,动态扩容、缩容成本高,技术实现难度大。
一、分布式存储的优点
问题:数据量大,单机存储遇到瓶颈
解决:
单机纵向扩展:磁盘不够加磁盘,有上限瓶颈限制
多机横向扩展:机器不够加机器,理论上无限扩展
二、元数据记录的功能
问题:文件分布在不同机器上不利于寻找
解决:元数据记录下文件及其存储位置信息,快速定位文件位置
三、分块存储好处
问题:文件过大导致单机存不下、上传下载效率低
解决:文件分块存储在不同机器,针对块并行操作提高效率
四:副本机制的作用
问题:硬件故障难以避免,数据易丢失
解决:不同机器设置备份,冗余存储,保障数据安全
HDFS简介
HDFS(Hadoop Distributed File System ),意为: Hadoop分布式文件系统 。是Apache Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。也可以说大数据首先要解决的问题就是海量数据的存储问题。
HDFS主要是解决大数据如何存储问题的。分布式意味着是HDFS是横跨在多台计算机上的存储系统。
HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据(比如TB 和PB)。
HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。
HDFS设计目标
硬件故障(Hardware Failure)是常态,HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此 故障检测和自动快速恢复 是HDFS的核心架构目标。
HDFS上的应用主要是以流式读取数据(Streaming Data Access)。HDFS被设计成 用于批处理 ,而不是用户交互式的。相较于数据访问的反应时间,更 注重数据访问的高吞吐量 。
典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成 支持大文件(Large Data Sets) 。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
大部分HDFS应用对文件要求的是 write-one-read-many 访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
HDFS被设计为可从一个平台轻松移植到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。
HDFS应用场景
适合场景
大文件
数据流式访问
一次写入多次读取
低成本部署,廉价PC
高容错
不适合场景
小文件
数据交互式访问
频繁任意修改
低延迟处理
HDFS重要特性
( 1 )主从架构
HDFS集群是标准的master/slave主从架构集群。
一般一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
Namenode是HDFS主节点,Datanode是HDFS从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
官方架构图中是一主五从模式,其中五个从角色位于两个机架(Rack)的不同服务器上。
( 2 )分块存储
HDFS中的文件在物理上是分块存储(block)的,默认大小是128M( 134217728 ),不足128M则本身就是一块。
块的大小可以通过配置参数来规定,参数位于hdfs-default.xml中:dfs.blocksize。
( 3 )副本机制
( 4 )元数据管理
在HDFS中,Namenode管理的元数据具有两种类型:
( 5 )namespace
HDFS支持传统的层次型文件组织结构。用户可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode负责维护文件系统的namespace名称空间,任何对文件系统名称空间或属性的修改都将被Namenode记录下来。
HDFS会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
( 6 )数据块存储
HDFS shell命令行解释说明
介绍
文件系统协议
区别
HDFS shell命令行常用操作
1 、创建文件夹
2 、查看指定目录下内容
3 、上传文件到HDFS指定目录下
4 、查看HDFS文件内容
5 、下载HDFS文件
6 、拷贝HDFS文件
7 、追加数据到HDFS文件中
8 、HDFS数据移动操作
命令官方指导文档
https://hadoop.apache.org/docs/r3.3.0/hadoop-project-dist/hadoop-common/FileSystemShell.html
HDFS集群角色与职责
主角色:namenode
NameNode 是Hadoop分布式文件系统的核心,架构中的主角色。
NameNode维护和管理文件系统元数据 ,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。
基于此,NameNode成为了访问HDFS的唯一入口。
NameNode内部通过内存和磁盘文件两种方式管理元数据。
其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和edits log(Journal)编辑日志。
从角色:datanode
主角色辅助角色: secondarynamenode
namenode职责
datanode职责
写数据完整流程图
核心概念–Pipeline管道
Pipeline,中文翻译为管道。这是HDFS在上传文件写数据过程中采用的一种数据传输方式。
客户端将数据块写入第一个数据节点,第一个数据节点保存数据之后再将块复制到第二个数据节点,后者保存后将其复制到第三个数据节点。
为什么datanode之间采用pipeline线性传输,而不是一次给三个datanode拓扑式传输呢?
因为数据以管道的方式,顺序的沿着一个方向传输,这样能够充分利用每个机器的带宽,避免网络瓶颈和高延迟时的连接,最小化推送所有数据的延时。
在线性推送模式下,每台机器所有的出口宽带都用于以最快的速度传输数据,而不是在多个接受者之间分配宽带。
核心概念–ACK应答响应
核心概念–默认 3 副本存储策略
默认副本存储策略是由BlockPlacementPolicyDefault指定。
第一块副本:优先客户端本地,否则随机
第二块副本:不同于第一块副本的不同机架。
第三块副本:第二块副本相同机架不同机器。
1 、HDFS客户端创建对象实例DistributedFileSystem, 该对象中封装了与HDFS文件系统操作的相关方法。
2 、调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件。NameNode执行各种检查判断:目标文件是否存在、父目录是否存在、客户端是否具有创建该文件的权限。检查通过,NameNode就会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据。
3 、客户端通过FSDataOutputStream输出流开始写入数据。
4 、客户端写入数据时,将数据分成一个个数据包( packet 默认64k ),内部组件 DataStreamer 请NameNode挑选出适合存储数据副本的一组DataNode地址,默认是 3 副本存储。
DataStreamer将数据包流式传输到 pipeline 的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并且发送给第三个(也是最后一个)DataNode。
5 、传输的反方向上,会通过ACK机制校验数据包传输是否成功;
6 、客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭。
7 、DistributedFileSystem联系NameNode告知其文件写入完成,等待NameNode确认。
因为namenode已经知道文件由哪些块组成(DataStream请求分配数据块),因此仅需等待最小复制块即可成功返回。最小复制是由参数dfs.namenode.replication.min指定,默认是1.
读数据完整流程图
1 、HDFS客户端创建对象实例DistributedFileSystem, 调用该对象的open()方法来打开希望读取的文件。
2 、DistributedFileSystem使用RPC调用namenode来确定 文件中前几个块的块位置(分批次读取)信息 。
对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的网络拓扑距离近的排序靠前。
3 、DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据。
4 、客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()。
5 、当该块结束时,FSDataInputStream将关闭与DataNode的连接,然后寻找下一个block块的最佳datanode位置。这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流。客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。
6 、一旦客户端完成读取,就对FSDataInputStream调用close()方法。