Hadoop生态圈大数据开发学习笔记(更新于2023.4.26)

81 阅读16分钟

本文只是一篇会更新的学习笔记
跟hadoop生态圈大数据开发有关
跟Linux相关配置的可以看Linux入门学习笔记
跟Zookeeper相关配置的内容可以看大数据高并发处理学习笔记
需要相应的资源可以私信我

1 大数据概述

1.1 大数据的概念

1.1.1官方释义

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

1.1.2 特点

1.3V:海量、高增长率、多样化
2.4V:海量、高增长率、多样化、价值密度低
3.5V:海量、高增长率、多样化、价值密度低、真实性低
4. ……:联系性低、隐私性低

1.1.3 发展

1.与5G:带动大数据的发展,使得数据越发庞大越发多样化
2.与云计算:云计算促进了大数据的全面发展,大数据给云计算带来了挑战

1.1.4 行业案例

1.用户画像|精准推荐:淘宝人生
2.导航|交通|安防|犯罪预测|灾害预测
3.视频影音:爱奇艺,Netflix

1.2 大数据的基本概念

1.2.1 两个核心

数据的存储和数据的计算

1.2.2 分布式存储

1.世界上第一款真正意义上的大数据分布式存储框架:Google File System
2.根据分布式思想,当文件数据的体量超过某一台服务器所能存储的最大容量,如果要继续存储,则首先要根据整体数据量以及单台服务器能存储的最大容量,计算出存储该文件数据所需要的服务器总数,从而实现服务器节点的规划;其次将这些服务器以网络的形式组织起来,形成集群;
3.在这个集群上部署“分布式文件系统”,统一管理集群中各个服务器上的存储资源(硬盘、CPU和内存);
4.然后将这个文件数据切分为很多“块block”,即分布式文件系统存储文件数据的基本单位;
5.最后将这些数据块尽量平均分配到集群的各个服务器进行存储,并且记录每一个块的存放信息(编号等)以及位置信息等;
6.分布式文件系统提供一个统一的操作入口和出口(管理者),当用户访问文件数据的时候,应该经过这个管理者来访问到位于集群不同服务器上的数据块,并且将其拼装成一个完整的文件返回给用户。

1.2.3 分布式计算

1.世界上第一款真正意义上的数据分布式计算框架:Google MapReduce
2.考虑将文件数据分布式存储在集群的多台服务器上,如何分布式在文件系统上进行数据并行计算处理:将一个整体数据处理任务分解成若干个小任务,提高数据处理效率
3.考虑以下问题:

  1. 如何将小任务尽量均匀的分布到各个节点上
  2. 计算过程中各个节点的资源(CPU和内存)如何统一分配和回收
  3. 计算产生的中间结果如何及时统计汇总
  4. 集群计算完成的最终结果如何统一输出

1.3 Hadoop生态圈技术

1.3.1 数据收集

考虑数据的格式、类型(历史数据、点击流、数据市场、实时日志和数据流等等),需要选择采用哪些记录来实现数据的收集,较为主流:logstash、flume、kafka等等

1.3.2 数据存储

云存储、云数据库、HDFS文件系统等等

1.3.3 数据计算

常见的离线计算处理框架有Hadoop-MR分布式并行计算框架、hive分布式数据仓库

1.3.4 数据可视化

业务系统、ELK系统、echarts图表等等

2 Hadoop入门

2.1 Hadoop概述

2.1.1 概念

Hadoop是Apache提供的一个开源的、可靠、可扩展、可以利用分布式架构进行海量数据的存储以及计算的离线处理框架

2.1.2 特点

1.开源:公开并可以任意修改源代码
2.可靠:稳定使用
3.可扩展|可伸缩:Hadoop集群不是一成不变,如果集群服务器节点不够用可以动态增加节点,反之可以减少
4.分布式:分布式存储HDFS & 分布式计算MapReduce

2.1.3 版本

1.Hadoop1.0:common、HDFS、MapReduce;
2.Hadoop2.0:common、HDFS、MapReduce、YARN;
3.Hadoop3.0:common、HDFS、MapReduce、YARN;

2.1.4 模块

1.common:公共模块,支撑其他模块运行的基础依赖
2.HDFS:数据存储模块
3.MapReduce:分布式数据计算模块;1.0与2.0以后的版本是不兼容,其中实现任务管理和资源调度的模块 发生了变化
4.YARN:任务调度和资源管理模块

2.1.5 起源

1.创始人:Doug Cutting & Mike Cafarella
2.发展历程:

  1. Nutch:搜索引擎,考虑到存储网页数据以及处理网页数据;结合Google的论文中阐述的分布式存储的思想设计了NDFS,结合Google的论文中分布式计算的思想设计了MapReduce;
  2. Hadoop:Nutch0.8版本,将其中的NDFS&MapReduce分离形成了Hadoop,并将NDFS重命名为HDFS

2.2 Hadoop安装

2.2.1 三种形式

1.单机形式:
Hadoop的默认模式,解压Hadoop安装包之后,不进行任何Hadoop的服务器环境配置, 采用默认的最小配置;此时Hadoop仅仅运行在安装的本机上,不会与其他节点交互,同时也无法使用HDFS,因为无法加载Hadoop的守护进程;此模式往往会用于在Windows系统开发调试MapReduce程序的逻辑
2.伪分布式形式
进行简单的Hadoop的服务器环境配置,此时通过模拟一个小型集群,使得Hadoop的守护进程运行在集群中,可以使用HDFS和MapReduce;可以配置单机的伪分布式集群
3.完全分布式形式
进行完整的Hadoop的服务器环境配置,使得Hadoop的守护进程运行在集群的不同服务器上,服务器间相互通信以及传输数据,可以真正的利用集群来提升性能

2.2.2 单机伪分布式模式安装

1.上传安装包至Linux的/home/software目录下
2.解压:tar -zxf hadoop-2.7.1_64bit.tar.gz
3.重命名:mv hadoop-2.7.1 singleHadoop
4.目录说明:
image.png

  1. bin:Hadoop的客户端指令
  2. sbin:Hadoop的启动、关闭以及进程管理指令
  3. etc/hadoop:Hadoop的核心配置文件

2.2.3 单机伪分布式配置

1.前提:防火墙规则(关闭 systemctl status firewalld) & 免密登录
2.进入到Hadoop的配置文件所在目录下:cd etc/hadoop
3.配置Hadoop运行环境变量hadoop-env.sh:

  1. 编辑:vim hadoop-env.sh
  2. 在25行找到:export JAVA_HOME=${JAVA_HOME}
  3. 修改为java的具体安装路径:export JAVA_HOME=/home/software/jdk
  4. 在33行找到:export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
  5. 修改为Hadoop配置文件的具体路径:exportHADOOP_CONF_DIR=/home/software/singleHadoop/etc/hadoop
  6. 保存退出,并重新加载:source hadoop-env.sh

4.配置YARN运行环境变量yarn-env.sh:

  1. 编辑:vim yarn-env.sh
  2. 在23行找到:# export JAVA_HOME=/home/y/libexec/jdk1.6.0/
  3. 删掉#,放开注释
  4. 修改为:export JAVA_HOME=/home/software/jdk
  5. 保存退出,并重新加载:source yarn-env.sh

5.配置核心基础模块core-site.xml:

  1. 此文件是Hadoop集群的基础核心配置,伪分布式需要配置集群中分布式文件系统的入口地址和数据落地到服务器本地磁盘的位置
  2. 编辑:vim core-site.xml
  3. <configuration></configuration>标签对内部添加配置信息
  4. 保存退出即可
<!--文件系统的入口地址,也即集群的主节点-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<!--数据落地到磁盘,也即持久化路径-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/software/singleHadoop/tmp</value>
</property>

6.配置存储模块hdfs-site.xml

  1. 此文件是HDFS文件系统属性配置,主要属性配置HDFS文件系统的数据块副本。数据块副本是HDFS文件系统存储数据的核心,后续进行详细讲解
  2. 编辑:vim hdfs-site.xml
  3. <configuration></configuration>标签对内部添加配置信息
  4. 保存退出即可
<!--数据块副本个数:单机伪分布式设置为1-->
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

7.配置计算模块mapred-site.xml

  1. 此文件是MapReduce核心配置,主要需要配置将MapReduce运行中所需要内存&CPU资源交给YARN来协调分配
  2. 复制:cp mapred-site.xml.template mapred-site.xml
  3. 编辑:vim mapred-site.xml
  4. <configuration></configuration>标签对内部添加配置信息:
  5. 保存退出即可
<!--指明MapReduce运行资源由YARN来调度-->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>

8.配置资源管理模块yarn-site.xml:

  1. 此文件是YARN资源协调者核心配置,主要配置YARN的主进程ResourceManager(负责整个集群资源的管理协调)的入口地址(通常会和HDFS的主节点在同一台机器上) 以及具体节点管理器的从进程NodeManager(负责集群中各个服务器的本地资源协调)处理计算任务的方式
  2. 编辑:vim yarn-site.xml
  3. <configuration></configuration>标签对内部添加配置信息:
  4. 保存退出即可
<!--指明YARN的主进程Resourcemanager的入口地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<!--指明YARN的从进程NodeManager的任务获取方式-->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

9.配置集群从服务器节点slaves:

  1. 此文件是集群的从进程所在服务器地址配置,主要配置Hadoop集群中从进程(DataNode、NodeManager)所在的服务器地址
  2. 编辑:vim slaves
  3. 将其中的localhost修改为本机的主机名:master
  4. 保存退出即可

2.2.4 启动Hadoop伪分布式集群

1.切换到singleHadoop/bin:cd ../../bin
2.执行格式化hdfs文件系统的指令:./hdfs namenode -format

  1. 执行后日志中打印:Storage directory /home/software/singleHadoop/tmp/dfs/name has been successfully formatted
  2. 其中的格式化目录正是core-site.xml中配置的持久化目录,说明格式化无误(也即配置无误)

4.切换到singleHadoop/sbin:cd ../sbin
5.执行启动Hadoop集群的指令: ./start-all.sh

  1. HDFS组件启动: image.png
  2. YARN组件启动: image.png

5.查看进程是否启动成功:jps
image.png
出现以上五个进程,才表示此时Hadoop集群启动成功
6.注意:

  1. 缺少哪个进程,就去查看该进程对应的日志文件,例如缺少DataNode,则查看logs/hadoop-root-datanode-master.log中的异常信息, 根据异常信息调整
  2. 调整后,重启Hadoop:先执行./stop-all.sh ,然后执行./start-all.sh

7.也可以在webUI中访问集群的服务:

  1. HDFS:http://192.168.88.177:50070 image.png
  2. YARN:http://192.168.88.177:8088 image.png

3 HDFS入门

3.1 HDFS概述

3.1.1 概念

1.HDFS:hadoop distributed FileSystem,是一个分布式、可扩展、可靠的文件系统

  • 分布式文件系统:为了存储超大文件,可以将文件切成很多块,将这些数据块均匀存储在多台服务器上,然后通过一套系统来维护这些文件数据块;当用户访问这些超大文件,该系统可以将存储在多个服务器上的数据块进行临时拼装,返回给客户端

2.HDFS是基于流式数据访问模式,为了处理超大文件的存储需求而设计的

  • 流式数据访问模式:关键在于流式数据,将数据序列化成字节流,利用AVRO框架

3.HDFS中存储的数据一定是流式数据,也即可以序列化和反序列化的数据,也即需要存储在HDFS上的文件必须支持序列化和反序列化
4.HDFS中包含三个核心进程:NameNode、DataNode、SecondaryNameNode

3.1.2 核心设计之架构图

image.png

3.1.3 数据块——block

1.数据块是HDFS文件系统中存储数据的基本单位,默认大小为128M
2.HDFS文件系统存储超大文件时,会根据文件大小将其切分成若干个块存储在不同的数据节点上,切出的数据就被称为block
3.HDFS文件系统的访问路径:hdfs://master:9000/;目录结构设计仿造Linux,根目录为/
4.上传文件的demo:

  1. 上传小文件:[root@master singleHadoop]# ./bin/hadoop fs -put LICENSE.txt hdfs://master:9000/
  2. 上传大文件:[root@master singleHadoop]#./bin/hadoop fs -put ../hadoop2.7.1_64bit.tar.gz hdfs://master:9000/
  3. 说明: image.png
    小文件:此时block的实际大小就是文件大小,剩余空间可以被其他文件使用
    image.png
    大文件:此时文件会被切分成若干个block,每个block大小都为128M,最后一个block的大小为剩余文件大小 image.png
    image.png

5.每一个block都会有一个唯一的标识,blockID;通过此ID来确定数据块的顺序

3.1.4 数据块抽象设计的优点:

1.在实际生产环境下,一个文件的大小可以大于集群中任意一个服务器的磁盘容量,因为文件存储最终以数据的方式落地到磁盘的;因此文件数据是以数据块的形式来存储,而数据块大小保持在128M以内,此时文件数据大小即使是数据块的千倍万倍,集群服务器都只需要考虑文件被切分或的数据块如何存储即可;分而治之
2.数据块非常适合于数据的备份,进而提高集群的容错性和可用性;当某个数据块丢失时,只需要找回这个数据块即可,不会涉及到整个文件;当需要使用某个文件,只需要考虑将改文件对应的块进行临时组装返回给用户即可

3.1.5 数据块副本

1.意义:为了提升HDFS的数据可靠性,可以创建多份数据块的副本(replicas),存储在集群的不同服务器也即不同的DataNode节点上
2.创建的多份数据块副本是针对同一块数据而言:

  • 比如说,一个文件的大小是1280M,它会在HDFS上被切分成10块,然后针对这10块中的每一块进行复制,假设设置的复制系数为3(dfs.replication=3),也就是将每一块数据额外复制出两份一模一样的数据块

3.复制系数dfs.replication可以自定义,每当复制系数增加1,该文件就会被多冗余一次
4.复制系数要结合实际集群的配置以及性能来决定:

  1. 例如,当前单机伪分布式集群只需要设置为1即可,因为即使有副本依旧是存储在当前服务器也即单个DataNode上
  2. 一般,生产环境下,为了性能和安全性双重考虑,往往是将系数设置为3(官方建议的默认值)

5.存放策略(以三个副本为例): image.png
解析:

  1. 第一个副本存放在客户端所在服务器的DataNode上;如果客户端不在集群服务器范围之内,则第一个副本会随机选取一个DataNode
  2. 第二个副本放置在与第一个副本所在服务器不同机架上的任意服务器的DataNode节点上
  3. 第三个副本放置在与第一个副本所在服务器同一机架的另一台服务器的DataNode节点上
    优点:
  4. 既可以保证本机架上对于该数据块所属文件的高效访问;
  5. 又可以保障一旦此机架出现故障,也可以在另一个机架上找到该数据块的副本
  6. 既高效又容错

6.数据块副本数设置:

  1. 配置文件hdfs-site.xml中通过dfs.replication属性进行设置,一旦修改就需要重启服务才生效
  2. 通过指令修改单个文件的数据块副本,让其再次复制出若干个副本
  3. 例如:./bin/hadoop fs -setrep -R 3 hdfs://master:9000/LICENSE.txt
    image.png
  4. 指令只能影响一次,后续继续上传的文件数据块副本依然是根据配置文件属性值决定的

4 HDFS核心设计之体系结构

4.1 心跳机制

4.1.1 来源

在计算机集群长连接场景中,有可能很长一段时间内,集群内节点和节点之间没有数据往来,但是应该一直保持连接,不过中间节点出现故障是难以预测的,某些节点甚至会自动将一段时间之内没有数据交互的连接中断掉。此时需要心跳数据包来维持连接,保持节点之间的通信

4.1.2 概念

心跳机制是每隔一段时间连接一次的机制

4.1.3 流程

1.客户端每隔数秒或数分钟向服务器发送一个固定格式的信息,服务器接收到这个信息之后,返回一个固定格式的信息给客户端;
2.如果服务器超时未接收到客户端的信息,则认为此时客户端断开连接

4.1.4 心跳数据包——固定格式的信息

1.像心跳一样每间隔一段时间发一次以便于告知服务器此客户端(服务器)依旧是存活;
2.此固定格式的信息没有特殊规定,一般是很小的数据包,或者是一个只包含头部的空包,主要用于长连接的保持和断线处理;
3.心跳数据包的判定时间通常在30s-40s,要求较高的集群会设置在3-9s

4.1.5 Hadoop集群中的心跳机制应用

1.HDFS分布式文件系统是主从架构(主进程NameNode,从进程DataNode)
2.YARN资源调度器是主从架构(主进程ResourceManager,从进程是NodeManager)
3.主进程启动的时候会开启进程间的通信服务(IPC),等待从进程的连接;
4.从进程启动的时候,会主动去连接IPC服务器,并且每隔3秒连接一次;此时间为默认值,可以修改
5.从进程通过心跳机制向主进程汇报自身的信息,主进程通过心跳机制向从进程发达指令
6.如果主进程长时间没有接收到从进程的心跳信息,一般是10min之内,则认为此从进程已经失效

4.2 时钟同步(三台服务器)

4.2.1 概念

1.确保集群中所有服务器的时间一致,避免由于时钟不同步导致集群间服务器通信&传输数据失败;
2.计算机之间的通信和数据传输一般都是以时间为约定条件

4.2.2 操作

1.注意Linux服务器的时间都是不稳定的,需要找一个标准时钟,例如北京时间的时钟
2.选择一个标准的时钟服务器:

  1. 国际标准时间服务器:cn.pool.ntp.org
  2. 阿里云时间服务器:aliyun.com

3.执行与标准时钟服务器时间同步的指令:
/usr/sbin/ntpdate cn.pool.ntp.org
打印类似以下格式:16 Mar 16:33:40 ntpdate[3516]: step time server 202.118.1.81 offset -1.596621 sec
4.查看时间
类似如下,需和现实时间一致
image.png
5.注意

  1. 最小化安装会提示ntpdate找不到,通过yum -y install ntpdate 安装此工具,再执行指令即可
  2. 集群中所有服务器都需要使用相同的时钟服务器,并且查询到的时间相同