Hadoop 安装教程——单节点模式和分布式模式配置
文章目录
- 一、预备知识
- 1.1 Hadoop 发行版本
- 1.2 部署方式
- 二、预备条件
- 2.1 环境准备
- 2.2 创建新用户(可选)
- 2.3 配置 SSH 无密码登录
- 2.4 下载 Hadoop
- 2.5 编辑 hadoop-env.sh 脚本
- 2.6 编辑 dfs 和 yarn 脚本
- 三、单节点模式部署
- 3.1 官方使用案例
- 3.2 查看运行结果
- 四、伪分布模式部署
- 4.1 修改配置文件
- 4.2 格式化 Hadoop(首次)
- 4.3 启动 Hadoop
- 4.4 检查 Hadoop 状态
- 4.5 停止 Hadoop
- 五、常见问题
- 5.1 启动 start-dfs.sh 脚本报错
- 5.2 启动脚本时拒绝访问
- 参考资料
一、预备知识
1.1 Hadoop 发行版本
Hadoop 的发行版本有:
- Apache Hadoop:官方版本,由 Apache 软件基金会维护。
- Hortonworks Data Platform (HDP):基于 Apache Hadoop 的企业级发行版,提供了额外的工具和组件(如 Hive、HBase、Spark 等),适合企业用户。
- Cloudera Data Platform (CDP):Cloudera 的企业级解决方案,整合了 Hortonworks 和 Cloudera 的产品,提供更全面的功能和支持。
其中,Apache Hadoop 最适合新手入门学习。
1.2 部署方式
部署方式主要有以下三种:
-
单节点模式:所有 Hadoop 组件运行在同一台机器上。这比较适合适合开发和测试。
-
伪分布模式:在单台机器上模拟分布式环境,Hadoop 各组件在不同的进程中运行。这比较适合适合小规模测试和开发。
-
完全分布式模式:在多台机器上部署 Hadoop 集群,每个节点上运行不同的 Hadoop 组件。这适合生产环境,要求对集群进行详细配置。
二、预备条件
2.1 环境准备
-
安装 JDK。在 Hadoop Java Versions - Hadoop - Apache Software Foundation 查看Hadhoop 推荐的 Java 版本,最佳版本为 JDK 8 。
-
配置 SSH 免密登录。如果要使用可选的启动和停止脚本,则必须安装 ssh 并且运行 sshd 才 能使用管理远程 Hadoop 守护进程的 Hadoop 脚本。此外,建议还安装 pdsh 以更好地管理ssh资源。
$ sudo apt-get install ssh $ sudo apt-get install pdsh
注意,pdsh 的远程命令类型为 rsh, 建议修改成 ssh。
2.2 创建新用户(可选)
创建一个新用户,用户名和密码设置为 hadoop
$ sudo useradd -m hadoop -s /bin/bash
$ sudo passwd hadoop
为了避免权限造成的问题,为 hadoop 用户增加管理员权限。
$ sudo adduser hadoop sudo
2.3 配置 SSH 无密码登录
Hadoop 在启动时需要通过 SSH 连接到各个节点(包括本地主机)。因此,我们需要配置无密码登录。
简单地介绍已下 SSH 登录原理:
- 密钥对生成:用户在本地生成一对密钥:一个私钥和一个公钥。私钥保留在本地,公钥可以共享给任何希望访问的服务器。
- 公钥复制:用户将公钥添加到目标服务器的
~/.ssh/authorized_keys
文件中。 - 身份验证过程:当用户尝试通过 SSH 连接到服务器时,服务器会发送一条随机消息给用户。用户使用自己的私钥对该消息进行加密,然后将其返回给服务器。服务器使用存储在
authorized_keys
文件中的相应公钥来解密收到的消息。如果解密成功且消息匹配,身份验证通过,用户被允许访问。
(1) 确保 SSH 服务正在运行
首先,确保 SSH 服务在您的 Ubuntu 系统上运行。
# 检查 SSH 服务的状态
$ sudo systemctl status ssh# 如果服务未运行, 启动 SSH 服务
$ sudo systemctl start ssh
(2) 生成 SSH 密钥对
使用 ssh-keygen
在 ~/.ssh
目录下生成 SSH 密钥对。
# 输入密码 hadoop 才能登录。因此,我们需要实现无密登录
ssh localhost# 若没有该目录,执行一次 ssh localhost 后会自动生成
$ cd ~/.ssh/ # 生成密钥对
$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:HGuMfZmVK09WBr0fPJ3Kj5xYnUuChwl08TlaSq5HN0k hadoop@ubuntu
The key's randomart image is:
+---[RSA 2048]----+
| .o. |
| . ..oo |
| o ..oE+.o|
| = +o+=++=.|
| . S *=O+o.+|
| . .oO.*.+.|
| . .* * .|
| .. + o |
| |
+----[SHA256]-----+
其中,id_rsa
为 私钥, id_rsa.pub
为公钥。
(3) 将公钥添加到目标服务器的authorized_keys
使用 ssh-copy-id
命令可以方便地将公钥复制到目标主机的 authorized_keys
文件中
# 方式一
$ ssh-copy-id -i ~/.ssh/id_rsa.pub localhost# 方式二
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
authorized_keys
是一个文本文件,位于用户的 ~/.ssh/
目录下。它用于存储被授权可以无密码访问该用户帐户的 SSH 公钥。将公钥添加到 authorized_keys
文件中,以允许无密码访问。
确保 ~/.ssh/authorized_keys
的权限设置正确:
chmod 0600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
(4) 测试 SSH 连接
在终端中尝试通过 SSH 连接到 localhost 和主机名:
$ ssh ubuntu
The authenticity of host 'ubuntu (127.0.1.1)' can't be established.
ECDSA key fingerprint is SHA256:Joilwgpgx1Mc2K3XnL1iszZ+Y/EK+GltbMG6B28luBY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ubuntu' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.15.0-107-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantage240 updates can be applied immediately.
123 of these updates are standard security updates.
To see these additional updates run: apt list --upgradableYour Hardware Enablement Stack (HWE) is supported until April 2025.The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
其中, ubuntu
是为特定计算机设置的主机名,用于标识这台机器。
2.4 下载 Hadoop
在 Apache Download Mirrors 下载合适的 Hadoop 版本。如果官网下载太慢,可以考虑 hadoop/common (huaweicloud.com) 网站。
执行以下命令,下载 Hadoop 安装包。
# 下载安装包
$ wget --no-check-certificate https://repo.huaweicloud.com/apache/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz# 解压安装包到指定目录
$ sudo tar -zxvf hadoop-3.3.6.tar.gz -C /usr/local/# 将文件夹名改为hadoop
$ cd /usr/local
$ sudo mv ./hadoop-3.3.6/ ./hadoop # 修改文件权限
$ sudo chown -R hadoop ./hadoop
输入如下命令来检查 Hadoop 是否可用,成功则会显示 Hadoop 版本信息:
$ cd /usr/local/hadoop
$ ./bin/hadoop version
2.5 编辑 hadoop-env.sh 脚本
编辑 hadoop-env.sh 脚本, 设置必要的一些参数。
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_421
查看 Hadoop 脚本的使用文档
$/usr/local/hadoop-3.3.6/bin/hadoop
2.6 编辑 dfs 和 yarn 脚本
在 sbin/start-dfs.sh 和 sbin/stop-dfs.sh 脚本中,添加以下参数:
HDFS_DATANODE_USER=root
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
在 sbin/start-yarn.sh 和 sbin/stop-yarn.sh 脚本中,添加以下参数:
YARN_RESOURCEMANAGER_USER=root
YARN_NODEMANAGER_USER=root
三、单节点模式部署
默认情况下,Hadoop配置为以非分布式模式运行,作为单个Java进程。这对于调试很有用。
3.1 官方使用案例
将 input
文件夹中的所有文件作为输入,筛选当中符合正则表达式 dfs[a-z.]+ 的单词并统计出现的次数,最后输出结果到 output
文件夹中
$ cd /usr/local/hadoop$ mkdir input$ cp etc/hadoop/*.xml input$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep input output 'dfs[a-z.]+'
3.2 查看运行结果
查看运行结果:
$ cat output/*
1 dfsadmin
1 dfs.replication
1 dfs.permissions
四、伪分布模式部署
Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行。
在 /usr/local/hadoop/etc/hadoop/
中,伪分布式需要修改2个配置文件 core-site.xml
和 hdfs-site.xml
。
4.1 修改配置文件
etc/hadoop/core-site.xml
:
<configuration><!-- 指定 Hadoop 文件系统的默认文件系统 URI --><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property><!-- 指定 Hadoop 运行时生成的临时文件的存储目录 --><property><name>hadoop.tmp.dir</name><value>file:/usr/local/hadoop/tmp</value><description>Abase for other temporary directories.</description></property>
</configuration>
etc/hadoop/hdfs-site.xml
:
<configuration><!-- 指定了 HDFS NameNode 存储其元数据的目录 --><property><name>dfs.namenode.name.dir</name><value>file:/usr/local/hadoop/tmp/dfs/name</value></property><!-- 指定了 HDFS DataNode 存储实际数据块的目录 --><property><name>dfs.datanode.data.dir</name><value>file:/usr/local/hadoop/tmp/dfs/data</value></property><!-- 定义 HDFS 文件的默认副本数量 --><property><name>dfs.replication</name><value>1</value></property><!-- 定义 HDFS 是否启用权限检查 --><property><name>dfs.permissions</name><value>false</value></property><!-- 控制 Secondary NameNode(次要 NameNode)执行 HDFS 检查点(checkpoint)的周期 --><property><name>fs.checkpoint.period</name><value>3000</value></property>
</configuration>
etc/hadoop/mapred-site.xml
:
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><property><name>mapreduce.application.classpath</name><value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value></property>
</configuration>
etc/hadoop/yarn-site.xml
:
<configuration><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.nodemanager.env-whitelist</name><value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value></property>
</configuration>
4.2 格式化 Hadoop(首次)
在第一次启动的时候,格式化 HDFS(Hadoop 分布式文件系统)。
# 进入 Hadoop 安装目录
$ cd /usr/local/hadoop# 格式化 HDFS
$ bin/hdfs namenode -format
后面启动的时候,无需格式化。
4.3 启动 Hadoop
(1) 启动 HDFS
$ sbin/start-dfs.sh
Starting namenodes on [localhost]
Starting datanodes
Starting secondary namenodes [ubuntu]
在成功启动后,我们还可以访问 Hadoop Web 界面 http://localhost:9870。
(2) 启动 YARN
启动 YARN。
$ sbin/start-yarn.sh
Starting resourcemanager
Starting nodemanagers
在成功启动后,我们还可以访问 YARN 界面 http://localhost:8088 。
4.4 检查 Hadoop 状态
使用以下命令检查 Hadoop 服务的状态:
# 查看运行 Java 进程
$ jps
5079 ResourceManager
4508 DataNode
4348 NameNode
4782 SecondaryNameNode
5615 Jps
5231 NodeManager
此命令将显示当前正在运行的 Java 进程。您应该能够看到如下进程:
4.5 停止 Hadoop
$ sbin/stop-dfs.sh
Stopping namenodes on [localhost]
Stopping datanodes
Stopping secondary namenodes [ubuntu]$ sbin/stop-yarn.sh
Stopping nodemanagers
Stopping resourcemanager
五、常见问题
5.1 启动 start-dfs.sh 脚本报错
问题描述:
$ sudo sbin/start-dfs.sh
Starting namenodes on [ubuntu]
pdsh@ubuntu: ubuntu: rcmd: socket: Permission denied
Starting datanodes
pdsh@ubuntu: localhost: rcmd: socket: Permission denied
Starting secondary namenodes [ubuntu]
pdsh@ubuntu: ubuntu: rcmd: socket: Permission denied
解决方案:
(1) 查看 SSH 配置
检查 /etc/ssh/sshd_config
配置文件,确保以下基本配置
#
PermitRootLogin yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
如果有更改,记得重启 SSH 服务
$ sudo systemctl restart ssh
(2)pdsh 执行命令
pdsh
(并行分布式 Shell)执行远程命令时的默认远程命令类型为 rsh 时, 会出现该问题。
# 检查 pdsh 的远程命令类型
$ pdsh -q -w localhost
更改为使用 ssh :
# 1. 临时设置
$ export PDSH_RCMD_TYPE=ssh# 2. 永久设置
$ echo 'export PDSH_RCMD_TYPE=ssh' >> ~/.bashrc
最后,重新加载 ~/.bashrc
:
$ source ~/.bashrc
(3)不建议的方案
在尝试以上方案后,依旧无法启动,建议删除 pdsh
。
apt-get remove pdsh
5.2 启动脚本时拒绝访问
报错信息:
$ sudo sbin/start-dfs.sh
Starting namenodes on [ubuntu]
ubuntu: root@ubuntu: Permission denied (publickey,password).
Starting datanodes
localhost: root@localhost: Permission denied (publickey,password).
Starting secondary namenodes [ubuntu]
ubuntu: root@ubuntu: Permission denied (publickey,password).
解决方案:
不要使用 sudo。事实上,在没有使用 sudo 的情况下依旧可以运行,我们可以考虑直接为用户增加管理员权限。
参考资料
Apache Hadoop 3.3.6 – Hadoop: Setting up a Single Node Cluster.
hadoop - HDFS_NAMENODE_USER, HDFS_DATANODE_USER & HDFS_SECONDARYNAMENODE_USER not defined - Stack Overflow
Hadoop安装教程——单机 / 伪分布式配置-阿里云开发者社区 (aliyun.com)
相关文章:

Hadoop 安装教程——单节点模式和分布式模式配置
文章目录 一、预备知识1.1 Hadoop 发行版本1.2 部署方式 二、预备条件2.1 环境准备2.2 创建新用户(可选)2.3 配置 SSH 无密码登录2.4 下载 Hadoop2.5 编辑 hadoop-env.sh 脚本2.6 编辑 dfs 和 yarn 脚本 三、单节点模式部署3.1 官方使用案例3.2 查看运行结果 四、伪分布模式部署…...
给c++小白的教程10:一维数组
好久不见!我又来更教程了。 升到初二,由于学业原因,更新速度减慢了,十分抱歉! 以后将恢复到一周一次的频率 作者只是个普通学生,做的教程多有不足,希望大家批评指正! 赫炎今天在一…...

【排序】3.希尔排序法
希尔排序(直接插入排序的优化) 1.分组思想 上图中gap为5,说明要分成5组。 这5组分别用了五种颜色的线条连接起来了。 第1组:9、4 第2组:1、8 第3组:2、6 第4组:5、3 第5组:7、5 2.缩…...
商品详情数据API接口概述(json数据格式返回参考)
商品详情数据API接口是指一种编程接口(API,Application Programming Interface),它允许开发者或系统以编程方式获取商品的详细信息。这些信息包括但不限于SKU的详细信息、商品图片、商品属性、价格、库存状态、用户评价等。当调用…...

Jmeter简介
基础介绍 Jmeter录制脚本的原始是配置一个HTTP代理,然后浏览器通过这个代理访问测试页面从而完成脚本录制。 一、下载安装 jmeter本身不需要安装,需要配置环境变量JDK,然后打开bin文件夹中的jmeter.vbs即可。建议jdk 1.7及以上版本。 基本祖…...
网页前端开发之HTML入门篇:标题标签 heading
标题标签 heading <h1>-<h6>是HTML的标题标签,其标签内容会呈现六个不同级别的字号, <h1>字号最大,<h6>字号最小。 示例 <html><body><h1>一级标题</h1><h2>二级标题</h2>&l…...

医院信息化与智能化系统(3)
医院信息化与智能化系统(3) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应的…...
数据结构(线性表)
1线性表的定义与操作 1.1线性表的定义 线性表是一种基础的数据结构,其主要特点是:数据元素之间存在一种线性关系(一对一)。线性表的每一个数据元素都有一个唯一的前驱和后继,除了第一个元素没有前驱,最后…...
ArcGIS Pro SDK (十八)栅格
ArcGIS Pro SDK (十八)栅格 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 栅格 1 在文件夹中打开栅格数据集 // 使用文件夹路径创建 FileSystemConnectionPath 对象。 FileSystemConnectionPath connectionPath = new FileSystemConnectionPath(new System...
c++ 对象作用域
在 C 中,对象的作用域(scope)指的是对象的生命周期以及对象在程序中可以访问的范围。作用域影响对象的创建、使用和销毁,主要有以下几种类型: 1. 局部作用域(Local Scope) 局部作用域的对象是…...
【无标题】海尔AI英语面试
1.自我介绍 Good morning. I am delighted to have this English interview. My name is fu guilin. I graduated from CDUT with a degree in Information engineering. During my university years, I have laid a solid foundation in my professional knowledge. I posses…...
软件设计模式------概述
一:简述 目的:为了可重用代码,代码更容易被他人理解,提高代码的可靠性。 定义:是一套被反复使用,多数人知晓,经过分类编目的,代码设计经验的总结。 (通俗来说…...

刷题/学习网站推荐
前言: 最近没怎么学习,荒芜生活,学不进去,太累了,就喜欢翻翻网站有没有好用的东西分享给大家,正好看到一些刷题的网站(其实也是学习的网站吧),相比学程序的很多都是力扣…...

OQE-OPTICAL AND QUANTUM ELECTRONICS
文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网:https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿:由艾思科蓝支持在线投稿,请将文章全文投稿至艾思科蓝投稿系…...

在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?
大家好,我是锋哥。今天分享关于【在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?】面试题?希望对大家有帮助; 在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处? 1000道 互联网大厂Java工程师 精选…...
Chromium html<textarea>c++接口定义
<textarea>:文本区域元素 <textarea> HTML 元素是一个多行纯文本编辑控件,适用于允许用户输入大量自由格式文本的场景。 例子: <!DOCTYPE html> <html> <head> <meta charset"utf-8"> &l…...

OpenCV高级图形用户界面(13)选择图像中的一个矩形区域的函数selectROI()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 允许用户在给定的图像上选择一个感兴趣区域(ROI)。 该功能创建一个窗口,并允许用户使用鼠标来选择一个 ROI。…...

《计算机视觉》—— 基于dlib库的人检检测
文章目录 一、dlib库的安装1. 通过PyCharm的Settings安装2. 通过Anaconda安装(适用于Windows等操作系统)3. 通过命令行安装4.懒人安装 二、基于dlib库的人检测1.对图像进行人脸检测2.打开电脑摄像头,检测人脸 一、dlib库的安装 在PyCharm中&…...

分布式数据库安全可靠测评名录之平凯数据库(TiDB企业版)
作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/d052ee0b 2024 年 9 月 30 日,中国信息安全测评中心公布安全可靠测评结果公告(2024年第2号),其中包含 6 款集中式数据库和 11 款分布式数据…...
动态规划之打家劫舍
大纲 题目思路第一步:确定下标含义第二步:确定递推公式第二步:dp数组如何初始化第三步:确定遍历顺序第四步:举例推导dp数组 总结 最近有人询问我 LeetCode 「打家劫舍」系列问题(英文版叫 House Robber&…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

在 Vue 的template中使用 Pug 的完整教程
在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug? Pug(原名 Jade)是一种高效的网页模板引擎,通过缩进式语法和简洁的写法减少 HTML 的冗长代码。Pug 省略了尖括号和闭合标签,使用缩进定义结构,…...