当前位置: 首页 > news >正文

第一个Hadoop程序

编写和运行第一个 Hadoop 程序是学习 Hadoop 的重要步骤。以下是一个经典的“WordCount”程序示例,它统计文本文件中每个单词出现的次数。我们将使用 Java 编写 MapReduce 程序,并在 Hadoop 集群上运行它。

一、WordCount 程序概述

WordCount 是 Hadoop 的“Hello World”程序。它的基本逻辑如下:

  1. Mapper:读取输入文件,将每一行文本拆分为单词,并输出每个单词及其出现次数(初始为1)。
  2. Reducer:对每个单词的计数进行汇总,输出最终的单词频率。

二、编写 WordCount 程序

1. 创建 Java 项目

在本地开发环境中(如 IntelliJ IDEA 或 Eclipse)创建一个 Java 项目,并添加 Hadoop 的依赖库。你可以从 Hadoop 安装目录的 share/hadoop/commonshare/hadoop/mapreduce 中找到 JAR 文件。

2. 编写代码

以下是 WordCount 程序的完整代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.io.IOException;public class WordCount {// Mapper 类public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {// 将输入的文本行拆分为单词String[] words = value.toString().split("\\s+");for (String w : words) {word.set(w);context.write(word, one); // 输出单词及其计数(初始为1)}}}// Reducer 类public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get(); // 汇总每个单词的计数}result.set(sum);context.write(key, result); // 输出最终的单词及其计数}}// 主程序public static void main(String[] args) throws Exception {Configuration conf = new Configuration(); // 配置 Hadoop 环境Job job = Job.getInstance(conf, "word count"); // 创建一个作业job.setJarByClass(WordCount.class); // 设置作业的主类job.setMapperClass(TokenizerMapper.class); // 设置 Mapper 类job.setCombinerClass(IntSumReducer.class); // 设置 Combiner(可选)job.setReducerClass(IntSumReducer.class); // 设置 Reducer 类// 设置输出的键值对类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);// 设置输入和输出路径FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1); // 等待作业完成}
}
3. 编译和打包

将代码编译并打包为 JAR 文件。假设你的项目名为 WordCount,可以使用以下命令:

javac -classpath /path/to/hadoop-common.jar:/path/to/hadoop-mapreduce-client-core.jar -d ./out WordCount.java
jar -cvf WordCount.jar -C ./out/ .

三、运行 WordCount 程序

1. 上传输入文件

将一个文本文件上传到 HDFS,作为输入数据。例如:

hdfs dfs -mkdir /input
hdfs dfs -put /path/to/your/input.txt /input
2. 运行程序

使用 Hadoop 命令运行 WordCount 程序:

hadoop jar WordCount.jar WordCount /input /output
  • WordCount.jar 是打包后的 JAR 文件。
  • WordCount 是主类的名称。
  • /input 是输入目录。
  • /output 是输出目录(运行前确保该目录不存在)。
3. 查看结果

运行完成后,查看输出结果:

hdfs dfs -cat /output/part-r-00000

四、程序解释

  1. Mapper

    • 读取输入的文本行,将其拆分为单词。
    • 对每个单词输出键值对(单词,1)。
  2. Reducer

    • 对每个单词的计数进行汇总。
    • 输出最终的单词及其出现次数。
  3. Combiner(可选):

    • 在 Mapper 节点上对局部结果进行汇总,减少传输到 Reducer 的数据量。

五、常见问题

  1. 输入文件格式

    • 输入文件应为纯文本文件,每行包含一段文本。
  2. 输出目录

    • 输出目录不能预先存在,否则 Hadoop 会报错。
  3. 依赖冲突

    • 确保编译时的 Hadoop JAR 文件版本与集群中的 Hadoop 版本一致。

六、扩展

你可以尝试以下扩展:

  1. 优化性能:使用 Combiner 和 Partitioner。
  2. 处理更多文件:将多个文件放入输入目录。
  3. 自定义数据类型:使用 Hadoop 提供的其他数据类型(如 LongWritable)。

通过运行这个简单的 WordCount 程序,你可以熟悉 Hadoop 的 MapReduce 编程模型和运行流程。

相关文章:

第一个Hadoop程序

编写和运行第一个 Hadoop 程序是学习 Hadoop 的重要步骤。以下是一个经典的“WordCount”程序示例&#xff0c;它统计文本文件中每个单词出现的次数。我们将使用 Java 编写 MapReduce 程序&#xff0c;并在 Hadoop 集群上运行它。 一、WordCount 程序概述 WordCount 是 Hadoo…...

Leetcode 378-有序矩阵中第 K 小的元素

给你一个 n x n 矩阵 matrix &#xff0c;其中每行和每列元素均按升序排序&#xff0c;找到矩阵中第 k 小的元素。 请注意&#xff0c;它是 排序后 的第 k 小元素&#xff0c;而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n2) 的解决方案。 示例 1&#xff1…...

python之爬虫入门实例

链家二手房数据抓取与Excel存储 目录 开发环境准备爬虫流程分析核心代码实现关键命令详解进阶优化方案注意事项与扩展 一、开发环境准备 1.1 必要组件安装 # 安装核心库 pip install requests beautifulsoup4 openpyxl pandas# 各库作用说明&#xff1a; - requests&#x…...

第一个 C++ 程序

文章目录 “Hello, World!” 程序代码示例程序基本结构详细解释头文件&#xff08;#include <iostream>&#xff09;命名空间&#xff08;std&#xff09;主函数&#xff08;int main()&#xff09;输出语句&#xff08;std::cout << "Hello, World!" &l…...

深度学习篇---不同框架下的图像通道

文章目录 前言一、核心概念NCHWNHWCCHW 二、主流框架的通道顺序1.PyTorch默认格式特点调整方法 2.TensorFlow默认格式特点调整方法 3.Keras默认格式特点 4.PaddlePaddle默认格式特点调整方法 5.MXNet默认格式调整方法 6.ONNX默认格式特点 三、通道顺序的影响性能差异NCHWNHWC 框…...

在 C++ 中,通常会使用 `#define` 来定义宏,并通过这种方式发出警告或提示。

在 C++ 中,通常会使用 #define 来定义宏,并通过这种方式发出警告或提示。 如何实现 GBB_DEPRECATED_MSG 宏: 你可以通过以下方式定义一个宏,显示弃用警告: #include <iostream>// 定义一个宏,用来打印弃用警告 #define GBB_DEPRECATED_MSG(msg...

10x Research:Secured Finance 基于 FIL 的美元稳定币如何推动 Filecoin 生态系统发展

“众多与 Filecoin 数据进行互动的参与者&#xff0c;将从全新灵活性与金融化的体系中受益。” 在 10X Research 的最新研究内容中&#xff0c;揭示了在 Filecoin 生态系统内推出以美元计价的稳定币为用户带来的巨大增益。 Filecoin 是 Web3 中增长最快的平台之一&#xff0c…...

解决Spring Boot中LocalDateTime返回前端数据为数组结构的问题

在Spring Boot开发中&#xff0c;处理日期时间数据是一个常见的需求。Java 8 引入了新的日期时间API&#xff0c;如LocalDateTime&#xff0c;它提供了更强大的日期时间处理功能。然而&#xff0c;在将LocalDateTime对象序列化为JSON时&#xff0c;可能会遇到返回为数组结构的问…...

【Linux】进程间通信 续

目录 管道的原理&#xff08;匿名管道&#xff09; 核心原理 站在内核的角度看管道的本质 接口 创建管道文件 代码示例 管道的特征 管道读写端的四种情况 管道的应用场景 命令行的管道。 使用管道实现进程池 初始化 控制子进程 退出 命名管道 命名管道的理解 …...

心率提取,FFT

rPPG 信号提取&#xff1a; 从面部视频中提取 rPPG 信号&#xff0c;通常是通过对视频帧中的面部区域进行颜色通道分析&#xff0c;提取出反映血液容积变化的信号。 信号预处理&#xff1a; 对提取的 rPPG 信号进行滤波、归一化等预处理操作&#xff0c;以去除噪声和干扰。 心率…...

Data truncation: Out of range value for column ‘allow_invite‘ at row 1

由于前端传递的数值超过了mysql数据库中tinyint类型的取值范围&#xff0c;所以就会报错。 Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column allow_invite at row 1at com.mysql.cj.jdbc.exceptions.SQLExcept…...

ZYNQ-PL学习实践(二)按键和定时器控制LED闪烁灯

ZYNQ-PL学习实践&#xff08;二&#xff09;按键和定时器控制LED闪烁灯&#xff09; 1 创建工程2 verilog 代码3 约束4 综合5 生成bit总结 1 创建工程 2 verilog 代码 添加key_led.v 文件&#xff0c; module key_led(input sys_clk , //系统时钟50MHzinput …...

【CXX】4.4 其他构建系统

你需要至少完成以下三件事&#xff1a; 生成CXX生成的C绑定代码。 编译生成的C代码。 将生成的目标文件与你的其他C和Rust目标文件链接在一起。 并非所有构建系统都是平等的。如果你希望使用90年代的构建系统&#xff0c;尤其是如果你希望覆盖2个或更多构建系统&#xff08…...

windows 上删除 node_modules

在 Windows 11 上&#xff0c;你可以通过命令行来删除 node_modules 文件夹并清除 npm 缓存。以下是具体步骤&#xff1a; 删除 node_modules 打开命令提示符&#xff08;Command Prompt&#xff09;或终端&#xff08;PowerShell&#xff09;。 导航到项目目录。你可以使用 …...

mysql之如何获知版本

你可以通过在 MySQL 命令行客户端执行简单的 SQL 查询来获取 MySQL 的版本信息。以下是获取 MySQL 版本的常见方法&#xff1a; 使用 SELECT VERSION(); 查询&#xff1a; SELECT VERSION();执行这个查询后&#xff0c;MySQL 会返回一个字符串&#xff0c;其中包含了 MySQL 服…...

PHP 将图片url,写入到文件夹中,导出到zip下载到桌面

一&#xff1a;将图片写入到文件内 文件url&#xff1a;比如 【https://image.baidu.com/search/detail?ct503316480&z0&ipnfalse&word%E5%9B%BE%E7%89%87%E5%A4%B4%E5%83%8F&hs0&pn1&spn0&di7466852183703552001&pi0&rn1&tnbaiduima…...

系统架构设计师—计算机基础篇—文件管理

文章目录 文件结构逻辑结构物理结构文件的索引直接索引间接索引做题的方法 文件存储空间管理位示图 文件结构 文件的结构是指文件的组织形式。 逻辑结构 从用户角度看到的文件的组织形式。 用户知道文件名就可以存取文件中的信息。 物理结构 文件在文件存储器上的存放方式…...

【MySQL】用MySQL二进制包构建docker镜像

一、实验背景 【MySQL&docker】基于CentOS7.5 编译制作MySQL5.7.28镜像 https://www.jianshu.com/p/71fd79b69a6b 用MySQL源码编译的docker镜像&#xff0c;体积过大&#xff0c;直奔3G了&#xff0c;你也不清楚&#xff0c;这点编译参数打出的体积怎么就这么大&#xff01…...

C++ std::vector 超详细指南:基础实践(手搓vector)

目录 一.基本概念 二.类的常用接口说明 1.类对象的常见构造 2. vector类空间变化 1&#xff09;.size()&#xff08;获取数据个数&#xff09; 2&#xff09;.capacity()&#xff08;获取容量大小&#xff09; 3&#xff09;.empty()&#xff08;判断是否为空&#xff0…...

java面试复习巩固

韩顺平Java__哔哩哔哩_bilibili 1、Java中源文件中可以有多个类&#xff0c;最多只能有一个public类&#xff1f; 程序分为编译和执行两个阶段。 编译阶段 如果存在public类&#xff0c;那么一个源文件中只能够存在一个而且要与源文件的名字相同。----------否则编译会报错…...

《STL源码剖析》笔记记录

《STL源码剖析》笔记记录 2.空间适配器(allocator) 分配的是空间&#xff0c;而不一定是内存 为了精密分⼯&#xff0c;STL allocator 决定将这两个阶段操作区分开来。 1、对象构造由 ::construct() 负责&#xff1b;对象释放由 ::destroy() 负责。 2、内存配置由 alloc::al…...

《Linux C 智能 IO 矩阵:输入输出的自适应数据流转》

1. 标准库IO简介 标准库IO特点&#xff1a;通过操作系统提供的接口&#xff08;API&#xff09;和操作系统进行交互。&#xff08;接近100个函数&#xff09; 1.1. IO的过程 操作系统&#xff1a;向上为用户提供操作接口&#xff0c;向下为统筹控制硬件。 操作系统的组成&#…...

idea生成自定义Maven原型(archetype)项目工程模板

一、什么是Maven原型&#xff08;Maven archetype&#xff09; 引自官网的介绍如下&#xff1a; Maven原型插件官网地址 这里采用DeepSeek助手翻译如下&#xff1a; Maven 原型 什么是原型&#xff1f; 简而言之&#xff0c;原型是一个 Maven 项目模板工具包。原型被定义为一…...

CES Asia 2025增设未来办公教育板块,科技变革再掀高潮

作为亚洲消费电子领域一年一度的行业盛会&#xff0c;CES Asia 2025&#xff08;第七届亚洲消费电子技术贸易展&#xff09;即将盛大启幕。今年展会规模再度升级&#xff0c;预计将吸引超过500家全球展商参展&#xff0c;专业观众人数有望突破10万。除了聚焦人工智能、物联网、…...

(二 十 二)趣学设计模式 之 备忘录模式!

目录 一、 啥是备忘录模式&#xff1f;二、 为什么要用备忘录模式&#xff1f;三、 备忘录模式的实现方式四、 备忘录模式的优缺点五、 备忘录模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…...

物联网同RFID功能形态 使用场景的替代品

在物联网&#xff08;IoT&#xff09;和自动识别技术领域&#xff0c;除了RFID标签外&#xff0c;还有一些其他技术产品可以在形态和大小上与RFID标签相似&#xff0c;同时提供类似或更强大的功能。以下是几种能够替代RFID标签的产品&#xff1a; 一、NFC标签 NFC&#xff08;…...

蓝陵科技:以“数字底座”之力,全面布局影视行业工业化

“在数字技术与文化产业深度融合的今天&#xff0c;海南蓝陵数字科技有限公司&#xff08;以下简称蓝陵科技&#xff09;凭借其卓越的渲染实力和前瞻性的战略布局&#xff0c;正逐步成为推动中国影视行业工业化进程的重要力量。2025年2月&#xff0c;蓝陵科技不仅获得了陵水融媒…...

React + TypeScript 实战指南:用类型守护你的组件

TypeScript 为 React 开发带来了强大的类型安全保障&#xff0c;这里解析常见的一些TS写法&#xff1a; 一、组件基础类型 1. 函数组件定义 // 显式声明 Props 类型并标注返回值 interface WelcomeProps {name: string;age?: number; // 可选属性 }const Welcome: React.FC…...

本地部署大数据集群前置准备

1. 设置VMware网段 虚拟网络编辑器——更改设置——选择VMnet8——子网改成192.168.88.0——NAT设置——网关设置为192.168.88.2 2. 下载CentOS操作系统 下载CentOS 7.6(1810)版本 3. 在VMware中安装CentOS操作系统 创建新的虚拟机——典型——安装光盘映像文件——输入账…...

016.3月夏令营:数理类

016.3月夏令营&#xff1a;数理类&#xff1a; 中国人民大学统计学院&#xff1a; http://www.eeban.com/forum.php?modviewthread&tid386109 北京大学化学学院第一轮&#xff1a; http://www.eeban.com/forum.php?m ... 6026&extrapage%3D1 香港大学化学系夏令营&a…...

历年北京理工大学计算机复试上机真题

历年北京理工大学计算机复试上机真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 分段函数 题目描述 编写程序&#xff0c;计算下列分段函数 yf(x) 的值。 当 0< x <2&#xff0c;y -x2.5&#xff1b;当 2< x <4&#xff0c;y2-1.5(x-3)(x-3)…...

Linux的缓存I/O和无缓存IO

一、I/O缓存的背景 I/O缓存是指在内存里开辟一块区域&#xff0c;存放用来接收用户输入和用于计算机输出的数据&#xff0c;以减小系统开销和提高外设效率。linux对IO文件的操作分为不带缓存的IO操作和带缓存的IO操作&#xff08;标准IO操作&#xff09;。为什么存在C标准I/O库…...

题目 3216 ⭐团建⭐【DFS】蓝桥杯2024年第十五届省赛

小蓝正在和朋友们团建&#xff0c;有一个游戏项目需要两人合作&#xff0c;两个人分别拿到一棵大小为 n 和 m 的树&#xff0c;树上的每个结点上有一个正整数权值 c 1 , c 2 , ⋅ ⋅ ⋅ , c n c_1, c_2, , c_n c1​,c2​,⋅⋅⋅,cn​, d 1 , d 2 , ⋅ ⋅ ⋅ , d m d_1, d_…...

从0到1入门Linux

一、常用命令 ls 列出目录内容 cd切换目录mkdir创建新目录rm删除文件或目录cp复制文件或目录mv移动或重命名文件和目录cat查看文件内容grep在文件中查找指定字符串ps查看当前进程状态top查看内存kill终止进程df -h查看磁盘空间存储情况iotop -o直接查看比较高的磁盘读写程序up…...

战略合作升级 | 大势智慧携手广西地测院,共绘智慧测绘新蓝图

2月26日&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;与广西壮族自治区地理信息测绘院&#xff08;以下简称“广西地测院”&#xff09;在南宁举行战略合作升级签约仪式暨技术交流座谈会。 大势智慧董事长黄先锋与广西地测院党委书记、院…...

批量插入对比-mysql-oracle-sqlserver

单个插入mysql //单个 根据有值就插入&#xff0c;无值不改动 <insert id"insertOne" keyColumn"id" keyProperty"id"parameterType"com.test.log" useGeneratedKeys"true">insert into test_mysql_tab<trim p…...

jmeter阶梯式压测

1、安装plugins manager 链接 Install :: JMeter-Plugins.org 将下载下来的jar包放置在jemter文件的lib\ext下&#xff0c; 重启Jmeter 2、安装阶梯测试第三方插件 在Available Plugins中找到Custom Thread Groups&#xff0c;点击Apply Changes and Restart JMeter后等待插件…...

nginx.conf 完整配置总结概述

----------------------------------------------------------- /usr/local/nginx/sbin/nginx -s reload # 重新载入配置文件 /usr/local/nginx/sbin/nginx -s reopen # 重启 Nginx /usr/local/nginx/sbin/nginx -s stop # 停止 Nginx /usr/local/nginx/sbin/nginx …...

docker常规命令和高级用法

Docker 是一个强大的容器化平台&#xff0c;提供了丰富的命令和功能来管理容器、镜像、网络和存储等。以下是一些常用的 Docker 命令及其高级用法。 1. 容器管理 1.1 启动容器 基本用法&#xff1a; docker run <image_name>示例&#xff1a; docker run ubuntu高级用法…...

Spark核心之02:常用算子详解

1、RDD操作详解 # 启动spark-shell spark-shell --master local[2] 1.1 基本转换 1) map map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。 任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。 举例&#xff1a; scala> val a sc.parallelize(1 …...

【CSS—前端快速入门】CSS 常用样式

CSS 常用 CSS 样式 1. 前端样式查询网站&#xff1a; MDN Web Docs (mozilla.org) w3school 2. border 2.1 借助 MDN 了解 border 我们借助 MDN 网站来学习 border 样式的使用&#xff1a; 2.2 border 常见属性 保存代码&#xff0c;打开页面&#xff1a; 对于标签不同样式的…...

探索DeepSeek-R1的核心秘诀:突破SFT技术的新篇章

摘要 近期&#xff0c;一种显著超越SFT&#xff08;Sequence-to-Sequence with Teacher Forcing&#xff09;的技术成为研究焦点。作为o1/DeepSeek-R1的核心秘诀&#xff0c;该技术不仅提升了模型性能&#xff0c;还成功应用于多模态大型模型中&#xff0c;实现了功能扩展。与传…...

DailyNotes 增加提醒功能

TODO&#xff1a;准备给 DailyNotes 增加一个提醒功能&#xff0c;准备接入 AI 来做一些事情。试了一下&#xff0c;非常靠谱。 具体 DailyNotes 和 Ollama 的交互方式&#xff0c;可以直接调用命令行&#xff0c;也可以走网络API。 rayuK2CD9WCYN4 ~ % ollama run deepseek-…...

[Computer Vision]实验六:视差估计

目录 一、实验内容 二、实验过程 2.1.1 test.py文件 2.1.2 test.py文件结果与分析 2.2.1 文件代码 2.2.2 结果与分析 一、实验内容 给定左右相机图片&#xff0c;估算图片的视差/深度&#xff1b;体现极线校正&#xff08;例如打印前后极线对&#xff09;、同名点匹配…...

软件测试基础:功能测试知识总结

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中…...

171. Excel 表列序号

Excel 表列序号 题目描述尝试做法推荐做法 题目描述 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: colum…...

03.05 QT事件

实现一个绘图工具&#xff0c;具备以下功能&#xff1a; 鼠标绘制线条。 实时调整线条颜色和粗细。 橡皮擦功能&#xff0c;覆盖绘制内容。 撤销功能&#xff0c;ctrl z 快捷键撤销最后一笔 程序代码&#xff1a; <1> Widget.h: #ifndef WIDGET_H #define WIDGET…...

es如何进行refresh?

在 Elasticsearch 中,refresh 操作的作用是让最近写入的数据可以被搜索到。以下为你介绍几种常见的执行 refresh 操作的方式: 1. 使用 RESTful API 手动刷新 你可以通过向 Elasticsearch 发送 HTTP 请求来手动触发 refresh 操作。可以针对单个索引、多个索引或者所有索引进…...

unity6 打包webgl注意事项

webgl使用资源需要异步加载 使用localization插件时要注意&#xff0c;webgl不支持WaitForCompletion&#xff0c;LocalizationSettings.InitializationOperation和LocalizationSettings.StringDatabase.GetTable都不能用 web里想要看到具体的报错信息调试开启这两个&#xf…...

【前端基础】Day 9 PC端品优购项目

目录 1. 品优购项目规划 1.1 网站制作流程 1.2 品优购项目整体介绍 1.3 学习目的 1.4 开发工具以及技术栈 1.5 项目搭建工作 1.6 网站favicon图标 1.7 网站TDK三大标签SEO优化 2. 品优购首页制作 2.1 常见模块类命名 2.2 快捷导航shortcut制作 2.3 header制作 2.4…...