开贴记录
数据分析分类
数据分析在企业日常经营分析中主要有三个方向
- 现状分析(分析当下的数据):现阶段的整体情况,各个部分的结构占比、发展变动‘
- 原因分析(分析过去的数据):某一现状为什么发生,确定原因,做出调整优化;
- 预测分析(结合数据预测未来):结合已有数据预测未来发展趋势;
离线分析(原因分析):面向过去/历史,分析已有的数据。在时间维度明显成批次性变化。一周一分析(T+7),一天一分析(T+1),所以也叫做批处理。
实时分析(现状分析):面向当下,分析实时产生的数据。所谓的实时是指从数据产生到数据分析到数据应用的时间间隔很短,可细分秒级、毫秒级。
预测分析(机器学习):基于历史数据和当下产生的实时数据预测未来发生的事情;侧重于数学算法的运用,如分类、聚类、关联、预测。
概念
分布式与集群概念
分布式:多台机器;每台机器上部署不同组件
分布式由多个节点组成,节点之间互通,共同配合对外提供服务
集群:多台机器;每台机器上部署相同组件
集群是指在几个服务器上部署相同的应用程序来分担客户端的请求
Hadoop组件
Hadoop是一个由Apache基金会开发的分布式系统基础架构,旨在处理大规模数据的存储和计算。它的核心组件包括HDFS、MapReduce和YARN,这些组件共同支撑起Hadoop的高效性、可靠性和可扩展性
HDFS
HDFS(分布式文件存储系统):是Hadoop生态系统中的数据存储管理基础。HDFS通过流式数据访问,提供高吞吐量的数据访问功能,适合处理大型数据集。数据以块的形式分布在集群的不同物理机器上,提供了一次写入多次读取的机制。
MapReduce
MapReduce(分布式计算框架):是一种分布式计算模型,用于进行大数据量的计算。它将计算抽象成map和reduce两部分,其中Map对数据集上的独立元素进行操作,生成键-值对形式的中间结果。Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce非常适合在大量计算机组成的分布式并行环境里进行数据处理。
YARN
YARN(集群资源管理和任务调度框架):是Hadoop的资源管理和任务调度框架。它将资源管理和作业调度/监视的功能拆分为单独的守护进程,包括ResourceManager和NodeManager。ResourceManager负责整个集群的资源管理和任务调度,而NodeManager负责管理和监控每个节点上的计算资源。YARN通过资源的统一管理和调度,提高了集群的利用率和数据共享能力。
集群的启动
1.启动HDFS服务
start-dfs.sh
2.查询Jps、NameNode、DataNode与SecondaryNameNode共四个进程
jps
3.启动yarn服务、查询ResourceManager与NodeManager两个进程
start-yarn.sh
jps
4.集群web网页(hadoop-2.6.5)
主机IP地址:50070端口
主机IP地址:8088端口
5.集群关闭
stop-all.sh
Hadoop特性
- 扩容能力:Hadoop是在可用的计算机集群间分配数据并完成计算任务的,这些集群可方便灵活的方式扩展到数以千计的节点。
- 成本低:Hadoop集群允许通过部署普通廉价的机器组成集群来处理大数据,以至于成本很低看重的是集群整体能力。
- 效率高:通过并发数据,Hadoop可以在节点之间动态并行的移动数据,使得速度非常快。
- 可靠性:能自动维护数据的多份复制,并且在任务失败后能自动地重新部署(redeploy)计算任务。
Hadoop集群概述
- Hadoop集群是由HDFS集群和YARN集群组成
- 两个集群逻辑上分离,通常物理上在一起
- 两个集群是标准的主从架构
- MapReduce是计算架构、代码层面的组件,无集群一说
HDFS集群内容:
- NameNode(名称节点):主角色
- DataNode(数据节点):从角色
- SecondaryNode(辅助节点):主角色辅助角色
YARN集群内容:
- ResourceManager(资源管理器):主角色
- NodeManager(节点管理器):从角色
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的分布式特性
数据跨节点存储:
- HDFS的数据被分割成多个块(Block,默认128MB或256MB),并分散存储在不同机器的磁盘上。
- 单机文件系统只能操作单机上的文件,而HDFS需要协调多个节点(DataNode)的读写操作。
- 单机读写无法感知数据分布,可能导致数据不一致或丢失。
元数据集中管理:
- HDFS通过NameNode管理文件系统的元数据(如文件路径、块位置、副本信息等)。
- 本地命令(如cp、mv)无法与NameNode交互,无法获取文件的分布式元数据。
- HDFS Shell命令会通过NameNode的RPC接口完成元数据操作(如hdfs dfs -ls)。
HDFS的存储位置
每一个集群节点的数据存储地点可以在安装Hadoop时配置的hadoop-2.6.5/etc/hadoop/hdfs-site.xml中查询
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/software/hadoop-2.6.5/hdfs/data</value>
</property>
HDFS的Shell操作
hadoop fs 和 hdfs dfs 可以替换使用
基础操作
1..查看文件目录
hdfs dfs -ls /
hdfs dfs -ls -R / # 递归列出子目录
2.查看文件内容
hdfs dfs -cat <HDFS文件路径>
hdfs dfs -tail <文件> # 查看文件末尾内容
3.创建目录
hdfs dfs -mkdir <目录路径>
hdfs dfs -mkdir -p <多层目录路径>
hadoop fs -mkdir <目录路径>
4.上传文件到HDFS
hdfs dfs -put <本地文件> <HDFS目标路径>
hdfs dfs -copyFromLocal <本地文件> <HDFS路径> # 功能同put,生产环境更习惯用put
hdfs dfs -moveFromLocal <本地文件> <HDFS路径> # 从本地剪切粘贴到HDFS
hdfs dfs -appendToFile <本地文件> <HDFS路径> # 追加到文件末尾
hadoop fs [-put][-copyFromLocal][-moveFromLocal][-appendToFile] <本地文件> <HDFS路径>
5.下载文件到本地
hadoop fs -copyToLocal <HDFS目标路径> <本地文件>
hadoop fs -get <HDFS目标路径> <本地文件>
6.删除文件和文件夹
hadoop fs -rm -r <路径>
hdfs dfs -rm <路径>
hdfs dfs -rm -skipTrash <文件> # 直接删除(绕过回收站)
7.移动/重命名文件
hdfs dfs -mv <源路径> <目标路径>
8.复制文件
hdfs dfs -cp <源路径> <目标路径>
文件权限管理
1.修改文件/目录权限
hdfs dfs -chmod <权限模式> <路径> # 示例:-chmod 755 /data
hdfs dfs -chmod -R <权限模式> <目录> # 递归修改
2.修改文件所有者
hdfs dfs -chown <用户:组> <路径> # 示例:-chown hadoop:users /data
hdfs dfs -chown -R <用户:组> <目录> # 递归修改
3.修改文件所属组
hdfs dfs -chgrp <组名> <路径>
系统管理与监控
1.查看HDFS磁盘使用情况
hdfs dfs -df -h # 显示可读的磁盘空间统计
2.查看文件/目录大小
hdfs dfs -du -h <路径> # 显示文件大小(-h为易读格式)
hdfs dfs -du -s -h <目录> # 汇总目录总大小
HDFS集群角色与职责
NameNode:主角色
- NameNode是Hadoop分布式文件系统的核心,架构中的主角色。
- NameNode维护和管理文件系统元数据,包括名称空间目录树结构、文件和块的位置信息、访问权限等信息。
- 是访问HDFS的唯一入口
- NameNode内部通过内存和磁盘文件两种方式管理元数据。
- 其中磁盘上的元数据文件包括Fsimage内存元数据镜像文件和editslog(Journal)编辑日志。
职责
- NameNode仅存储HDFS的元数据:文件系统中所有文件的目录树,并跟踪整个集群中的文件,不存储实际数据。
- NameNode知道HDFS中任何给定文件的块列表及其位置。使用此信息NameNode知道如何从块中构建文件。
- NameNode不持久化存储每个文件中各个块所在的datanode的位置信息,这些信息会在系统启动时从DataNode重建
- NameNode是Hadoop集群中的单点故障。
- NameNode所在机器通常会配置有大量内存(RAM)。
DataNode:从角色
- DataNode是Hadoop HDFS中的从角色,负责具体的数据块存储。
- DataNode的数量决定了HDFS集群的整体数据存储能力。通过和NameNode配合维护着数据块。
职责
- DataNode负责最终数据块block的存储。是集群的从角色,也称为Slave。
- DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表。
- 当某个DataNode关闭时,不会影响数据的可用性。 NameNode将安排由其他DataNode管理的块进行副本复制。
- DataNode所在机器通常配置有大量的硬盘空间,因为实际数据存储在DataNode中。
SecondaryNode:主角色辅助角色
- 充当NameNode的辅助节点,但不能替代NameNode。
- 主要是帮助主角色进行元数据文件的合并动作。
MapReduce
核心思想
1. 分而治之(Divide and Conquer)
- 将大数据集拆分为多个小数据集(Input Splits),彼此之间几乎没有依赖关系,分布式处理。
- Map阶段:并行处理每个分片,生成中间结果(键值对)。
- Reduce阶段:汇总中间结果,生成最终输出。
2. 移动计算而非数据
- 将计算逻辑(Map/Reduce代码)分发到数据所在的节点,减少网络传输开销。
3. 面向批处理
- 适合离线、大规模数据的高吞吐量处理,不适合低延迟场景。
4. 键值对处理
- MapReduce处理的数据类型是<key,value>键值对。
特点
优点
高容错性
- Hiadoop集群是分布式搭建和部署得,任何单一机器节点宕机了,它可以把上面的计算任务转移到另一个节点上运行,不影响整个作业任务得完成,过程完全是由Hadoop内部完成的。
适合海量数据的离线处理
- 可以处理GB、TB和PB级别得数据量
局限性
实时计算性能差
- MapReduce主要应用于离线作业,无法作到秒级或者是亚秒级得数据响应
不能进行流式计算
- 流式计算特点是数据是源源不断得计算,并且数据是动态的;而MapReduce作为一个离线计算框架,主要是针对静态数据集得,数据是不能动态变化得。
架构
-
ResourceManager (RM)
-
全局资源管理,负责集群资源分配。
-
-
NodeManager (NM)
-
单个节点上的资源管理和任务执行。
-
-
ApplicationMaster (AM)
-
每个作业的协调者,负责与RM协商资源,监控任务执行。
-
-
Container
-
资源抽象单位(CPU、内存等)。
-
作业提交流程
- Client(客户)提交作业到RM → RM分配Container启动AM → AM向RM申请资源 → NM启动Task(任务)。
阶段组成
- 一个MapReduce编程模型中,只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段
- 不能出现多个Map阶段或Reduce阶段
- 当业务逻辑复杂,就只能多个MapReduce程序串行运行
调用实现
MapReduce提供的计算服务jar包保存在 Hadoop安装路径下的 /share/hadoop/mapreduce 下
实现词频统计
- shuffle阶段核心:经过MR程序内部自带默认的排序分组等功能,把key相同的单词会作为一组数据构成新的<key,value>对
- reduce阶段核心:处理shuffle完的一组数据,进行算数运算或其他操作(此处为累加求和)
#创建文件夹
hdfs dfs -mkdir /wordcount
hdfs dfs -mkdir /wordcount/input
hdfs dfs -mkdir /wordcount/output
#上传文件
hdfs dfs -put /demo/hello.txt /wordcount/input
#提交计算任务
cd /share/hadoop/mapreduce
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /wordcount/input /wordcount/output
#查询计算结果
hdfs dfs -cat /wordcount/output/part-r-00000
输出目录必须不存在
map执行过程
第一阶段
- 把输入目录下的文件,按照一定标准,逐个进行逻辑切片,形成切片规划。
- 默认Split size = Block size(块大小 128M),每一个切片由MapTask处理
第二阶段
- 对切片中的数据,按照一定的规则,读取解析返回键值对
- 默认为按行读取数据。Key为每一行的起始位置偏移量,Value为文本内容
第三阶段
- 调用Mapper类中的map方法处理数据
- 每读取解析出来一个键值对,调用一次map方法
第四阶段
- 按照一定规则,对Map的输出键值对进行分区partition。
- 默认不分区,因为只有一个reducetask。分区数量就是reducetask的数量
第五阶段
- Map输出数据写入内存缓存区,达到比例溢出到磁盘上。
- 溢出spill的时候根据key,进行排序sort。
- 默认根据key字典序排序
第六阶段
- 对所有的溢出文件进行最终的merge合并,成为一个文件。
Reduce执行过程
第一阶段
- ReduceTask主动从MapTask,复制拉取属于需要自己处理的数据
第二阶段
- 把拉取的数据,全部进行合并merge,即把分散的数据合并成为一个大的数据。再对合并后的数据排序
第三阶段
- 对排序后的键值对,调用Reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。
shuffle机制
MR程序的核心与精髓。
概念
- Shuffle的本意是洗牌、混洗的意思,把一组有规则的数据尽量打乱成无规则的数据。
- 而在MapReduce中,Shuffle更像是洗牌的逆过程,指的是将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理。
- 一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
机制弊端
- 相较于Spark,Flink计算引擎慢
- 频繁涉及到数据在内存、磁盘之间的多次往返
YARN
概述
- Apache Hadoop YARN(Yet Another Resource Negotiator,另一种资源协调者)是一种新的Hadoop资源管理器
- YARN是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度。
- 它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
- 资源管理系统:集群的硬件资源,和程序运行相关,比如内存、CPU等
- 调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)。
- 通用:不仅仅支持MapReduce程序,理论上支持各种计算程序。YARN不关心你干什么,只关心你要资源,在有的情况下给你,用完之后还我。
架构
- ResourceManager
- NodeManager
- ApplicationMaster
- Client客户端
- Container容器(资源的抽象、隔离)
三大组件
ResourceManager(RM)
- YARN集群中的主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。
- 接收用户的作业提交,并通过MM分配、管理各个机器上的计算资源。
NodeManager (NM)
- YARN中的从角色,一台机器上一个,负责管理本机器上的计算资源。
- 根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。
ApplicationMaster(AM)
- 用户提交的每个应用程序均包含一个AM。
- 应用程序内的“老大”,负责程序内部各阶段的资源申请,监督程序的执行情况。
核心交互流程
- MR作业提交:Client–>RM
- 资源的申请:MRAppMaster–>RM
- MR作业状态汇报:Container(MapReduce Task)–>Container( MRAppMaster )
- 节点的状态汇报:NM–>RM
整体概述
当用户向 YARN 中提交一个应用程序后,YARN将分两个阶段运行该应用程序
第一个阶段是客户端申请资源启动运行本次程序的ApplicationMaster ;
第二个阶段是由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成。
- 用户通过客户端向YARN中ResourceManager提交应用程序(比如hadoop jar提交MR程序);
- ResourceManager为该应用程序分配第一个Container(容器),并与对应的NodeManager通信,要求它在这个Container中启动这个应用程序的ApplicationMaster;
- ApplicationMaster启动成功之后,首先向ResourceMlanager注册并保持通信,这样用户可以直接通过ResourceManage查看应用程序的运行状态(处理了百分之几);
- AM为本次程序内部的各个Task任务向RM申请资源,并监控它的运行状态;
- 一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求它启动任务;
- NodeManager 为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务
资源调度器Scheduler
- 在理想情况下,应用程序提出的请求将立即得到YARN批准。
- 但是实际中,资源是有限的,并且在繁忙的集群上,应用程序通常将需要等待其某些请求得到满足。
- YARN调度程序的工作是根据一些定义的策略为应用程序分配资源
- 在YARN中,负责给应用分配资源的就是Scheduler,它是Resourcellanager的核心组件之一。Scheduler完全专用于调度作业,它无法跟踪应用程序的状态。
调度器策略
Apache版本YARN默认使用容量调度器
使用其他调度器,可以在yarn-site.xml中的yarn.resourcemanager.scheduler.class进行配置
先进先出调度器(FIFO Scheduler)
- FIFO Scheduler是一个先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率较低且会导致一些问题。
容量调度器(Capacity Scheduler)
- Capacity Scheduler容量调度是Apache lladoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后再为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
- capacity可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这样一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。
公平调度器(Fair Scheduler)
- Fair Scheduler叫做公平调度,提供了YARN应用程序公平地共享大型集群中资源的另一种方式。
- 使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。
- Fair Scheduler设计目标是为所有的应用分配公平的资源(对公平的定义通过参数来设置)。
- 公平调度可以在多个队列间工作,允许资源共享和抢占。
当只有A有任务时,占用集群全部资源
A、B各有一个任务时,各自占用集群一半资源
A有1个任务,B有两个任务时,A、B占用集群一半资源,B的2个任务平分1/4的集群资源
Hive
概述
内容
- Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
- Hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执行
- Hive由Facebook实现并开源。
问题
使用Hadoop MapReduce直接处理数据所面临的问题
- 人员学习成本太高 需要掌握java
- MapReduce实现复杂查询逻辑开发难度太大
好处
使用Hive处理数据的好处
- 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
- 避免直接写MapReduce,减少开发人员的学习成本
- 支持自定义函数,功能扩展很方便
- 背靠Hadoop,擅长存储分析海量数据集
关系
作为数据仓库软件,Hive具备存储数据和查询分析数据的功能
- Hive利用HDFS存储数据
- 利用MapReduce查询分析数据
- Hive只需要用于专注于编写HQL,帮助用户转换为MapReduce程序完成对数据的分析
组件与执行过程
用户接口(User Interfaces)
- CLI(命令行界面):用户直接输入HQL命令进行交互。
- HiveServer2(Thrift服务):支持JDBC/ODBC连接,便于远程客户端(如Python、Java)访问。
- Web UI:通过工具(如Hue)提供可视化界面,用于查询提交和监控。
元数据存储(Metastore)
- 功能:存储表结构(Schema)、分区信息、数据位置等元数据。
- 存储后端:通常使用关系型数据库(如MySQL、PostgreSQL),独立于HDFS。
- Metastore服务:可配置为远程模式,允许多个Hive实例共享元数据。
驱动(Driver)
- 编译器(Compiler):解析HiveQL,生成逻辑计划和物理执行计划。
- 优化器(Optimizer):对逻辑计划进行优化(如谓词下推、分区裁剪、Join优化)。
- 执行引擎(Execution Engine):将优化后的计划提交到MapReduce、Tez或Spark执行。
执行引擎(Execution Engines)
- MapReduce:默认引擎,适合批处理,但延迟较高。
- Tez:基于DAG的任务调度,减少中间数据落盘,提升性能。
- Spark:利用内存计算加速处理,适合迭代式任务。
底层依赖(Hadoop Ecosystem)
- HDFS:存储实际数据文件。
- YARN:管理集群资源调度。
使用客户端
概述
- Hive发展至今,总共历经了两代客户端工具。
- 第一代客户端(deprecated不推荐使用):$HIVE HOME/bin/hive,是一个 shellUti1。主要功能:一是可用于以交互或批处理模式运行Hive查询;二是用于Hive相关服务的启动,比如metastore服务。
- 第二代客户端(recommended 推荐使用):$HIVE_HOME/bin/beeline,是一个JDBC客户端,是官方强烈推荐使用的Hive命令行工具,和第一代客户端相比,性能加强安全性提高。
HiveServer2服务介绍
- 远程模式下beeline通过 Thrift 连接到单独的liveServer2服务上,这也是官方推荐在生产环境中使用的模式。
- HiveServer2支持多客户端的并发和身份认证,旨在为开放API客户端如JDBC、0DBC提供更好的支持。
方法一:使用第一代客户端
[root@hadoop100 hive]# bin/hive
方法二: 使用第二代客户端
[root@hadoop100 hive]# nohup /opt/software/hive/bin/hive --service metastore &
[root@hadoop100 hive]# nohup /opt/software/hive/bin/hive --service hiveserver2 &
[root@hadoop100 hive]# bin/beeline
beeline> ! connect jdbc:hive2://192.168.137.128:10000
基本操作
1. 创建表,并声明文件分隔符’\t’
hive> create table stu(id int,name string) row format delimited fields terminated by '\t';
2. 创建默认表(默认分隔符为‘\001’,vim中为^A,ctrl V+ctrl A)
hive> create table stu(id int,name string)
3. 加载本地文件到数据表中
hive> load data local inpath 'opt/software/datas/stu.txt' into table stu;
4. 加载HDFS文件到数据表
hive> load data inpath '/stu.txt' into table stu;
5. 增添数据
hive> insert into table stu values(1,'zhangsan');
6. 查询结构信息
hive> desc formatted stu;
ZooKeeper
概念
- ZooKeeper是Apache Hadoop 项目下的一个子项目,是一个树形目录服务
- Zookeeper 翻译过来就是动物园管理员,他是用来管Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk
- Zookeeper 是一个分布式的,开源的分布式应用程序的协调服务
主要功能
配置管理
-
问题背景:分布式系统中,多个节点需共享统一配置(如数据库地址、服务开关)。手动维护易出错且低效。
-
实现机制:
-
集中存储:配置信息存储在持久型ZNode(如
/config
),各节点读取该节点数据。 -
动态更新:通过Watch机制监听节点变化。当配置变更时,Zookeeper通知所有监听客户端,触发其拉取新配置。
-
示例场景:微服务架构中,所有服务实例从
/config/db_url
获取数据库地址,管理员更新该节点后,服务自动生效。
-
分布式锁
-
问题背景:多节点竞争共享资源时(如修改同一数据),需互斥访问以避免冲突。
-
实现机制:
-
临时顺序节点:客户端在锁节点(如
/locks/resource1
)下创建临时顺序子节点(如resource1_00000001
)。 -
最小序号获锁:序号最小的节点持有锁。后续节点监听前一个序号节点,形成等待队列。
-
释放与容错:客户端主动删除节点释放锁,或会话终止时临时节点自动删除,防止死锁。
-
示例场景:电商系统中,多个订单服务通过竞争锁确保同一时刻仅一个服务处理库存扣减。
-
集群管理
-
问题背景:监控集群节点状态(在线/离线),动态选举主节点以协调任务。
-
实现机制:
-
临时节点注册:节点启动时在
/members
下创建临时节点(如/members/node1
),会话保持则节点存活。 -
状态感知:其他节点监听
/members
子节点变化,实时感知节点加入或退出。 -
Leader选举:通过创建临时顺序节点,序号最小者成为领导(如
/election/leader_00000001
)。 -
示例场景:Hadoop集群中,主NameNode通过Zookeeper选举产生,DataNode通过临时节点注册状态,主节点实时监控工作节点存活
-
启动zookeeper和客户端
1. 启动、(停止、重启)服务
[root@hadoop100 zookeeper-3.4.10]$ bin/zkServer.sh start [stop/restart]
[root@hadoop101 zookeeper-3.4.10]$ bin/zkServer.sh start
[root@hadoop102 zookeeper-3.4.10]$ bin/zkServer.sh start
2. 查看服务状态
[root@hadoop100 zookeeper-3.4.10]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/software/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
3. 启动本机客户端
[root @hadoop100 zookeeper-3.4.10]$ bin/zkCli.sh
4. 启动其他机器的客户端
[root @hadoop100 zookeeper-3.4.10]$ bin/zkCli.sh -server ip地址:端口
基本操作
命令基本语法 | 功能描述 |
help | 显示所有操作命令 |
ls path [watch] | 使用 ls 命令来查看当前znode中所包含的内容 |
ls2 path [watch] | 查看当前节点数据并能看到更新次数等数据 |
create | 普通创建 -s 含有序列 -e 临时(重启或者超时消失) -es 临时顺序 |
get path [watch] | 获得节点的值 |
set | 设置节点的具体值 |
stat | 查看节点状态 |
delete | 删除节点 |
rmr | 递归删除节点 |
1. 查询当前znode中所包含的内容
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
2. 查看当前节点详细数据
[zk: localhost:2181(CONNECTED) 1] ls2 /
[zookeeper]
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
3. 创建普通节点
[zk: localhost:2181(CONNECTED) 3] create /slave "slave online"
Created /slave
[zk: localhost:2181(CONNECTED) 4] create /slave/slave01 "slave01 online"
Created /slave/slave01
4. 获得节点的值
[zk: localhost:2181(CONNECTED) 6] get /slave/slave01
slave01 online
cZxid = 0x100000004
ctime = Wed Aug 29 00:04:35 CST 2018
mZxid = 0x100000004
mtime = Wed Aug 29 00:04:35 CST 2018
pZxid = 0x100000004
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
5. 创建临时节点(退出客户端或重启后消失)
[zk: localhost:2181(CONNECTED) 7] create -e /slave/slave02 "slave02 online"
Created /slave/slave02
6. 创建带序号的节点
[zk: localhost:2181(CONNECTED) 1] create -s /slave/slave01 "online 01"
Created /slave/slave010000000001
[zk: localhost:2181(CONNECTED) 2] create -s /slave/slave01 "online 01"
Created /slave/slave010000000002
[zk: localhost:2181(CONNECTED) 3] create -s /slave/slave01 "online 01"
Created /slave/slave010000000003
[zk: localhost:2181(CONNECTED) 4] create -s /slave/slave01 "online 01"
Created /slave/slave010000000004
如果原来没有序号节点,序号从0开始依次递增。如果原节点下已有2个节点,则再排序时从2开始,以此类推。
7. 修改节点数据值
[zk: localhost:2181(CONNECTED) 1] set /slave/slave03 "offline"
8. 监听节点值变化
(1) Hadoop101注册监听
[zk: localhost:2181(CONNECTED) 0] get /slave watch
(2)Hadoop102修改节点内容
[zk: localhost:2181(CONNECTED) 0] set /slave "test set"
(3) 返回Hadoop101查看界面变化提示
[zk: localhost:2181(CONNECTED) 1]
WATCHER::
WatchedEvent
state:SyncConnected
type:NodeDataChanged
path:/slave/slave01
9. 查看节点状态
[zk: localhost:2181(CONNECTED) 9] stat /slave/slave01
cZxid = 0xa0000002b
ctime = Fri Feb 07 16:48:22 CST 2025
mZxid = 0xa0000002e
mtime = Fri Feb 07 16:50:09 CST 2025
pZxid = 0xa0000002b
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 0
10. 删除或递归删除节点
[zk: localhost:2181(CONNECTED) 4] delete /slave/slave01
[zk: localhost:2181(CONNECTED) 4] rmr /slave