目录
初识
分布式与集群
分布式:多台机器,每台机器上部署不同组件
集群:多台,每台机器部署相同组件
hadoop集群分两个:HDFS集群 YARN集群
HDFS YARN MapReduce
HDFS:分布式文件存储系统
YARN:集群资源管理和任务带哦都框架,解决资源任务调度
MapReduce:分布式计算框架:解决海量数据计算
HDFS集群 YARN集群
HDFS主:NameNode 从:DateNode 主辅:SecondaryNameNode
YARN主:ResourceManager 从:NodeManager
(每个框都是进程java)
分布式存储系统
文件系统:数据 元数据(文件大小、最后修改时间、用户等信息)
属性:分布式存储(横向延申) 元数据记录(记录了每个文件在那个机器上)分块存储(针对性高) 副本机制
安装部署
下载 编译
下载hadoop-3.3.0-......
(编译好的)
集群角色规划
(上图)
服务器基础环境配置
主机名
cat /etc/hostname
hosts映射
vim /etc/hosts
关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
ssh免密登陆
(100上)ssh-keyen(生成公钥、私钥)
ssh-copy-id 主机1、2、3 (复制到其他机器)
时间同步(所有机器执行)
yum -yinstall ntpdate
ntpdate ntp4.aliyun.com
创建统一工作目录(所有机器执行)
mkdir -p /export/server/(软件安装路径)
mkdir -p /export/date/(数据存储路径)
mkdir -p /export/software(安装包存储路径)
安装JDK(所有机器)
安装到/export/server/下(文件安装包在D盘easy)
tar -zxvf jdk-8u241-linux(解压)
可rm原安装包
配置环境变量
vim /etc/profile
最后加上
export JAVA_HOME=/export/server/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile(重新加载)
java -version(验证是否安装成功)
scp -r /export/server/jdk1.8.0_241/ 用户名@ip:/export/server/(拷贝,剩下机器都操作)
scp /etc/profile 用户@ip:/etc/(拷贝环境变量)
source /etc/profile(所有机器)
java -version(验证是否安装成功 所有)
安装包结构
hadoop上传解压
cd /export/server/
上传文件
tar -zxvf hadoop......(解压)
rm安装包 cd进去
安装包结构
bin:Hadoop最基本的管理脚本和使用脚本的目录,这些脚本是sbin目录下管
理脚本的基础实现,用户可以直接使用这些脚本管理和使用Hadoop
etc:Hadoop配置文件所在的目录
sbin:Hadoop管理脚本所在的目录,主要包含HDFS和YARN中各类服务的启动/
关闭脚本
share:Hadoop各个模块编译后的jar包所在的目录,官方自带示例
修改配置文件同步安装包与环境变量
cd /export/server/hadoop-3.3.0/etc/hadoop(所有配置文件都在)
hadoop-env.sh
#文件最后添加
#指定java路径
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(核心配置文件)
两个(config.....中间)
<!-- 设置默认使用的文件系统 Hadoop支持file、HDFS、GFS、ali|Amazon云等文件系统 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node1:8020</value>
</property>
<!-- 设置Hadoop本地保存数据路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/export/data/hadoop-3.3.0</value>
</property>
<!-- 设置HDFS web UI用户身份 -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!-- 整合hive 用户代理设置 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!-- 文件系统垃圾桶保存时间 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
hdfs-site.xml(hdfs文件系统模块配置)
两个(config.....中间)
<!-- 设置SNN进程运行机器位置信息 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node2:9868</value>
</property>
mapred-site.xml(MapReduce模块配置)
<!-- 设置MR程序默认运行模式: yarn集群模式 local本地模式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MR程序历史服务地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>node1:10020</value>
</property>
<!-- MR程序历史服务器web端地址 -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node1:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
同上
yarn-site.xml(yarn模块配置)
<!-- 设置YARN集群主角色运行机器位置 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node1</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 是否将对容器实施物理内存限制 -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!-- 是否将对容器实施虚拟内存限制。 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 开启日志聚集 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 设置yarn历史服务器地址 -->
<property>
<name>yarn.log.server.url</name>
<value>http://node1:19888/jobhistory/logs</value>
</property>
<!-- 历史日志保存的时间 7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
(同上,删除两个中间的注释)
vim workers
node1.itcast.cn
node2.itcast.cn
node3.itcast.cn
替换原内容
分发同步hadoop安装包
cd /export/server
scp -r hadoop-3.3.0 root@ip:$PWD
scp -r hadoop-3.3.0 root@ip:$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 /etc/profile 主机名:/etc/
source /etc/profile(所有机器)
hadoop(所有,验证)
format初始化操作
格式化 (初始化只能一此不能多次)
hdfs namenode -format
验证(出现这句话成功)
成功
集群启停命令
手动逐个进程启停
可以精准控制每个进程启停
HDFS
hadoop2.0版本
hadoop-daemon.sh start|stop namenode|datanode|secondarynamenode
hadoop3.0版本
hdfs --daemon start|stop name|datanode|secondarynamenode
YARN集群
hadoop2.0版本
yarn-daemon.sh start|stop resourcemanager|nodemanager
hadoop3.0版本
yarn --daemon start|stop resourcemanager|nodemanager
shell脚本一键启停
(前提:配置好机器间的 SSH免密 和workers文件)
HDFS集群
start-dfs.sh
stop-dfs.sh
YARN集群
start-yarn.sh
stop-yarn.sh
Hadoop集群(全的)
start-all.sh
stop-all.sh
(启动一下 用jps命令验证是否成功(验证所有))
进程状态日志查看(网页)
启动完毕后可以用
jps命令查看
Hadoop启动日志路径:/export/server/hadoop-3.3.0/logs/
官方提供的web页面
HDFS
地址:http://namenode_host:9870 (最常用上面绿框Utilities Browse)(主机名:9870)
输入的是node1:9870(第一台机器)
YARN
resourcemanager_host:8088(主机名:8088)
node1:8088
体验
(HDFS)
hadoop fs -ls /
hadoop fs -mkdir /itcast(到9870上查看Browse可观察目录详细信息)
hadoop fs -put 本地文件 路径(上传文件到集群)
也可在web页面上进行操作
创建新目录
上传windows文件
(MapReduce)
cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce/
hadoop jar hadoop-mapreduce-examples-3.3.0 jar pi 2 2(用官方示例计算圆周率)
8088刷新
家目录下创建文件随便输入内容(统计单词出现次数)
hadoop fs -mkdir -p /wordcount/input
hadoop fs -put 文件 /wordcount/input
cd /export/server/hadoop-3.3.0/share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-3.3.0 jar wordcount /wordcount/input /wordcount/output
HDFS
初识
HDFS(hadoop distributed file system)hadoop分布式文件系统
解决海量数据存储
特性:主从架构(一个NameNode主节点 多个DataNode从节点(一个集群))
分块存储 (块大小默认128mb 如果文件小于128不分块 本身一块)(块大小 hdfs-default.xml 文件中调dfs.blocksize参数可调整)
副本机制(所有块都有副本,由参数dfs.replication控制,默认3(额外复制两份))
元数据记录(Namenode管理的元数据分为两类 1文件自身属性(名字、权限~)2文件块位置映射(那个块位于哪个节点上))
抽象统一的目录数结构(namespace)
shell命令行
文件系统协议
操作什么文件系统取决于URL的前缀协议
hadoop fs -ls file:///(操作本地文件系统)(linux虚拟机上的)
hadoop fs -ls hdfs://node1:8020/(操作HDFS分布式文件系统)(与9870对应)
hadoop fs -ls/(直接根目录,没有指定协议,将直接加载读取fs.defaultFS值)(默认为HDFS文件系统 可/hadoop-3.3.0/etc/hadoop/core-site.xml中修改)
hadoop文件系统shell命令行客户端
hadoop fs [ ]
hdfs dfs []只能hdfs系统
shell命令行常用操作
大多数与linux相似 例子
hadoop fs -mkdir [ ] path
-ls [ ] path(参数-h :人性化查看文件size)
-cat
-tail
-cp [-f(覆盖目标文件)] /本地 /HDFS
-mv <src>...<dst>
put上传文件
-put [-f] <localsrc>(本地(你操作的机器)文件系统)...< dst>(目标文件系统)
-f覆盖目标文件
-p保留访问和修改时间
例:hadoop fs -put file:///etc/profile hdfs://node1:8020/itcase
简写hadoop fs -put /etc/profile /itcase
-get下载文件
hadoop fs -get [ ] <src>(HDfs)...<localdst>(本地)
-f覆盖目标文件
-p保留访问和修改时间
同put
追加数据到HDFS
hadoop fs -appendToFile <localsrc>...<dst>
本地文件追加到给定dst文件(文件不存在创建)
例子:hadoop fs -appendToFile 1.txt 2.txt /3.txt
HDFS工作流程机制
HDFS集群角色与职责
主角色:namenode
维护管理文件系统元数据(空间目录树结构、文件和块的位置信息、访问权限)
大量内存
文件系统入口
从角色:datanode
负责具体的数据块存储
大量内存
主角色辅助角色:secondraynamenode
是namenode的辅助节点,帮助主角色进行元数据文件的合并
HDFS写数据流程(上传文件)pipeline
pipeline管道上传文件时的一种数据传输方式、
三个副本
ACK 应答响应(确保数据传输安全)
默认三副本存储策略
第一个副本:优先客户端本地,否则随机
二:不同于第一块的不同机架
三:二相同机架不同机器
MapReduce
初识
分布式计算框架
分而治之
Map:拆分成可以计算的小任务(任务之间不能有依赖关系)
Reduce:对map结果进行全局汇总
数据类型
MapReduce处理的数据类型是键值对
map: (k1;v1) --->(k2;v2)
reduce:(k2;[v2])-->(k3;v3)
特点
统一架构,隐藏底层细节
易于编程 ,良好的拓展性
实时计算性差 不能进行流式计算
实例进程
MRAppMaster:负责整个MR程序的过程调度及状态协调
MapTask:负责map阶段的整个数据处理流程
ReduceTask:负责reduce阶段的整个数据处理流程
阶段组成
一个MapReduce编程模型只能保护一个Map或Reduce
Map完必须是Reducer
Hadoop MapReduce官方示例
一个完整的MR程序:用户自己编写的代码+Hadoop自己实现的代码
示例文件
示例程序路径:/export/server/hadoop-3.3.0/share/hadoop/mapreduce/
实例程序:hadoop-mapreduce-examples-3.3.0.jar
MapReduce程序提交命令:[hadoop jar|yarn jar]hadoop-mapreduce-examples-3.3.0.jar(文件路径) arg(参数)
提交到YARN上运行
评估圆周率的值
jps看集群是否启动
hadoop jar hadoop-mapreduce-examples-3.3.0.jar(注意路径)pi 10 50
二三是撒点数(撒点法计算圆周率)
第一个参数:pi:计算圆周率
二:指定map阶段运行的任务task次数,并发度
三:每个map任务取样的个数
wordcount单词词频统计
实现思路
9870上传文件到input(自己创目录)
hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output
输出 输入路径
输出:一个成功表示文件
Map阶段执行流程
(以wordcount为例)
第一阶段:输入文件按标准逐个行逻辑切片 切片大小默认128m 每个切片由一个MapTask处理
二:按行读数据 返回键值对 k是每一行起始偏移量 v值是文件内容
三:处理数据 每读一个键值对 调用一次map方法
第四阶段:按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask 分区的数量就是reducetask运行的数量
第五阶段:Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序 sort 默认根据key字典序排序
第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件
reduce阶段执行流程
第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据
二:数据进行合并,对合并后的数据排序
三:对排序后的键值对调用reduce方法,键相等的调用一次reduce方法 最后把这些键值对写入HDFS文件中。
shuffle机制
46
YARN
初识
简介
YARN(yet another resource negotiator)另一种资源协调者 hadoop资源管理器
一个统用的资源管理器和调度平台
YARN可以理解为相当于一个分布式的操作系统平台,MapReduce等计算程序则相当于运行于操作
系统之上的应用程序,YARN为这些程序提供运算所需的资源。
架构图 角色
Container容器(资源的抽想)(容器之间隔离 保证一台机器多个程序运行)
YARN3大组件
ResourceManager NodeManager 集群物理层面
ApplicatioMaster(App Mstr) App层面
ResourceManager
YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。
接收用户的作业提交,并通过NM分配、管理各个机器上的计算资源。
NodeManager
YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源,根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。
ApplicationMaster
用户提交的每个应用程序均包含一个AM,应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。
程序提交YARN交换流程
当用户向 YARN 中提交一个应用程序后, YARN将分两个阶段运行该应用程序 。
第一个阶段是客户端申请资源启动运行本次程序的ApplicationMaster;
第二个阶段是由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成。
只有RM能申请资源
49
YARN资源调度器Scheduler
在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一
三种调度器
FIFO Scheduler(先进先出调度器)
Capacity Scheduler(容量调度器)
Fair Scheduler(公平调度器)
Apache版本YARN默认使用Capacity Scheduler(可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行修改 配置)
FIFO Scheduler(先进先出调度器)
FIFO Scheduler是一个先进先出的思想,先提交的应用先运行
FIFO Scheduler拥有一个控制全局的队列queue,默认queue名称为default,该调度器会获取当前集群上所有的资源信息作用于这个全局的queue
Capacity Schedulere容量调度
允许多个组织共享整个集群资源 每个组织可以获得集群的一部分计算能力。
通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源
Fair Scheduler(公平调度器)
只有A 全给A
来了B 给B一半 B新增作业 B中分一半