Hadoop基本概念
大数据处理最典型应用: 公司产品运营情况分析 电商推荐系统 精准广告推送系统
基本概念
1.有海量数据 .
2.有对海量数据进行挖掘的需求.
3.对海量数据进行挖掘的软件工具(hadoop、spark、storm、flink、tez、impala ...)
海量数据 存储、运算 =====分布式 存储、运算 ------已经有大量的框架
存储框架
---> HDFS 分布式文件存储系统 (各种文件结构)hadoop 提供的存储框架
---> Hbase 分布式数据库系统 (结构化存储)
---> Kafka 分布式消息缓存系统 (容量大、数据存储单元---消息--一条消息)
kafka 实时流式数据处理场景中 应用广泛
运算框架 (要解决的核心问题就是帮用户将处理逻辑在很多机器上并行)
---> MapReduce 离线批处理/hadoop 中的运算框架 -----最底层的实现机制
---> spark 离线批处理/实时流式计算 (spark 可替代 storm 实时流失计算)----是对mapreduce的再封装
---> storm 实时流式计算
spark 是 这三个运算框架中的王者
辅助类的工具:解放大数据工程师的一些繁琐工作
----> Hive 数据仓库工具 可以接收SQL 翻译成mapReduce 或者 spark 程序运行。(本质是mapReduce 或者spark)
----> Flume 数据自动采集
----> Sqoop 数据迁移 (hadoop 系统里面的数据 <===> 关系型数据库)
----> elastic search ------分布式搜索引擎
hadoop 中有3个核心组件
分布式文件系统 Hdfs ----实现将文件分布式存储在很多服务器上
分布式运算编程框架 mapReduce ----实现在很多机器上分布式并行运算
分布式资源调度框架 YARN ---帮助用户调度大量的mapReduce程序 ,并合理分配运算资源。
hdfs部署
hadoop端口说明
9000 客户端与namenode交互内部端口
【2.8.1】50070 || 【3.1.1】9870
客户端与namenode交互端口 namenode内置的web服务namenode启动后,这个内置服务就启动了
1. 下载安装包&解压
[root@node1 software]# wget https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz --no-check-certificate
#tar -zxvf hadoop-3.3.1.tar.gz
bin 下面的目录是一些功能命令
sbin 下面是一些管理命令
share 存放 jar包 进入share/ 目录 删除文档 rm -rf doc/
----
2. 进入etc /hadoop/目录。改配置文件 核心配置参数
----| 指定hadoop的默认文件系统为hdfs
----| 指定hdfs的namenode 节点为哪台机器
----| 指定namenode 软件存储元数据的本地目录
----| 指定datanode 软件存放文件块的本地目录
1).修改hadoop-env.sh 配置 java 的安装目录 export JAVA_HOME=/usr/local/jdk1.8.0_251
2).修改core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.6.130:9000/</value> <!-- URI 指定hdfs的namenode 节点为哪台机器-->
</property>
</configuration>
3).修改hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name> <!--hdfs namenode 存放元数据的工作目录 -->
<value>/app/hdpdata/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name> <!--hdfs datanode 存放数据的工作目录 -->
<value>/app/hdpdata/data</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name> <!--secondarynamenode-->
<value>192.168.6.131:50090</value> <!--node2机器启动secondarynamenode -->
</property>
</configuration>
4).启动hadoop 前 初始化 namenode 元数据工作目录
要在namenode 机器上执行hadoop 的一个命令来初始化namenode 的元数据存储目录
【2.8.1】hadoop namenode -format #需要配置hadoop 环境变量
【3.1.1】hdfs namenode -format
5).启动namenode
a.手动启动 hadoop-daemon.sh start namenode
b.脚本启动
①配置免密登录 ② 进入hadoop 安装目录 后找到 /etc/hadoop/slaves 文件|| workers 文件 【3.1.1版本】
③ 将要启动的namenode、datanode 域名配置在 slaves 一个域名一行。
④进入sbin 目录,启动用 start-dfs.sh \ 停止 用 stop-dfs.sh
配置node环境变量
export TERM=xterm
export JAVA_HOME=/usr/local/jdk1.8.0_251
export HADOOP_HOME=/app/hadoop-3.3.1
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
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
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
多机器部署配置免密登录
#在本地机器上使用ssh-keygen产生公钥私钥对
ssh-keygen
#用ssh-copy-id将公钥复制到远程机器中
ssh-copy-id 192.168.6.130
ssh-copy-id 192.168.6.131
ssh-copy-id 192.168.6.132
集群启动/停止 namenode、datanode
1.配置文件修改
将要启动的namenode、datanode 域名配置在/app/hadoop-3.3.1/etc/hadoop/workers 一个域名一行。
2.进入sbin 目录,启动用 start-dfs.sh \ 停止 用 stop-dfs.sh
启动namenode 报错
解决方法:
vim /app/hadoop-3.3.1/sbin/start-dfs.sh
vim /app/hadoop-3.3.1//sbin/stop-dfs.sh
文件头部添加
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
WEB-UI
1.先关闭防火墙
1、命令行界面输入命令“systemctl status firewalld.service”并按下回车键。
2、然后在下方可度以查看得到“active(running)”,此时说明防火墙已经被打开了。
3、在命令行中输入systemctl stop firewalld.service命令,进行关闭防火墙。
4、然后再使用命令systemctl status firewalld.service,在下方出现disavtive(dead),这权样就说明防火墙已经关闭。
5、再在命令行中输入命令“systemctl disable firewalld.service”命令,即可永久关闭防火墙。
2.特别注意:Hadoop3.0之前web访问端口是50070 hadoop3.0之后web访问端口为9870
hdfs核心原理
1.什么是元数据?
hdfs的目录结构及每一个文件的块信息(块的id,块的副本数量,块的存放位置<datanode>)
2.元数据由谁负责管理? namenode
3.namenode把元数据存放在哪?
namenode的实时完整的元数据存储在内存中:namenode 还会在磁盘中(dfs.namenode.name.dir)存储内存元数据在某个时间点上的镜像文件。namenode会把引起元数据变化的客户端操作记录在edits日志文件中;
---------------------------
secondarynamenode 会定期从namenode上下载fsimage镜像和新生成的edits日志,然后加载fsimage镜像到内存中,然后顺序解析edits 文件。对内存中的元数据对象进行修改(整合)整合完成后,将内存元数据序列化成一个新的fsimage. 并将这个fsimage 镜像文件上传给namenode.
------
上述过程叫做:checkpoint操作
提示:secondary namenode每次做checkpoint操作时,都需要从namenode上下载上次的fsimage镜像文件吗?
第一次checkpoint需要下载,以后就不用下载了,因为自己的机器上就已经有了。
4.hdfs文件写入和读取过程
4.1 写入过程
1、客户端(Client)发出请求(将请求发给namenode,通过RPC与namenode建立通信),这里以 将大小为300M的a.txt文件上传到 根目录下(/a.txt)为例
2、namenode对收到的请求做出检测;检测1:检测客户端是否有上传权限,检测2:所上传的路径下是否存在重名文件,(即根目录下是否有a.txt)
3、检测通过,反馈给客户端 可以上传的指令
4、客户端接到反馈,将文件进行预处理(a.txt大小为300M,一个block的大小默认为128M,因此分为3个block(如上图红、蓝、浅紫色三块block),编号为block1,block2,block3,其中block3不满128M),向namenode发出上传block1的请求。
5、namenode根据集群中网络拓扑和机架感知以及副本机制进行文件分配,选出可以上传的3个主机地址列表(默认为三个,一份存放于本地,一份存放于同机架内的datanode,一份存放于不同机架内的datanode),分别是datanode1,datanode2,datanode3(注意,namenode实际上并没有和datanode直接通信,只是选出三个可用的datanode的地址)
6、namenode将datanode地址列表返回给客户端Client。
7、客户端Client与datanode1进行通信(本质是RPC调用),建立pipeline,用于传输文件。当datanode1收到请求后会去与datanode2进行通信并建立pipeline(注意,这里不是客户端Client与datanode2进行通信),然后datanode2收到请求后会向datanode3进行通信并建立pipeline,如此一级接一级,直到pipeline建立完成,再逐级返回给Client。
8、客户端Client准备上传第一个block1(先从磁盘读取数据然后放到本地内存缓存),先将大小为128M的block1切分为64KB的数据包packet(2000个packet)(单位为packet,64KB)。
9、datanode1接收到第一个packet数据包并缓存到对应的目录下,再将第一个packet通过pipeline传输给datanode2,将packet传送完成后datanode1会加入一个等待应答队列等待datanode2应答,同理datanode2接收packet信息并缓存到对应目录下,再传给datanode3,datanode2将packet传送完成后会加入一个应答队列等待datanode3应答,datanode3接收packet并缓存。
10、 datanode3缓存第一个packet后会给datanode2发送一个ack的正确应答,然后datanode2向datanode1发送正确应答ack,最后由datanode1向客户端Client发送ack,至此第一个block0的第一个packed传输完成,客户端开始发送下一个packet,直到第一个block0传输完成。
11、跳转到第四步,客户端向namenode发出上传block1的请求,重复4-10(注意,新的三个datanode地址列表不一定和之前的datanode相同),直到第三个block传输完成后,写入完成。
---------------------------------------------------------------------------------------
4.2 读取过程
步骤
hdfs client向namenode请求读取/下载 /a.txt,来确定请求文件block所在的位置
namenode进行权限检查,获取block的所有DataNode 的信息,并根据一些规则(就近原则、集群拓扑结构等)选出block所在的DataNode的主机,并返回 /a.txt 文件的主机列表
namenode 向 hdfs client 响应文件的主机列表 {blk1:dn1, blk2:dn2, blk3:dn3}
hdfs client 与每一个blokc所在的主机建立pipieline管道(以多线程的方式同时建立的)
client 开始数据的读取,并以package 为单位(大小是64K)
将block 进行合并,合并成一个完整的文件。
MapReduce与YARN
1.mapReduce框架的两个阶段
【map 阶段----程序MapTask 】mapTask 按照文件大小划分多少个任务。一个文件会被分成多个任务。多个任务可以分批运行。
context.getInputSplit()
InputSplit 输入切片:用于描述每个maptask所处理的数据任务范围。
如果maptask 读取的是文件,划分范围应该用(文件路径+偏移量范围)信息描述...
map task:
读数据:Input Format -->TextInputFormat 读文本文件
SequenceFileInputFormat 读Sequence文件
DBInputFormat 读数据库
处理数据:maptask通过调用Mapper类的map()方法实现对数据的处理。
分区:将map阶段产生 key-value数据,分发给若干个reduce task 来分担负载,maptask调用Partitioner类的getPartition()方法来决定如何划分数据给不同的reduce task
对key-value数据做排序:调用key.compareTo()方法来实现对key-value数据排序。
【reduce 阶段 ---程序ReduceTask 】相同key的数据作为一组进行处理。对每一组的数据都处理一次。【聚合】
reduce task:
读取数据:通过HTTP方式从maptask产生的数据文件中下载属于自己的"区" 的数据到本地磁盘。然后将多个"同区文件" 做合并(归并排序)
处理数据:通过调用GroupingComparator的compare() 方法来判断文件中的那些key-value 属于同一组,然后将这一组数据传给Reduce类的reduce() 方法聚合一次。
输出结果:调用OutputFormat 组件将结果key-value 数据写出去。
OutputFormat--->TextOutputFormat 写文本文件(一对key-value写一行 分隔符用\t)
--->SequenceFileOutputFormat 写Sequence文件(直接将key-value对象序列化到文件中)
--->DBOutputFormat
2.yarn
mapreduce 程序应该是在很多机器上并行启动,而且先执行maptask,当众多的maptask都处理完自己的数据后,还需要启动众多的reducetask,
这个过程如果用户自己手动调度不太现实,需要一个自动化的调度平台【YARN】hadoop 中就为运行mapreduce之类的分布式运算程序开发了一个自动化调度平台----yarn
yarn 集群:
Resource Manager (只能在一台机器上有,负责任务调度)、
Node Manager(可以有多个,负责创建容器-运行程序)
3.MapReduce程序在YARN上启动-运行-注销的全流程
yarn 集群安装
a.修改 yarn-site.xml 指定 ResourceManager 是哪台机器。
b.复制配置文件到其他机器上。
[root@node1 hadoop]# pwd
/app/hadoop-3.3.1/etc/hadoop
[root@node1 hadoop]# scp yarn-site.xml node2:$PWD
[root@node1 hadoop]# scp yarn-site.xml node3:$PWD
c.启动yarn 。start-yarn.sh 此脚本在Resource Manager 机器上执行
[root@node1 hadoop-3.3.1]# ./sbin/start-yarn.sh
Starting resourcemanager
上一次登录:二 8月 9 23:25:41 CST 2022pts/0 上
Starting nodemanagers
上一次登录:二 8月 9 23:44:07 CST 2022pts/0 上
[root@node1 hadoop-3.3.1]#
<!-- yarn-site.xml -->
<configuration>
<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.resource.memory-mb</name> <!--内存-->
<value>-1</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name> <!--cpu核数-->
<value>-1</value>
</property>
<!-- 配置为true,表示可让yarn自动探测服务器的资源,比如cpu和内存等 -->
<property>
<name>yarn.nodemanager.resource.detect-hardware-capabilities</name>
<value>true</value>
</property>
</configuration>
d. ResourceManager web-UI
[root@node1 hadoop-3.3.1]# jps
3301 NodeManager
3162 ResourceManager
2620 NameNode
[root@node1 hadoop-3.3.1]# netstat -ntlp|grep 3162
tcp 0 0 192.168.6.130:8088 0.0.0.0:* LISTEN 3162/java