hadoop

大数据 - (二) - Hadoop框架

2020-07-13  本文已影响0人  啦啦啦喽啰

HADOOP框架

大数据技术解决的是什么问题?

Hadoop的广义和狭义之分

大数据简介

大数据定义

  • 指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合
  • 需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产

大数据特点

大量(Volume)

高速(Velocity)

多样(Variety)

真实(Veracity)

低价值(Value)

大数据应用场景

Hadoop简介

Hadoop定义

Hadoop 是一个适合大数据的分布式存储和计算平台。

Hadoop的发行版本

Hadoop 优缺点

优点

缺点

Apache Hadoop 重要组成

Hadoop=HDFS(分布式文件系统)+MapReduce(分布式计算框架)+Yarn(资源协调框架)+Common模块

Hadoop HDFS

一个高可靠、高吞吐量的分布式文件系统,Hadoop Distribute File System

注意:NN,2NN,DN这些既是角色名称,进程名称,代指电脑节点名称

Hadoop MapReduce

一个分布式的离线并行计算框架

Hadoop YARN

作业调度与集群资源管理的框架


image.png

Hadoop Common

支持其他模块的工具模块(Configuration、RPC、序列化机制、日志操作)

Apache Hadoop 完全分布式集群搭建

集群规划

框架 os1 os2 os3
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode
YARN NodeManager ResourceManager、NodeManager NodeManager

Hadoop目录

├── bin  # 对Hadoop进行操作的相关命令,如hadoop,hdfs等
├── etc  # Hadoop的配置文件目录,入hdfs-site.xml,core-site.xml等
├── include 
├── lib   # Hadoop本地库(解压缩的依赖)
├── libexec
├── LICENSE.txt
├── NOTICE.txt
├── README.txt
├── sbin  # 存放的是Hadoop集群启动停止相关脚本,命令
└── share # Hadoop的一些jar,官方案例jar,文档等

集群配置[1]

Hadoop集群配置 = HDFS集群配置 + MapReduce集群配置 + Yarn集群配置

HDFS集群配置
  1. 将JDK路径明确配置给HDFS(修改hadoop-env.sh)
vi hadoop-env.sh
export JAVA_HOME=$JAVA_HOME
  1. 指定NameNode节点以及数据存储目录(修改core-site.xml)
vi core-site.xml
<!-- 指定HDFS中NameNode的地址 -->
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://os1:9000</value>
</property>
<!-- 指定Hadoop运行时产生文件的存储目录 -->
<property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/servers/hadoop-2.9.2/data/tmp</value>
</property>
  1. 指定SecondaryNameNode节点(修改hdfs-site.xml)
vi hdfs-site.xml
<!-- 指定Hadoop辅助名称节点主机配置 -->
<property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>os3:50090</value>
</property>
<!--副本数量 -->
<property>
  <name>dfs.replication</name>
  <value>3</value>
</property>
  1. 指定DataNode从节点(修改etc/hadoop/slaves文件,每个节点配置信息占一行)
vi slaves
os1
os2
os3
MapReduce集群配置
  1. 将JDK路径明确配置给MapReduce(修改mapred-env.sh)
vi mapred-env.sh
export JAVA_HOME=$JAVA_HOME
  1. 指定MapReduce计算框架运行Yarn资源调度框架(修改mapred-site.xml)
mv mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
<!-- 指定MR运行在Yarn上 -->
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
Yarn集群配置
  1. 将JDK路径明确配置给Yarn(修改yarn-env.sh)
vi yarn-env.sh
export JAVA_HOME=$JAVA_HOME
  1. 指定ResourceManager的Master节点所在计算机节点(修改yarn-site.xml)
vi yarn-site.xml
<!-- 指定YARN的ResourceManager的地址 -->
<property>
  <name>yarn.resourcemanager.hostname</name>
  <value>os3</value>
</property>
<!-- Reducer获取数据的方式 -->
<property>
   <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
  1. 指定NodeManager节点(会通过slaves文件内容确定)
分发配置

使用rsync远程同步工具

yum install -y rsync
rsync语法
rsync -rvl $pdir/$fname $user@$host:$pdir/$fname
## -r 递归
## -v 显示复制过程
## -l 拷贝符号连接
rsync-script自动化脚本
#!/bin/bash
#1 获取命令输入参数的个数,如果个数为0,直接退出命令
paramnum=$#
if((paramnum==0)); then
echo no params;
exit;
fi
#2 根据传入参数获取文件名称
p1=$1
file_name=`basename $p1`
echo fname=$file_name
#3 获取输入参数的绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir
#4 获取用户名称
user=`whoami`
#5 循环执行rsync
for((host=2; host<4; host++)); do
echo ------------------- os$host --------------
rsync -rvl $pdir/$file_name $user@os$host:$pdir
done

使用:rsync-script /opt/servers/hadoop-2.9.2

启动集群

注意

如果集群是第一次启动,需要在Namenode所在节点格式化NameNode,非第一次不用执行格式化Namenode操作

hadoop namenode -format
单节点启动
hadoop-daemon.sh start namenode
hadoop-daemon.sh start datanode
Yarn集群单节点启动
yarn-daemon.sh start resourcemanager
yarn-daemon.sh start nodemanager

集群群起

start-dfs.sh
start-yarn.sh

集群测试

HDFS 分布式存储
# 创建hdfs目录
hdfs dfs -mkdir -p /test/input
cd /root
vi test.txt
# os1上传
hdfs dfs -put /root/test.txt /test/input
# os2下载
hdfs dfs -get /root/test.txt /test/input
MapReduce 分布式计算
hdfs dfs -mkdir /wcinput
cd /root
vi wc.tx
# 文件中输入
hadoop mapreduce yarn
hdfs hadoop mapreduce
mapreduce yarn os
os
os
hdfs dfs -put wc.txt /wcinput
hadoop jar $HADOOP_PATH/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount /wcinput
/wcoutput
hdfs dfs -cat /wcoutput/part-r-00000

配置历史服务器

# vi mapred-site.xml
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>os1:10020</value>
</property>
<!-- 历史服务器web端地址 -->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>os1:19888</value>
</property>
rsync-script mapred-site.xml
mr-jobhistory-daemon.sh start historyserver
http://os1:19888/jobhistory

配置日志的聚集

日志聚集

应用(Job)运行完成以后,将应用运行日志信息从各个task汇总上传到HDFS系统上

日志聚集开启步骤
# vi yarn-site.xml
<!-- 日志聚集功能使能 -->
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>604800</value>
</property>
rsync-script yarn-site.xml
# os3中
stop-yarn.sh
# os1
mr-jobhistory-daemon.sh stop historyserver
# os3
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
hdfs dfs -rm -R /wcoutput
hadoop jar $HADOOP_PATH/share/hadoop/mapreduce/hadoopmapreduce-examples-2.9.2.jar wordcount /wcinput /wcoutput

HDFS分布式文件系统

HDFS简介

HDFS (全称:Hadoop Distribute File System,Hadoop 分布式文件系统)是 Hadoop 核心组成,是分布式存储服务。

HDFS的重要概念

典型的 Master/Slave 架构
分块存储(block机制)
命名空间(NameSpace)
NameNode元数据管理
DataNode数据存储

文件的各个block的具体存储管理由 DataNode 节点承担。
一个block会有多个DataNode来存储,DataNode会定时向NameNode来汇报自己持有的block信息

副本机制

为了容错,文件的所有block都会有副本。
每个文件的block大小和副本系数都是可配置的。
应用程序可以指定某个文件的副本数目。
副本系数可以在文件创建的时候指定,也可以在之后改变。
副本数量默认是3

一次写入,多次读出

HDFS 架构

image.png
NameNode(nn):HDFS集群的管理者,Master
DateNode:Slave节点
Client:客户端

HDFS 客户端操作

Shell 命令行操作HDFS

基本语法

# hadoop fs [具体命令]

# 查看命令帮助
hadoop fs -help rm
# 显示目录信息
hadoop fs -ls /
# 在HDFS上创建目录
hadoop fs -mkdir -p /study/bigdata
# 从本地剪切粘贴到HDFS
cat > test1.txt << EOF
1
2
EOF
hadoop fs -moveFromLocal test1.txt /study/bigdata
# 追加一个文件到已经存在的文件末尾
cat > test2.txt << EOF
3
4
EOF
hadoop fs -appendToFile test2.txt /study/bigdata/test1.txt
# 显示文件内容
hadoop fs -cat /study/bigdata/test1.txt
# 统计文件夹的大小信息
hadoop fs -du -s -h /study/bigdata
# 设置HDFS中文件的副本数量,实际副本数量取决于datanode数量
hadoop fs -setrep 10 /study/bigdata/test1.txt

HDFS读写解析

image.png
  1. 客户端通过Distributed FileSystemNameNode请求下载文件,NameNode通过查询元数据,找到文件块所在的DataNode地址。
  2. 挑选一台DataNode(就近原则,然后随机)服务器,请求读取数据。
  3. DataNode开始传输数据给客户端(从磁盘里面读取数据输入流,以Packet为单位来做校验)。
  4. 客户端以Packet为单位接收,先在本地缓存,然后写入目标文件

HDFS写数据流程

image.png
  1. 客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
  2. NameNode返回是否可以上传。
  3. 客户端请求第一个Block上传到哪几个DataNode服务器上。
  4. NameNode返回3DataNode节点,分别为dn1dn2dn3
  5. 客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
  6. dn1dn2dn3逐级应答客户端。
  7. 客户端开始往dn1上传第一个Block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet就会传给dn2dn2传给dn3dn1每传一个packet会放入一个确认队列等待确认。
  8. 当一个Block传输完成之后,客户端再次请求NameNode上传第二个Block的服务器。(重复执行3-7步)

NN与2NN

HDFS元数据管理机制

NameNode如何管理和存储元数据?
  1. 如果元数据存储磁盘:存储磁盘无法面对客户端对元数据信息的任意的快速低延迟的响应,但是安全性高
  2. 如果元数据存储内存:可以高效的查询以及快速响应客户端的查询请求,数据保存在内存,如果断点,内存中的数据全部丢失。
磁盘和内存中元数据如何划分?
  1. 如果一模一样:client如果对元数据进行增删改操作,需要保证两个数据的一致性。FsImage文件操作起来效率也不高
    解决方案:两个合并成完整数据,NameNode引入了一个edits文件(日志文件:只能追加写入)edits文件记录的是client的增删改操作
元数据管理流程图
image.png

fsimage与Edits文件解析

fsimage文件内容
查看oiv命令

hdfs oiv -p 文件类型 -i 镜像文件 -o 转换后文件输出路径

hdfs oiv -p XML -i fsimage_0000000000000000265 -o
/opt/lagou/servers/fsimage.xml
Edits文件内容‘
查看oev命令

hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径

checkpoint周期

默认设置:hdfs-default.xml

<!-- 定时一小时 -->
<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property>
<!-- 一分钟检查一次操作次数,3当操作次数达到1百万时,SecondaryNameNode执行一次 -->
<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value>
  <description>操作动作次数</description>
</property>
<property>
  <name>dfs.namenode.checkpoint.check.period</name>
  <value>60</value>
  <description> 1分钟检查一次操作次数</description>
</property >

NN故障处理

  1. 2NN的元数据拷贝到NN的节点下,此种方式会存在元数据的丢失。
  2. 搭建HDFSHA(高可用)集群,解决NN的单点故障问题!!(借助Zookeeper实现HA,一个ActiveNameNode,一个是StandbyNameNode

Hadoop的限额与归档以及集群安全模式

HDFS文件限额配置

数量限额
#创建hdfs文件夹
hdfs dfs -mkdir -p /user/root/test_setting
# 给该文件夹下面设置最多上传两个文件,上传文件,发现只能上传一个文件
hdfs dfsadmin -setQuota 2 /user/root/test_setting
# 清除文件数量限制
hdfs dfsadmin -clrQuota /user/root/test_setting 
空间大小限额
# 限制空间大小4KB
hdfs dfsadmin -setSpaceQuota 4k /user/root/test_setting 
#上传超过4Kb的文件大小上去提示文件超过限额
hdfs dfs -put /export/softwares/xxx.tar.gz /user/root/test_setting
#清除空间限额
hdfs dfsadmin -clrSpaceQuota /user/root/test_setting 
#查看hdfs文件限额数量
hdfs dfs -count -q -h /user/root/test_setting

MapReduce编程框架

MapReduce思想

官方WordCount案例源码解析

* `Reduce`阶段,编程人员无需关心如何获取结果,只需要关心如何汇总数据

官方WordCount源码分析

MapReduce计算类基本组成
Hadoop序列化
为什么进行序列化?
为什么Hadoop要选择建立自己的序列化格式而不使用java自带serializable

MapReduce编程规范及示例编写

Mapper类

注意map()方法是对输入的一个KV对调用一次

Reducer类

注意Reduce()方法是对相同K的一组KV对调用执行一次

Driver阶段

------ 跳过

MapReduce原理分析

MapTask运行机制详解

注意

Map阶段的所有排序都是对key进行的
进入缓冲区,按keyhashcode进行分区

MapTask的并行度

  1. MapTask并行任务是否越多越好呢?
    答:源码中,默认切片大小128M,但是切片如果在10%增幅下,也当成一个切片;因为MR并行度越高消耗资源也越高,同样的,block是否也会有同样算法?
  2. 哪些因素影响了MapTask并行度?
MapTask并行度决定机制

切片大小128 = block块大小

a文件300M,b文件100M,2个文件都存入HDFS,并作为某MR输入数据,需要对MR任务进行split,请问MapTask并行度是多少?
a文件:0-127M,128-256M,256-300M
b文件:0-100M
总共4个split,MapTask并行度为4

要移动计算,不要移动数据,移动数据代价高

ReduceTask工作机制

image.png
ReduceTask详细步骤

ReduceTask并行度

MapTask并行度取决于split数量,split大小默认blocksize

// 默认值是1,手动设置为4
job.setNumReduceTasks(4);

Shuffle机制

  • map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,这个流程就叫shuffle
    *MapTaskmap之后,到ReduceTaskreduce之前的数据处理过程称为Shuffle流程

MapReduce的分区与reduceTask的数量

YARN资源调度

主要角色

Yarn任务提交(工作机制)

image.png

作业提交过程之YARN

Yarn调度策略


  1. 集群配置

上一篇下一篇

猜你喜欢

热点阅读