<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>总结 on LeoChu Space</title>
    <link>https://leochu.work/blog/tags/%E6%80%BB%E7%BB%93/</link>
    <description>Recent content in 总结 on LeoChu Space</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 08 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://leochu.work/blog/tags/%E6%80%BB%E7%BB%93/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>LDAP 简明科普</title>
      <link>https://leochu.work/blog/tech/engineering/ldap-%E7%AE%80%E6%98%8E%E7%A7%91%E6%99%AE/</link>
      <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/ldap-%E7%AE%80%E6%98%8E%E7%A7%91%E6%99%AE/</guid>
      <description>&lt;h2 id=&#34;1-什么是-ldap&#34;&gt;1. 什么是 LDAP&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;LDAP（Lightweight Directory Access Protocol）&lt;/strong&gt; 是一种用于&lt;strong&gt;查询和管理目录信息的协议&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;简单说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LDAP 是一个“按层级组织的用户信息数据库 + 查询方式”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-ldap-存什么&#34;&gt;2. LDAP 存什么&lt;/h2&gt;
&lt;p&gt;常见内容包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户账号（用户名、ID）&lt;/li&gt;
&lt;li&gt;密码（加密存储）&lt;/li&gt;
&lt;li&gt;用户组（权限）&lt;/li&gt;
&lt;li&gt;部门 / 组织结构&lt;/li&gt;
&lt;li&gt;邮箱、电话等信息&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-数据结构像树&#34;&gt;3. 数据结构（像树）&lt;/h2&gt;
&lt;p&gt;LDAP 的数据是&lt;strong&gt;树状结构&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph TD
A[公司] --&amp;gt; B[技术部]
A --&amp;gt; C[人事部]
B --&amp;gt; D[用户A]
B --&amp;gt; E[用户B]
C --&amp;gt; F[用户C]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每个节点都有唯一标识（DN）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-ldap-能做什么&#34;&gt;4. LDAP 能做什么&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用户登录认证（验证账号密码）&lt;/li&gt;
&lt;li&gt;查询用户信息&lt;/li&gt;
&lt;li&gt;管理组织结构&lt;/li&gt;
&lt;li&gt;权限分组管理&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-常见使用场景&#34;&gt;5. 常见使用场景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;公司统一账号系统&lt;/li&gt;
&lt;li&gt;内部系统登录（单点登录基础）&lt;/li&gt;
&lt;li&gt;权限集中管理&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-常见实现&#34;&gt;6. 常见实现&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OpenLDAP&lt;/li&gt;
&lt;li&gt;Active Directory（微软）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-一句话总结&#34;&gt;7. 一句话总结&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;LDAP 是一个“按树组织的用户信息数据库 + 查询协议”，用于统一管理账号和组织结构&lt;/p&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>SSH、跳板机和隧道</title>
      <link>https://leochu.work/blog/tech/engineering/ssh%E8%B7%B3%E6%9D%BF%E6%9C%BA%E5%92%8C%E9%9A%A7%E9%81%93/</link>
      <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/ssh%E8%B7%B3%E6%9D%BF%E6%9C%BA%E5%92%8C%E9%9A%A7%E9%81%93/</guid>
      <description>&lt;h2 id=&#34;1-ssh-是什么&#34;&gt;1. SSH 是什么&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SSH（Secure Shell）&lt;/strong&gt; 是一种用于远程登录和通信的加密协议。&lt;/p&gt;
&lt;h3 id=&#34;核心作用&#34;&gt;核心作用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;远程登录服务器&lt;/li&gt;
&lt;li&gt;执行命令&lt;/li&gt;
&lt;li&gt;安全传输数据&lt;/li&gt;
&lt;li&gt;建立加密通道&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;简单理解&#34;&gt;简单理解&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;就像一根“加密的远程操作线”，你在本地操作，实际在远程执行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;图示&#34;&gt;图示&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
A[本地电脑] -- SSH连接 --&amp;gt; B[远程服务器]
A --&amp;gt;|输入命令| B
B --&amp;gt;|返回结果| A
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id=&#34;2-跳板机bastion-host是什么&#34;&gt;2. 跳板机（Bastion Host）是什么&lt;/h2&gt;
&lt;p&gt;跳板机是一台&lt;strong&gt;中间服务器&lt;/strong&gt;，用于访问内网机器。&lt;/p&gt;
&lt;h3 id=&#34;为什么需要&#34;&gt;为什么需要&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;内网服务器不能直接暴露到公网&lt;/li&gt;
&lt;li&gt;提供统一入口（安全控制、审计）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;简单理解-1&#34;&gt;简单理解&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;像“门卫”，必须先经过它，才能进入内部系统。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;图示-1&#34;&gt;图示&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
A[本地电脑] --&amp;gt; B[跳板机]
B --&amp;gt; C[内网服务器]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;常见连接方式&#34;&gt;常见连接方式&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ssh -J user@跳板机 user@内网服务器&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-隧道ssh-tunnel是什么&#34;&gt;3. 隧道（SSH Tunnel）是什么&lt;/h2&gt;
&lt;p&gt;SSH 隧道是一种通过 SSH 转发网络流量的技术。&lt;/p&gt;
&lt;h3 id=&#34;本质&#34;&gt;本质&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;把本地请求“通过 SSH 转发到远程”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;31-本地端口转发local-forward&#34;&gt;3.1 本地端口转发（Local Forward）&lt;/h2&gt;
&lt;h3 id=&#34;示例&#34;&gt;示例&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ssh -L 3307:127.0.0.1:3306 user@服务器&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>加密体系</title>
      <link>https://leochu.work/blog/tech/engineering/%E5%8A%A0%E5%AF%86%E4%BD%93%E7%B3%BB/</link>
      <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/%E5%8A%A0%E5%AF%86%E4%BD%93%E7%B3%BB/</guid>
      <description>&lt;h2 id=&#34;1-三个核心问题&#34;&gt;1. 三个核心问题&lt;/h2&gt;
&lt;p&gt;整个体系其实在解决三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;你是谁？（身份认证）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据能不能被偷看？（加密传输）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何安全地交换密钥？（密钥分发）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-非对称加密公钥--私钥&#34;&gt;2. 非对称加密（公钥 / 私钥）&lt;/h2&gt;
&lt;h3 id=&#34;核心定义&#34;&gt;核心定义&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;使用一对密钥：公钥 + 私钥&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;公钥：可以公开&lt;/li&gt;
&lt;li&gt;私钥：必须保密&lt;/li&gt;
&lt;li&gt;二者不可互相推导&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;两种用途关键区分&#34;&gt;两种用途（关键区分）&lt;/h3&gt;
&lt;h4 id=&#34;-加密通信&#34;&gt;① 加密通信&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;graph LR
A[发送方] --&amp;gt;|公钥加密| B[密文]
B --&amp;gt; C[接收方]
C --&amp;gt;|私钥解密| D[明文]
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h4 id=&#34;-身份认证ssh&#34;&gt;② 身份认证（SSH）&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;sequenceDiagram
participant A as 客户端（私钥）
participant B as 服务器（公钥）

B-&amp;gt;&amp;gt;A: challenge
A-&amp;gt;&amp;gt;B: signature
B-&amp;gt;&amp;gt;B: 公钥验证
B-&amp;gt;&amp;gt;A: 通过/拒绝
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h3 id=&#34;关键公式&#34;&gt;关键公式&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;signature = Sign(私钥, challenge)&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Verify(公钥, challenge, signature) = true&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;本质总结&#34;&gt;本质总结&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;私钥负责“生成证明”，公钥负责“验证证明”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-ssh基于签名的认证机制&#34;&gt;3. SSH：基于签名的认证机制&lt;/h2&gt;
&lt;h3 id=&#34;文件结构&#34;&gt;文件结构&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/.ssh/id_ed25519      &lt;span style=&#34;color:#75715e&#34;&gt;# 私钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/.ssh/id_ed25519.pub  &lt;span style=&#34;color:#75715e&#34;&gt;# 公钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;~/.ssh/authorized_keys &lt;span style=&#34;color:#75715e&#34;&gt;# 服务器保存公钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;免密登录本质&#34;&gt;免密登录本质&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;服务器信任“某个公钥”，允许对应私钥登录&lt;/p&gt;</description>
    </item>
    <item>
      <title>博客标签设计</title>
      <link>https://leochu.work/blog/ideas/%E5%8D%9A%E5%AE%A2%E6%A0%87%E7%AD%BE%E8%AE%BE%E8%AE%A1/</link>
      <pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/ideas/%E5%8D%9A%E5%AE%A2%E6%A0%87%E7%AD%BE%E8%AE%BE%E8%AE%A1/</guid>
      <description>&lt;h2 id=&#34;一设计原则&#34;&gt;一、设计原则&lt;/h2&gt;
&lt;p&gt;标签用于表达文章的“内容特征”，而不是分类。&lt;/p&gt;
&lt;p&gt;分类（categories）用于表示文章所属目录（放在哪），标签（tags）用于描述文章内容（讲什么）。&lt;/p&gt;
&lt;p&gt;标签统一为单层结构，不做层级划分。&lt;/p&gt;
&lt;p&gt;标签体系同时服务两种需求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览：快速理解文章内容&lt;/li&gt;
&lt;li&gt;检索：精确定位知识点&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二标签分类逻辑分层&#34;&gt;二、标签分类（逻辑分层）&lt;/h2&gt;
&lt;h3 id=&#34;1-技术类标签核心索引&#34;&gt;1. 技术类标签（核心索引）&lt;/h3&gt;
&lt;p&gt;用于标识具体技术或组件，可包含低频标签：&lt;/p&gt;
&lt;p&gt;JVM&lt;br&gt;
Java&lt;br&gt;
Python&lt;br&gt;
Django&lt;br&gt;
Git&lt;br&gt;
Maven&lt;br&gt;
Linux&lt;/p&gt;
&lt;p&gt;Hive&lt;br&gt;
Spark&lt;br&gt;
Kafka&lt;br&gt;
Flink&lt;br&gt;
Hadoop&lt;br&gt;
Yarn&lt;br&gt;
Flume&lt;br&gt;
Presto
ClickHouse&lt;/p&gt;
&lt;p&gt;MySQL&lt;br&gt;
MongoDB&lt;br&gt;
Elasticsearch&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;说明：&lt;br&gt;
技术标签允许低频存在，用于精确检索，不需要强制精简。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&#34;2-内容类型标签高频-&#34;&gt;2. 内容类型标签（高频 ⭐）&lt;/h3&gt;
&lt;p&gt;用于标识文章表达形式：&lt;/p&gt;
&lt;p&gt;速查&lt;br&gt;
总结&lt;br&gt;
原理&lt;br&gt;
教程&lt;br&gt;
配置&lt;br&gt;
调优&lt;br&gt;
源码&lt;/p&gt;
&lt;p&gt;笔记&lt;br&gt;
摘录&lt;br&gt;
记录&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;3-场景类标签中频&#34;&gt;3. 场景类标签（中频）&lt;/h3&gt;
&lt;p&gt;用于标识问题或使用场景：&lt;/p&gt;
&lt;p&gt;踩坑&lt;br&gt;
实战&lt;br&gt;
排错&lt;br&gt;
面试&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-通用认知标签非技术内容-&#34;&gt;4. 通用认知标签（非技术内容 ⭐）&lt;/h3&gt;
&lt;p&gt;用于 reading / thoughts / ideas：&lt;/p&gt;
&lt;p&gt;思考&lt;br&gt;
认知&lt;br&gt;
学习&lt;/p&gt;
&lt;p&gt;产品&lt;br&gt;
副业&lt;/p&gt;
&lt;p&gt;灵感&lt;br&gt;
想法&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三使用规范重点&#34;&gt;三、使用规范（重点）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;每篇文章建议使用 2～5 个标签&lt;/li&gt;
&lt;li&gt;建议组合：
&lt;ul&gt;
&lt;li&gt;1～2 个技术标签（可低频）&lt;/li&gt;
&lt;li&gt;1 个类型标签（必选）&lt;/li&gt;
&lt;li&gt;可选 1 个场景或认知标签&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;技术标签优先表达“具体技术点”&lt;/li&gt;
&lt;li&gt;类型标签控制文章表达形式（避免缺失）&lt;/li&gt;
&lt;li&gt;避免重复语义标签（如：调优 vs 优化，仅保留调优）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四示例&#34;&gt;四、示例&lt;/h2&gt;
&lt;h3 id=&#34;示例-1git-命令速查&#34;&gt;示例 1：Git 命令速查&lt;/h3&gt;
&lt;p&gt;tags:&lt;/p&gt;</description>
    </item>
    <item>
      <title>jdk8和jdk8u有什么区别</title>
      <link>https://leochu.work/blog/tech/java/jdk8%E5%92%8Cjdk8u%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB/</link>
      <pubDate>Sat, 29 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/java/jdk8%E5%92%8Cjdk8u%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB/</guid>
      <description>&lt;p&gt;JDK 8 代表的是一个大版本的更新，你可以理解成定义好了框架和实现&lt;/p&gt;
&lt;p&gt;JDK 8u代表的是基于JDK 8的后续小版本的迭代，里面不会有 JDK 8 标准之外的内容，只会包含一些安全性，性能等方面的修改，例如某个Class的实现优化&lt;/p&gt;
&lt;h3 id=&#34;观点一&#34;&gt;观点一&lt;/h3&gt;
&lt;p&gt;一般来说，建议选用大版本下面最新的u版本，比如你要选择 JDK 8 ，那么就选择 JDK 8u281，这个是目前8这个大版本的最新版本，原因是里面会修复和优化前序版本的一些问题&lt;/p&gt;
&lt;h3 id=&#34;观点二&#34;&gt;观点二&lt;/h3&gt;
&lt;p&gt;正常来说，应该使用OpenJDK8。&lt;/p&gt;
&lt;p&gt;OpenJDK8u是一些后期维护，一些特性并不是想要的。&lt;/p&gt;
&lt;h3 id=&#34;观点三&#34;&gt;观点三&lt;/h3&gt;
&lt;p&gt;对于jdk8u&lt;/p&gt;
&lt;p&gt;这个最新的免费版本号，其实包括了两个，8u201和8u202，这个就是JDK版本号的命名问题了。从2014年10月发布Java SE 7 Update 71(Java SE 7u71)开始，Oracle在发布Oracle JDK关键补丁更新(CPUs：Critical Patch Updates)的同时一般会发布相应的补丁集更新(PSUs：Patch Set Updates)。其中Oracle JDK关键补丁更新(CPUs)包含安全漏洞修复和重要漏洞修复，Oracle强烈建议所有Oracle JDK用户及时升级到最新的CPU版本，Oracle JDK 关键补丁更新(CPUs)版本号采用奇数编号。Oracle JDK补丁集更新(PSUs)包含相应CPUs中的所有修复以及其他非重要修复，仅当受到Oracle JDK关键补丁更新(CPUs)版本之外的其他漏洞的影响时才应当使用相应的补丁集更新 (PSUs)，Oracle JDK补丁集更新(PSUs)版本号采用偶数编号。因此，一般情况下我们只要下载奇数编号的最新版本更新就行了。&lt;/p&gt;
&lt;p&gt;简单来讲，Oracle将奇数版本作为BUG修正并全部通过检验的版本，Oracle官方建议用在生产环境最好使用这个版本。Oracle会在奇数版本之后同时发布一个偶数版本，偶数版本包含了奇数版本所有的内容，以及未被验证的BUG修复，Oracle官方建议，除非你受到未验证BUG影响，急需BUG修复才使用这个版本。因此，8u201是CPUs，关键补丁更新。8u202是PSUs，补丁集更新，推荐下载8u201。&lt;/p&gt;</description>
    </item>
    <item>
      <title>部署CDH踩坑总结</title>
      <link>https://leochu.work/blog/tech/bigdata/%E9%83%A8%E7%BD%B2cdh%E8%B8%A9%E5%9D%91%E6%80%BB%E7%BB%93/</link>
      <pubDate>Sat, 08 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/bigdata/%E9%83%A8%E7%BD%B2cdh%E8%B8%A9%E5%9D%91%E6%80%BB%E7%BB%93/</guid>
      <description>&lt;p&gt;1.zookeeper刚启动时会报错，晾它两分钟会就好了&lt;/p&gt;
&lt;p&gt;2.更改或迁移服务时一定要切换到维护模式并停止当前服务！！！&lt;/p&gt;
&lt;p&gt;3.cdh01的hadoop组件起不来，原因是一些文件夹的权限问题，更改权限并且更改拥有者及组（参照其他服务器）&lt;/p&gt;
&lt;p&gt;4.内存不足主要因为NodeManager内存调的太高，调小即可（个人经验，5台机器可用内存和为30*4+20=160G，可同时对20G的数据做处理，感觉够用了）&lt;/p&gt;
&lt;p&gt;5.oozie报错：Failed to install Oozie ShareLib，这个问题是cdh6.2的通病，只要安装oozie就会 出现(无论是升级，还是新装。&lt;/p&gt;
&lt;p&gt;解决：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd /opt/cloudera/parcels/CDH/lib/oozie/libtools&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ln -s ../../../jars/logredactor-2.0.7.jar logredactor-2.0.7.jar&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;执行完后重启oozie。&lt;/p&gt;
&lt;p&gt;6.oozie端口号11000冲突，改为11002&lt;/p&gt;
&lt;p&gt;7.从节点不要提前安装agent服务！！！直接在web界面安装！&lt;/p&gt;
&lt;p&gt;8.把CM和CDH装好后面就轻松多了&lt;/p&gt;
&lt;p&gt;9.==主机名不要出现下划线!==&lt;/p&gt;</description>
    </item>
    <item>
      <title>指标字典</title>
      <link>https://leochu.work/blog/tech/bigdata/%E6%8C%87%E6%A0%87%E5%AD%97%E5%85%B8/</link>
      <pubDate>Sat, 11 May 2024 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/bigdata/%E6%8C%87%E6%A0%87%E5%AD%97%E5%85%B8/</guid>
      <description>&lt;h2 id=&#34;1指标字典&#34;&gt;&lt;strong&gt;1.指标字典&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;指标字典，是业务数据标准化的基础，目的是对指标进行统一管理，方便共享达成对业务指标的共识，并且统一修改和维护。指标字典可以更新在 Excel或者Wiki中。如果有足够多的资源，那么开发指标管理模块可以放在数据管理系统中再配合血缘关系，就可以很方便追踪数据流转了。&lt;/p&gt;
&lt;h3 id=&#34;11设计指标字典的主要目的&#34;&gt;&lt;strong&gt;1.1设计指标字典的主要目的：&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;(1)规范维度和量度命名，命名规则要尽量做到明确、通用、易懂。&lt;/p&gt;
&lt;p&gt;(2)对维度或量度统一计算口径，避免岐义。&lt;/p&gt;
&lt;p&gt;(3)涵盖尽可能多的关注的核心维度和量度，以此为基础推动数据建设，确保指标字典里覆盖的维度都可区分、指标都可统计&lt;/p&gt;
&lt;p&gt;(4)基于指标字典，将核心维度和量度注入元数据中心，接入指标提取工具，后续实现不需要写QL语句即可完成自査询及分析需求&lt;/p&gt;
&lt;p&gt;指标字典的建立，是搭建数据平台的基础。&lt;/p&gt;
&lt;h3 id=&#34;12指标量度和维度的相关概念&#34;&gt;&lt;strong&gt;1.2指标、量度和维度的相关概念&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;121-指标&#34;&gt;&lt;strong&gt;1.2.1 指标:&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;定义：衡量目标的方法&lt;/p&gt;
&lt;p&gt;构成要素：维度+汇总方式+量度&lt;/p&gt;
&lt;p&gt;（1）维度=哪些角度去看问题&lt;/p&gt;
&lt;p&gt;（2）汇总方式=哪些方法衡量问题&lt;/p&gt;
&lt;p&gt;（3）量度=目标是什么问题&lt;/p&gt;
&lt;h4 id=&#34;122-维度&#34;&gt;&lt;strong&gt;1.2.2 维度：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;定义：看问题的角度和方向，例如我要从年份看毛衣的销量，那么年份就是我看问题的角度&lt;/p&gt;
&lt;h4 id=&#34;123-量度&#34;&gt;&lt;strong&gt;1.2.3 量度：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;定义：对一个物理量的测定，通常数字+计算单位表示。例如，金额，次数，率&lt;/p&gt;
&lt;h3 id=&#34;13-指标定义规范&#34;&gt;&lt;strong&gt;1.3 指标定义规范&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;131怎么定义一个合格的指标字典需要遵守什么规范&#34;&gt;&lt;strong&gt;1.3.1怎么定义一个合格的指标字典？需要遵守什么规范？&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;一个指标一经录入，它的命名和所有下钻维度的口径都已确定(默认口径)，这称为指标的一义性。&lt;br&gt;
例如，“交易额”这个指标默认的时间口径是：支付时间，默认的城市口径是：下单所在城市等。&lt;br&gt;
如果需要按下单时间口径看订单金额，我们定义了一个新的指标“下单交易额”。一个在某些维度上口径不确定的“指标”是不能被使用的，在业务场景中是毫无意义的。&lt;/p&gt;
&lt;h4 id=&#34;132指标一般分为基础指标普通指标和计算指标三类&#34;&gt;&lt;strong&gt;1.3.2指标一般分为基础指标、普通指标和计算指标三类。&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id=&#34;1321基础指标&#34;&gt;&lt;strong&gt;1.3.2.1基础指标&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;例如，“交易额”作为一个基于单纯实体的属性的简单计算，它没有更上游的指标，即它的父指标是它自身。我们称这样的指标为基础指标。&lt;/p&gt;
&lt;h5 id=&#34;1322普通指标&#34;&gt;&lt;strong&gt;1.3.2.2.普通指标&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;所谓普通指标，即在单一父指标的基础上通过一些维度上的取值限定可以定义的指标。&lt;br&gt;
例如，对于购买中PC端首次购买用户数，限制条件为首次购买用户中下单平台＝PC。&lt;/p&gt;
&lt;h5 id=&#34;1323计算指标&#34;&gt;&lt;strong&gt;1.3.2.3.计算指标&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;可以在若干个注册指标之上通过四则运算、排序、累计或汇总定义出的指标称为计算指标。&lt;/p&gt;
&lt;h3 id=&#34;14量度和维度都考虑好了在构建一个指标字典时我们应该考虑哪些要素呢&#34;&gt;&lt;strong&gt;1.4量度和维度都考虑好了，在构建一个指标字典时我们应该考虑哪些要素呢?&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;141指标字典要素如下&#34;&gt;&lt;strong&gt;1.4.1指标字典要素如下：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img alt=&#34;Pasted image 20260323095931.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020260323095931.png&#34;&gt;&lt;/p&gt;
&lt;h4 id=&#34;142通常指标字典包含指标维度和指标量度两个部分如下&#34;&gt;&lt;strong&gt;1.4.2通常指标字典包含指标维度和指标量度两个部分，如下：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;img alt=&#34;Pasted image 20260323095936.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020260323095936.png&#34;&gt;
&lt;img alt=&#34;Pasted image 20260323095940.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020260323095940.png&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;总结&#34;&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;通过上面的步骤和方法，根据自身业务情况，建立一个指标字典。&lt;/p&gt;
&lt;p&gt;指标字典在建立知乎，要经过各个业务产品经理的评审，纠正错误不明或者有歧义的指标，在达成一致后，由数据产品推广，共大家参考使用。&lt;/p&gt;
&lt;p&gt;好的指标字典就像二叉树一样，从单维度，粗糙维度分析，再细拆维度。看问题需要：由大到小，由内到外。&lt;/p&gt;</description>
    </item>
    <item>
      <title>restful风格</title>
      <link>https://leochu.work/blog/tech/engineering/restful%E9%A3%8E%E6%A0%BC/</link>
      <pubDate>Sat, 13 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/restful%E9%A3%8E%E6%A0%BC/</guid>
      <description>&lt;h3 id=&#34;一什么是-rest-一种软件架构风格&#34;&gt;一、什么是 REST ？（一种软件架构风格）&lt;/h3&gt;
&lt;p&gt;缩写：REST （不是&amp;quot;rest&amp;quot;这个单词）
外文名：Representational State Transfer，简称REST。
中文名：表现层状态转移。&lt;/p&gt;
&lt;p&gt;提出时间：2000年。
属性：一种软件架构风格。（以Web为平台的。web服务的架构风格，前后端接口时候用到。）&lt;/p&gt;
&lt;p&gt;REST之所以晦涩难懂，是因为前面主语（Resource ）被去掉了。
全称是： Resource Representational State Transfer。
通俗来讲就是：资源在网络中以某种表现形式进行状态转移。&lt;/p&gt;
&lt;p&gt;分解开来讲解:
Resource：资源，即数据（这是网络的核心）；
Representational：某种表现形式，比如用JSON，XML，JPEG等；
State Transfer：状态变化。通过HTTP的动词（get查询、post新增、put修改、delete删除）实现。&lt;/p&gt;
&lt;p&gt;一句话描述 REST 实质：&lt;br&gt;
URL 中只使用名词来定位资源，用 HTTP 协议里的动词（GET、POST、PUT、DELETE）来实现资源的增删改查操作。&lt;/p&gt;
&lt;p&gt;什么意思呢？&lt;/p&gt;
&lt;p&gt;比如，我们有一个 friends 接口，对于 “朋友” 我们有增删改查四种操作，怎么定义 REST 接口？&lt;/p&gt;
&lt;p&gt;增加一个朋友，uri: generalcode.cn/v1/friends 接口类型：POST&lt;br&gt;
删除一个朋友，uri: generalcode.cn/va/friends 接口类型：DELETE（在 http 的 parameter 指定好友 id）&lt;br&gt;
修改一个朋友，uri: generalcode.cn/va/friends 接口类型：PUT（在 http 的 parameter 指定好友 id）&lt;br&gt;
查找一个朋友，uri: generalcode.cn/va/friends 接口类型：GET&lt;/p&gt;
&lt;p&gt;上面我们定义的四个接口就是符合 REST 协议的，请注意，这几个接口都没有动词，只有名词 friends，都是通过 Http 请求的接口类型来判断是什么业务操作。&lt;/p&gt;
&lt;p&gt;举个反例：
generalcode.cn/va/deleteFriends 该接口用来表示删除朋友，这就是不符合REST协议的接口。
不能用deleteFriends ，而应该就用friends + http请求的delete方式。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ai栈</title>
      <link>https://leochu.work/blog/tech/ai/ai%E6%8A%80%E6%9C%AF%E6%A0%88/</link>
      <pubDate>Sat, 06 Jan 2024 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/ai/ai%E6%8A%80%E6%9C%AF%E6%A0%88/</guid>
      <description>&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;任务类型&lt;/th&gt;
          &lt;th&gt;工具 / 模型&lt;/th&gt;
          &lt;th&gt;说明 / 能力边界&lt;/th&gt;
          &lt;th&gt;成本&lt;/th&gt;
          &lt;th&gt;厂商&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;文档整理 / 项目重构 / 架构设计&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Claude Code（基于 Claude Opus）&lt;/td&gt;
          &lt;td&gt;高质量理解长上下文，支持跨文件重构和工程分析；生成方案/代码，但需要外部环境执行&lt;/td&gt;
          &lt;td&gt;pro订阅&lt;/td&gt;
          &lt;td&gt;claude&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;写代码 / 单文件实现&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;OpenAI Codex（GPT-Code 系列）&lt;/td&gt;
          &lt;td&gt;自动生成可运行代码，适合函数、模块、脚本任务；执行依赖你的环境或接口&lt;/td&gt;
          &lt;td&gt;plus订阅&lt;/td&gt;
          &lt;td&gt;openAi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;实时代码辅助 / IDE 提示&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;GitHub Copilot&lt;/td&gt;
          &lt;td&gt;IDE 插件，提供智能补全和片段建议，不提供 API&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;对话 / 问答 /策略讨论&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;ChatGPT Plus&lt;/td&gt;
          &lt;td&gt;快速交互、概念解释、方案讨论&lt;/td&gt;
          &lt;td&gt;plus订阅&lt;/td&gt;
          &lt;td&gt;openAi&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;机械重复 / 简单批处理任务&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;国内轻量模型&lt;/td&gt;
          &lt;td&gt;低成本处理大量重复操作或简单格式化任务&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;miniMax&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;自动化执行 / 跨渠道智能代理&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;OpenClaw&lt;/td&gt;
          &lt;td&gt;可自托管的 AI Agent 框架；整合多模型、消息渠道和技能；能持续管理任务、执行脚本、调用 API 和操作工具；适合自动化工作流和多通道触发，需配置和监管&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;</description>
    </item>
    <item>
      <title>开发流程</title>
      <link>https://leochu.work/blog/tech/engineering/%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B/</link>
      <pubDate>Sun, 12 Nov 2023 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B/</guid>
      <description>&lt;h2 id=&#34;1-开发流程&#34;&gt;1. 开发流程&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img alt=&#34;Pasted image 20230327103333.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020230327103333.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;**说明：**此开发流程符合大部分需求场景，少数需求可能流程会有所增减。&lt;/p&gt;
&lt;h2 id=&#34;2-流程说明&#34;&gt;2. 流程说明&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id=&#34;21-需求评审&#34;&gt;2.1 需求评审&lt;/h4&gt;
&lt;p&gt;详细了解本次需求的背景和细节，并讨论需求的可行性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;比如：&lt;/strong&gt;     &lt;/p&gt;
&lt;p&gt;当前需求是否明确? 新需求是什么?&lt;br&gt;
需求背景及解决什么问题?&lt;br&gt;
如果需求复杂程度大，提出是否需要分阶段实施?&lt;br&gt;
需求完成的期望指标是什么? 如何评判? 如何交付?&lt;br&gt;
技术能否实现、逻辑是否有问题？&lt;br&gt;
进入开发阶段测试，遇到问题与谁对接，来协调解决问题?&lt;br&gt;
如果需求复杂请让需求方拆解需求去描述要达到的目的。&lt;br&gt;
如果需求未做到目的明确，清晰合理，请让需求方解决疑问点。&lt;br&gt;
需求对接完，请邮件告知。&lt;/p&gt;
&lt;h4 id=&#34;22-技术评审&#34;&gt;2.2 技术评审&lt;/h4&gt;
&lt;p&gt;阐述详细的技术实现方案，评估一下是否有不合理之处，比如表结构如何设计、接口怎么定义、有没有技术难点等。&lt;/p&gt;
&lt;h4 id=&#34;23-开发--测试排期&#34;&gt;2.3 开发 &amp;amp; 测试排期&lt;/h4&gt;
&lt;p&gt;评估具体的工作量，根据工作量安排各个步骤要完成的截止日期。&lt;/p&gt;
&lt;h4 id=&#34;24-输出开发设计文档&#34;&gt;2.4 输出开发设计文档&lt;/h4&gt;
&lt;p&gt;此文档放在 confluence 上，大致包含需求背景、开发设计（技术方案）、排期计划、开发流程的具体内容、附录等。&lt;strong&gt;需求背景、开发设计（技术方案）、排期计划要在开发测试开始前书写完成，其他部分可以根据进度补充完善。&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;25-开发--测试&#34;&gt;2.5 开发 &amp;amp; 测试&lt;/h4&gt;
&lt;p&gt;根据技术方案和排期，具体实现。&lt;/p&gt;
&lt;h4 id=&#34;26-需求方验收&#34;&gt;2.6 需求方验收&lt;/h4&gt;
&lt;p&gt;验收阶段，开发如有 bug 修改 bug，可以提前提供部分样例结果进行预验收。&lt;/p&gt;
&lt;h4 id=&#34;27-生产部署&#34;&gt;2.7 生产部署&lt;/h4&gt;
&lt;p&gt;根据具体环境部署。&lt;/p&gt;
&lt;h4 id=&#34;28-需求复盘总结&#34;&gt;2.8 需求复盘总结&lt;/h4&gt;
&lt;p&gt;复盘一下问题主要出在哪里，以后如何规避，哪些优点可以以后借鉴等。&lt;/p&gt;
&lt;h2 id=&#34;3-其他注意事项&#34;&gt;3. 其他注意事项&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id=&#34;31-关于对接和验收阶段&#34;&gt;3.1 关于对接和验收阶段&lt;/h4&gt;
&lt;p&gt;首版需求已评审过的前提下，在此阶段如果不可避免出现需求变更频繁和很多不确定的时候，要明确告知需求方批量提供需求点或完善点，避免随时出现一个接一个，导致此需求一直完不成。&lt;/p&gt;
&lt;p&gt;最好补充一次批量提完，如果第两个及以上批次，建议需求当需求变更处理。&lt;/p&gt;
&lt;p&gt;开发要合理评估，尽量避免开发不合理需求。&lt;/p&gt;
&lt;h2 id=&#34;4-附件&#34;&gt;4. 附件&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;Java 开发手册:!泰山版.pdf&lt;/p&gt;</description>
    </item>
    <item>
      <title>技术债</title>
      <link>https://leochu.work/blog/tech/engineering/%E6%8A%80%E6%9C%AF%E5%80%BA/</link>
      <pubDate>Sun, 29 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/%E6%8A%80%E6%9C%AF%E5%80%BA/</guid>
      <description>&lt;p&gt;关于技术债务的文章，尽管实践中会堆积技术债，但这个概念并不在我们的工作中频繁出现。这篇文章就系统性讲讲技术债，让大家避免知其然，不知其所以然。&lt;/p&gt;
&lt;p&gt;一、技术债是什么&lt;/p&gt;
&lt;p&gt;技术负债（英语：Technical debt），又译技术债，也称为设计负债（design debt）、代码负债（code debt），是编程及软件工程中的借鉴了财务债务的系统隐喻。指开发人员为了加速软件开发，在应该采用最佳方案时进行了妥协，改用了短期内能加速软件开发的方案，从而在未来给自己带来的额外开发负担。这种技术上的选择，就像一笔债务一样，虽然眼前看起来可以得到好处，但必须在未来偿还。软件工程师必须付出额外的时间和精力持续修复之前的妥协所造成的问题及副作用，或是进行重构，把架构改善为最佳实现方式。&lt;/p&gt;
&lt;p&gt;1992 年，沃德 · 坎宁安首次将技术的复杂比作为负债。第一次发布代码，就好比借了一笔钱。只要通过不断重写来偿还债务，小额负债便可以加速开发。但久未偿还债务会引发危险。复用马马虎虎的代码，类似于负债的利息。整个部门有可能因为松散的实现，不完全的面向对象的设计或其他诸如此类的负债而陷入窘境。&lt;/p&gt;
&lt;p&gt;二、技术债表现&lt;/p&gt;
&lt;p&gt;技术债与其他债务本身一样，是一种透支行为，通过牺牲未来来满足当下的一些需求。也跟其他债务一样，技术债务也有利息，而且随着时间利滚利，会成为埋在项目里的定时炸弹。如果产品长期的可持续的发展，那么技术债的重要性是毋庸置疑的。&lt;/p&gt;
&lt;p&gt;技术债务的本质是产品的结构阻碍了进步，表现出来的症状有：无法轻易重构产品以满足市场需求；组件之间的依赖性过多，体系结构不良；缺陷太多，结构不良；难以理解，难以改变。&lt;/p&gt;
&lt;p&gt;技术债务的后果有偿还技术债务造成时间浪费，员工满意度降低带来士气低落，因解决遗留代码问题而错过优质项目造成人才流失，产品质量降低造成客户满意度下降，技术债务限制创新能力、扼杀创造性等诸多问题。&lt;/p&gt;
&lt;p&gt;技术债不单单是技术债，它就像一个垃圾堆，久而久之不处理，慢慢周围就会产生更多的垃圾，因此产生的 “破窗效应” 更加是会对未来的项目环境造成很大的影响，大家也会逐渐丧失维护环境的信心。所以在讨论技术债的时候不仅仅是讨论技术债本身，技术债对团队追求质量的信心、对大家维护环境整洁的积极性都会造成很大的影响。&lt;/p&gt;
&lt;p&gt;MartinFowler 把技术债分为四个象限，如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/eac4b74543a98226442e205e821997094b90eb7b.jpeg&#34;&gt;&lt;/p&gt;
&lt;p&gt;三、技术债产生的原因&lt;/p&gt;
&lt;p&gt;●业务压力：为了满足业务的快速要求，在必要的修改并没有完成时就匆匆发布，这些未完成的修改就形成了技术负债。&lt;/p&gt;
&lt;p&gt;●缺少过程和理解：业务人员不清楚不理解技术负债的概念，在决策时就不会考虑到其带来的影响。&lt;/p&gt;
&lt;p&gt;●模块之间解耦不够：功能没有模块化，软件柔性不够，不足适应业务变化的要求。&lt;/p&gt;
&lt;p&gt;●缺少配套的自动化测试：导致鼓励快速而风险很大的 “创可贴” 式的 BUG 修复。&lt;/p&gt;
&lt;p&gt;●缺少必要文档：需求和代码都没有必要的支撑性文档或注释。&lt;/p&gt;
&lt;p&gt;●缺少协作：组织中的知识共享和业务效率较低，或者初级开发者缺少必要的指导。&lt;/p&gt;
&lt;p&gt;●重构延迟：在开发的过程中，某些部分的代码会变得难以控制，这时候就需要进行重构，以适应将来的需求变化。重构越是推迟，这些已有的代码被使用的越多，形成的技术负债就越多，直到重构完成。&lt;/p&gt;
&lt;p&gt;●不遵循标准或最佳实践：忽略了已有的业界标准、框架、技术和最佳实践。&lt;/p&gt;
&lt;p&gt;●缺少相关技能：开发人员有时候技能缺失，并不知道如何编写优雅的代码。&lt;/p&gt;
&lt;p&gt;四、如何 “还债”？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;技术债可视化&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;尽可能公开技术债，一开始就与团队，利益相关方一起权衡利弊，并明确告知影响与解决方案。平等沟通，相互理解。让技术债在业务层面、技术层面可见。&lt;/p&gt;
&lt;p&gt;可以在组织资产负债表的财产债中新增两列：短期技术债和长期技术债。还可以用用跟踪开发速率的方式体现技术债对于产品的影响。&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;不同的债要对症下药&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;技术债的状态可以分类为偶然技术债、已知技术债和目标技术债。&lt;/p&gt;
&lt;p&gt;偿还技术债时应遵循如下原则：&lt;/p&gt;
&lt;p&gt;1）确定已知技术债必须还。&lt;/p&gt;
&lt;p&gt;2）发现偶然技术债，立即还。&lt;/p&gt;
&lt;p&gt;3）每个冲刺确定一定数量的已知技术债作为目标技术债，在当前冲刺中偿还。&lt;/p&gt;
&lt;p&gt;4）无需偿还的技术债是行将就木的产品、一次性原型和短命产品。&lt;/p&gt;
&lt;p&gt;五、如何避免 “欠债”&lt;/p&gt;
&lt;p&gt;与其后期吭哧吭哧还债填坑，不如从一开始就尽量避免欠下技术债务。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;避免使用过时的技术&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;遗留应用程序、过时的技术以及不同的平台和流程可能会使组织陷入沉重的技术债务，迫使其推迟基本的现代化计划。DNS 和流量管理技术提供商 NS1 的联合创始人兼首席执行官 Kris Beevers 说：“技术债务将大量金钱和宝贵的时间浪费在系统和应用程序上，而这些系统和应用程序并不是为现代企业所需的规模和速度而打造的。”&lt;/p&gt;
&lt;p&gt;旧资产和老方法也往往充斥着安全漏洞，难以集成和自动化，并且很可能不再更新。 Beevers 指出：“寻找人才来管理基于复杂或过时的代码构建的遗留应用程序也是一个日益严峻的难题。坚持采用过时技术不仅会消耗宝贵的预算，而且还会阻碍公司创新和保持竞争力的能力。”&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;参考敏捷实践&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;有越来越多的组织渐渐接受敏捷软件开发，这是将方法交给协作、自行组织的团队和跨职能团队的一系列方法和实践。如果这种方法得到严格应用，敏捷开发使组织可以避免技术债务，其方法是快速且以迭代的方式创建和发布新产品。Dodd 说：“这一过程将新产品和新功能尽快并逐步地交到用户手中。” 随着新版本的交付，各种改进和问题都得到了解决，这使技术债务的积累不太可能产生。&lt;/p&gt;
&lt;p&gt;敏捷方法认识到项目在生命周期中从未真正完成过，并且也从来都不是完美的。“同时，敏捷方法专注于…… 针对能力和质量的简化了的开发”，Dodd 说。重要功能往往要频繁地开发，测试并投入生产。敏捷团队可能不会发布软件的 “全面（Big Bang）” 方法，而是每年发布几次重大升级。Dodd 指出：“这可以使产品保持相当平稳的发展，还可以帮助用户避免重大的中断事件。”&lt;/p&gt;</description>
    </item>
    <item>
      <title>关于设计模式</title>
      <link>https://leochu.work/blog/tech/engineering/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E6%A6%82%E8%BF%B0/</link>
      <pubDate>Sun, 01 Oct 2023 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E6%A6%82%E8%BF%B0/</guid>
      <description>&lt;h2 id=&#34;策略模式strategy-pattern&#34;&gt;【策略模式】（Strategy Pattern）&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;Pasted image 20230420121518.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020230420121518.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;其中的Context是一个所谓的“上下文”，不一定非得是个类，也可以只是一个函数/方法。最关键的是，我们其实根本不需要ConcreteStrategyX类，也不需要它们的对象。我们要的只是一个execute函数而已，我们甚至连execute这个函数名都不需要，只要能执行它就行。&lt;/p&gt;
&lt;p&gt;看看函数式编程是怎么玩的（这里以大家都熟悉的JavaScript为例）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;context&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;func&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 做些什么...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;result&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;func&lt;/span&gt;()  &lt;span style=&#34;color:#75715e&#34;&gt;// 有需要的话可以传参
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 再做些什么...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;context&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 做些什么...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;123&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 是否需要返回值看需求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个匿名函数参数&lt;code&gt;func&lt;/code&gt;搞定。&lt;/p&gt;
&lt;p&gt;Java能搞出这种类图来，全都是因为Java没有一等公民的函数，所以函数必须依附于类（静态方法）或者对象（非静态方法）。而玩静态方法又没法玩多态，而且类不能当成参数传递给其他函数/方法，所以只能用对象携带方法。而对象的方法必须有个名称，为了统一，就叫execute。由于需要多态，所以我们必须提一个接口出来，在接口里声明execute的方法签名。所有这一切说白了都是为了讨好Java编译器，否则它会给你颜色（red）看。&lt;/p&gt;
&lt;p&gt;当然，自从Java有了函数式接口和lambda后一定程度上也能玩函数式编程了。&lt;/p&gt;
&lt;h2 id=&#34;观察者模式observer-pattern&#34;&gt;【观察者模式】（Observer Pattern）&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;Pasted image 20230420121526.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020230420121526.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这个在JS里大家已经熟悉到不能再熟悉了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;someButton&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;onclick&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 处理点击事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;又是一个匿名函数搞定！上图里的&lt;code&gt;Subject#attach&lt;/code&gt;在这里就是直接赋值。&lt;code&gt;Subject#detach&lt;/code&gt;就是赋空值。&lt;code&gt;Subject#notify&lt;/code&gt;就是调用一下匿名函数而已。而&lt;code&gt;Observer#update&lt;/code&gt;就是匿名函数本身。&lt;/p&gt;
&lt;h2 id=&#34;访问者模式visitor-pattern&#34;&gt;【访问者模式】（Visitor Pattern）&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;Pasted image 20230420121532.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020230420121532.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;能整成这样我也是服了。说白了不就是访问者需要判断一下元素类型嘛。直接套用策略模式，在匿名函数里if-else一下不就行了？（当然还有其他方式，比如引入一个工厂。有模式匹配的函数式编程语言如Haskell、Erlang、Elixir等玩起来更简单）。&lt;/p&gt;
&lt;h2 id=&#34;装饰器模式decorator-pattern&#34;&gt;【装饰器模式】（Decorator Pattern）&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&#34;Pasted image 20230420121538.png&#34; loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/Pasted%20image%2020230420121538.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;这才是函数式编程的魅力所在！&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;core1&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;arg1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;arg2&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 做些啥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;core2&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;arg&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 做些啥
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;decorate&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;core&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;// 做些准备工作
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 做些啥，甚至可以改变参数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ret&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;core&lt;/span&gt;(...&lt;span style=&#34;color:#a6e22e&#34;&gt;arguments&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 做些啥，甚至可以改变返回值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;decorated1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;decorate&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;core1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;decorated2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;decorate&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;core2&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;酷吧？又是匿名函数搞定！只不过这次的匿名函数是返回值。&lt;/p&gt;</description>
    </item>
    <item>
      <title>阿里编程规约</title>
      <link>https://leochu.work/blog/tech/engineering/%E9%98%BF%E9%87%8C%E7%BC%96%E7%A8%8B%E8%A7%84%E7%BA%A6/</link>
      <pubDate>Sun, 20 Aug 2023 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/engineering/%E9%98%BF%E9%87%8C%E7%BC%96%E7%A8%8B%E8%A7%84%E7%BA%A6/</guid>
      <description>&lt;p&gt;命名风格&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;
&lt;p&gt;【强制】抽象类命名使用 Abstract 或 Base 开头; 异常类命名使用 Exception 结尾; 测试类 命名以它要测试的类的名称开始，以 Test 结尾。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;【强制】POJO 类中布尔类型变量都不要加 is 前缀，否则部分框架解析会引起序列化错误。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;【强制】包名统一使用小写，点分隔符之间有且仅有一个自然语义的英语单词。包名统一使 用单数形式，但是类名如果有复数含义，类名可以使用复数形式。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正例: 应用工具类包名为 com.alibaba.ai.util、类名为 MessageUtils&lt;/p&gt;
&lt;ol start=&#34;13&#34;&gt;
&lt;li&gt;【推荐】在常量与变量的命名时，表示类型的名词放在词尾，以提升辨识度。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正例: startTime / workQueue / nameList / TERMINATED_THREAD_COUNT&lt;/p&gt;
&lt;p&gt;17.【参考】枚举类名带上 Enum 后缀，枚举成员名称需要全大写，单词间用下划线隔开。&lt;/p&gt;
&lt;p&gt;B) 领域模型命名规约&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;数据对象: xxxDO，xxx 即为数据表名。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数据传输对象: xxxDTO，xxx 为业务领域相关的名称。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;展示对象: xxxVO，xxx 一般为网页名称。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;POJO 是 DO/DTO/BO/VO 的统称，禁止命名成 xxxPOJO。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;常量定义&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;【推荐】不要使用一个常量类维护所有常量，要按常量功能进行归类，分开维护。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;【推荐】如果变量值仅在一个固定范围内变化用 enum 类型来定义。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);&lt;/p&gt;
&lt;p&gt;代码格式&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;【强制】采用 4 个空格缩进，禁止使用 tab 字符。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;IDEA 设置 tab 为 4 个空格时，请勿勾选 Use tab character&lt;/p&gt;</description>
    </item>
    <item>
      <title>OneData数据仓库架构</title>
      <link>https://leochu.work/blog/tech/bigdata/onedata%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93%E6%9E%B6%E6%9E%84/</link>
      <pubDate>Sun, 05 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/bigdata/onedata%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93%E6%9E%B6%E6%9E%84/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E6%9E%B6%E6%9E%84.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;**1.**&lt;strong&gt;什么是&lt;/strong&gt; &lt;strong&gt;onedata&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;面对爆炸式增长的数据，如何建设高效的数据模型和体系，对这些数据进行有序和有结构地分类组织和存储，避免重复建设和数据不一致性，保证数据的规范性，一直是大数据系统建设不断追求的方向。OneData 即是阿里巴巴内部进行数据整合及管理的方法体系和工具。阿里巴巴的大数据工程师在这一体系下，构建统一、规范、可共享的全域数据体系，避免数据的冗余和重复建设，规避数据烟囱和不一致性，充分发挥阿里巴巴在大数据海量、多样性方面的独特优势。借助这一统一化数据整合及管理的方法体系，我们构建了阿里巴巴的数据公共层，并可以帮助相似的大数据项目快速落地实现。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E6%9E%B6%E6%9E%84.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;**2.**&lt;strong&gt;指导思想&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;阿里巴巴集团数据公共层设计理念遵循维度建模思想，可参考 StarSchema-The Complete Reference 和 The Data Warehouse Toolkit-The Definitive Guide to Dimensional Modeling。数据模型的维度设计主要以维度建模理论为基础，基于维度数据模型总线架构，构建一致性的维度和事实。其核心的实施指导方针如下：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s.w.org/images/core/emoji/17.0.2/svg/26ab.svg&#34;&gt; 首先，要进行充分的业务调研和需求分析。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s.w.org/images/core/emoji/17.0.2/svg/26ab.svg&#34;&gt; 其次，进行数据总体架构设计，主要是根据数据域对数据进行划分；按照维度建模理论，构建总线矩阵，抽象出业务过程和维度。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s.w.org/images/core/emoji/17.0.2/svg/26ab.svg&#34;&gt; 再次，对报表需求进行抽象整理出相关指标体系，使用 One Data 工具完成指标规范定义和模型设计。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://s.w.org/images/core/emoji/17.0.2/svg/26ab.svg&#34;&gt; 最后，是代码研发和运维。其实施流程主要分为：数据调研、架构设计、规范定义和模型设计。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E6%B5%81%E7%A8%8B.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;**3.**&lt;strong&gt;业务调研&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;业务调研&lt;/strong&gt;：需要确认要规划进数仓的业务领域，以及各业务领域包含的功能模块，以阿里的业务为例，可规划如下矩阵&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E4%B8%9A%E5%8A%A1%E8%B0%83%E7%A0%94.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;需求调研&lt;/strong&gt;：了解需求方关系哪些指标？需要哪些维度、度量？数据是否沉淀到汇总层等。&lt;/p&gt;
&lt;p&gt;可以想象一下，在没有考虑分析师、业务运营人员的数据需求的情况下，根据业务调研建设的数据仓库无疑等于闭门造车。了解了业务系统的业务后并不代表就可以进行实施了，此刻要做的就是收集数据使用者的需求，可以去找分析师、业务运营人员了解他们有什么数据诉求，此时更多的就是报表需求。&lt;/p&gt;
&lt;p&gt;需求调研的途径有两种:一是根据与分析师、业务运营人员的沟通(邮件、IM)获知需求；二是对报表系统中现有的报表进行研究分析。通过需求调研分析后，就清楚数据要做成什么样的。很多时候，都是由具体的数据需求驱动数据仓库团队去了解业务系统的业务数据，这两者并没有严格的先后顺序。&lt;/p&gt;
&lt;p&gt;举例：分析师需要了解大淘宝(淘宝、天猫、天猫国际)一级类目的成交金额。当获知这个需求后，我们要分析根据什么(维度)汇总，以及汇总什么(度量)，这里类目是维度，金额是度量；明细数据和汇总数据应该怎样设计?这是一个公用的报表吗?是需要沉淀到汇总表里面，还是在报表工具中进行汇总?&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E9%9C%80%E6%B1%82%E8%B0%83%E7%A0%94.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;**4.**&lt;strong&gt;架构设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.1 数据域的划分&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数据域是指面向业务分析，将业务过程或者维度进行抽象的集合，一般数据域和应用系统(功能模块)有联系，可以考虑将同一个功能模块系统的业务过程划分到一个数据域。业务过程可以概括为一个个不可拆分的行为事件，如下单、支付、退款。为保障整个体系的生命力，数据域需要抽象提炼，并且长期维护和更新，但不轻易变动。在划分数据域时，既能涵盖当前所有的业务需求，又能在新业务进入时无影响地被包含进已有的数据域中或者扩展新的数据域。如表所示是功能模块/业务线的业务动作(部分示例)：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E4%B8%9A%E5%8A%A1%E5%8A%A8%E4%BD%9C.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;根据业务过程进行归纳，可以抽象出如下数据域：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E6%95%B0%E6%8D%AE%E5%9F%9F.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.2 构建总线矩阵&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在进行充分的业务调研和需求调研后，就要构建总线矩阵了，需要做两件事情：&lt;/p&gt;
&lt;p&gt;1.明确每个数据域下有哪些业务过程。&lt;/p&gt;
&lt;p&gt;2.业务过程与哪些维度相关，并通过总线矩阵定义每个数据域下的业务过程和维度。&lt;/p&gt;
&lt;p&gt;如下表是供应链管理业务过程示例：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E4%B8%9A%E5%8A%A1%E6%80%BB%E7%BA%BF%E7%9F%A9%E9%98%B5.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;4.3 规范定义&lt;/p&gt;
&lt;p&gt;规范定义主要定义指标体系，包括原子指标、修饰词、时间周期和派生指标。&lt;/p&gt;
&lt;p&gt;4.4 模型设计&lt;/p&gt;
&lt;p&gt;模型设计主要包括维度及属性的规范定义，维表、明细事实表和汇总事实表的模型设计。&lt;/p&gt;
&lt;p&gt;4.5 架构总结&lt;/p&gt;
&lt;p&gt;One Data 的实施过程是一个高度迭代和动态的过程，一般采用螺旋式实施方法。在总体架构设计完成之后，开始根据数据域进行迭代式模型设计和评审。在架构设计、规范定义和模型设计等模型实施过程中，都会引入评审机制，以确保模型实施过程的正确性。&lt;/p&gt;
&lt;p&gt;**5.**&lt;strong&gt;指标体系搭建&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;5.1 指标体系核心结构&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://leochu.work/blog/resource/onedata_%E6%8C%87%E6%A0%87%E4%BD%93%E7%B3%BB%E6%A0%B8%E5%BF%83%E7%BB%93%E6%9E%84.png&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hive调优大全</title>
      <link>https://leochu.work/blog/tech/bigdata/hive%E8%B0%83%E4%BC%98%E5%A4%A7%E5%85%A8/</link>
      <pubDate>Sun, 18 Sep 2022 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/bigdata/hive%E8%B0%83%E4%BC%98%E5%A4%A7%E5%85%A8/</guid>
      <description>&lt;h1 id=&#34;调优具体细节&#34;&gt;调优具体细节&lt;/h1&gt;
&lt;h2 id=&#34;hive建表设计层面&#34;&gt;Hive建表设计层面&lt;/h2&gt;
&lt;p&gt;Hive 的建表设计层面调优，主要讲的怎么样合理的组织数据，方便后续的高效计算。比如建表的类型，文件存储格式，是否压缩等等。&lt;/p&gt;
&lt;h3 id=&#34;利用分区表优化&#34;&gt;利用分区表优化&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;关于 Hive 的表的类型有哪些？
1、分区表  
2、分桶表
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分区表 是在某一个或者几个维度上对数据进行分类存储，一个分区对应一个目录。如果筛选条件里有分区字段，那么 Hive 只需要遍历对应分区目录下的文件即可，不需要遍历全局数据，使得处理的数据量大大减少，从而提高查询效率。&lt;/p&gt;
&lt;p&gt;也就是说：&lt;strong&gt;当一个 Hive 表的查询大多数情况下，会根据某一个字段进行筛选时，那么非常适合创建为分区表，该字段即为分区字段。&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;select1:  select ....  where country = &amp;#34;china&amp;#34;
select2:  select ....  where country = &amp;#34;china&amp;#34;
select3:  select ....  where country = &amp;#34;china&amp;#34;
select4:  select ....  where country = &amp;#34;china&amp;#34;
.....
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分门别类：这个city字段的每个值，就单独形成为一个分区。其实每个分区就对应带HDFS的一个目录&lt;/p&gt;
&lt;p&gt;在创建表时通过启用 &lt;code&gt;partitioned by&lt;/code&gt; 实现，用来 partition 的维度并不是实际数据的某一列，具体分区的标志是由插入内容时给定的。当要查询某一分区的内容时可以采用 where 语句，形似 &lt;code&gt;where tablename.partition_column = a&lt;/code&gt; 来实现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、创建含分区的表：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sql&#34; data-lang=&#34;sql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;CREATE&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;TABLE&lt;/span&gt; page_view(viewTime INT, userid BIGINT,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       page_url STRING, referrer_url STRING,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                       ip STRING &lt;span style=&#34;color:#66d9ef&#34;&gt;COMMENT&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;IP Address of the User&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PARTITIONED &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt;(date STRING, country STRING)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ROW&lt;/span&gt; FORMAT DELIMITED FIELDS TERMINATED &lt;span style=&#34;color:#66d9ef&#34;&gt;BY&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;STORED &lt;span style=&#34;color:#66d9ef&#34;&gt;AS&lt;/span&gt; TEXTFILE;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2、载入内容，并指定分区标志：&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hive 数仓建表该选用 ORC 还是 Parquet，压缩选 LZO 还是 Snappy</title>
      <link>https://leochu.work/blog/tech/bigdata/hive%E5%BB%BA%E8%A1%A8%E6%A0%BC%E5%BC%8F%E9%80%89%E5%9E%8B-orc-parquet-lzo-snappy/</link>
      <pubDate>Sun, 24 Jul 2022 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/bigdata/hive%E5%BB%BA%E8%A1%A8%E6%A0%BC%E5%BC%8F%E9%80%89%E5%9E%8B-orc-parquet-lzo-snappy/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;在数仓中，建议大家除了接口表（从其他数据库导入或者是最后要导出到其他数据库的表），其余表的存储格式与压缩格式保持一致。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在数仓中，建议大家除了接口表（从其他数据库导入或者是最后要导出到其他数据库的表），其余表的存储格式与压缩格式保持一致。&lt;/p&gt;
&lt;p&gt;我们先来说一下目前 Hive 表主流的存储格式与压缩方式&lt;/p&gt;
&lt;p&gt;从 Hive 官网得知，Apache Hive 支持 Apache Hadoop 中使用的几种熟悉的文件格式，如 &lt;code&gt;TextFile（文本格式）&lt;/code&gt;，&lt;code&gt;RCFile（行列式文件）&lt;/code&gt;，&lt;code&gt;SequenceFile（二进制序列化文件）&lt;/code&gt;，&lt;code&gt;AVRO&lt;/code&gt;，&lt;code&gt;ORC（优化的行列式文件）&lt;/code&gt;和&lt;code&gt;Parquet&lt;/code&gt; 格式，而这其中我们目前使用最多的是&lt;code&gt;TextFile&lt;/code&gt;，&lt;code&gt;SequenceFile&lt;/code&gt;，&lt;code&gt;ORC&lt;/code&gt;和&lt;code&gt;Parquet&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;下面来详细了解下这 2 种行列式存储。&lt;/p&gt;
&lt;h2 id=&#34;1orc&#34;&gt;1、ORC&lt;/h2&gt;
&lt;h3 id=&#34;11-orc-的存储结构&#34;&gt;1.1 ORC 的存储结构&lt;/h3&gt;
&lt;p&gt;我们先从官网上拿到 ORC 的存储模型图&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://www.doitedu.cn/wp-content/uploads/2021/12/a.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;看起来略微有点复杂，那我们稍微简化一下，我画了一个简单的图来说明一下&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://www.doitedu.cn/wp-content/uploads/2021/12/b-1024x456.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;但是由于索引的高成本，在**「目前的 Hive3.X 中，已经废除了索引」**，当然也早就引入了列式存储。&lt;/p&gt;
&lt;p&gt;列式存储的存储方式，是按照一列一列存储的，如上图中的右图，这样的话如果查询一个字段的数据，就等于是索引查询，效率高。但是如果需要查全表，它因为需要分别取所有的列最后汇总，反而更占用资源。于是 ORC 行列式存储出现了。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在需要全表扫描时，可以按照行组读取&lt;/li&gt;
&lt;li&gt;如果需要取列数据，在行组的基础上，读取指定的列，而不需要所有行组内所有行的数据和一行内所有字段的数据。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;了解了 ORC 存储的基本逻辑后，我们再来看看它的存储模型图。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;http://www.doitedu.cn/wp-content/uploads/2021/12/c.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;同时我也把详细的文字也附在下面，大家可以对照着看看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;条带 (stripe)：ORC 文件存储数据的地方，每个 stripe 一般为 HDFS 的块大小。（包含以下 3 部分）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;index data:保存了所在条带的一些统计信息,以及数据在 stripe中的位置索引信息。
rows data:数据存储的地方,由多个行组构成，每10000行构成一个行组，数据以流( stream)的形式进行存储。
stripe footer:保存数据所在的文件目录
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;文件脚注 (file footer)：包含了文件中 sipe 的列表, 每个 stripe 的行数, 以及每个列的数据类型。它还包含每个列的最小值、最大值、行计数、求和等聚合信息。&lt;/li&gt;
&lt;li&gt;postscript：含有压缩参数和压缩大小相关的信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以其实发现，ORC 提供了 3 级索引，文件级、条带级、行组级，所以在查询的时候，利用这些索引可以规避大部分不满足查询条件的文件和数据块。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CDH角色划分</title>
      <link>https://leochu.work/blog/tech/bigdata/cdh%E8%A7%92%E8%89%B2%E5%88%92%E5%88%86/</link>
      <pubDate>Sun, 15 May 2022 00:00:00 +0000</pubDate>
      <guid>https://leochu.work/blog/tech/bigdata/cdh%E8%A7%92%E8%89%B2%E5%88%92%E5%88%86/</guid>
      <description>&lt;h3 id=&#34;1-服务器配置&#34;&gt;&lt;strong&gt;1. 服务器配置&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;主节点&#34;&gt;&lt;strong&gt;主节点：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;hostname: m1,m2,m3&lt;/p&gt;
&lt;p&gt;vcore：48&lt;/p&gt;
&lt;p&gt;内存：128G&lt;/p&gt;
&lt;p&gt;SSD：1T（不算系统盘）&lt;/p&gt;
&lt;h4 id=&#34;工作节点&#34;&gt;&lt;strong&gt;工作节点：&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;hostname: n1,n2,n3,n4&lt;/p&gt;
&lt;p&gt;vcore : 48&lt;/p&gt;
&lt;p&gt;内存：256G&lt;/p&gt;
&lt;p&gt;SSD:1T（不算系统盘）&lt;/p&gt;
&lt;h3 id=&#34;2-节点职责描述&#34;&gt;&lt;strong&gt;2. 节点职责描述&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;m1: 控制核心；cdh核心，hadoop主节点&lt;/p&gt;
&lt;p&gt;m2: 网关入口；主节点高可用，一些组件的web ui，用户入口 ，（前期做计算任务的driver端，后期优化driver打散到各节点）&lt;/p&gt;
&lt;p&gt;m3: 后台服务；组件元数据库，任务的history服务 ，（后期做元数据HA）&lt;/p&gt;
&lt;p&gt;n1~n4: 算存一体；提供存储，计算等服务&lt;/p&gt;
&lt;h3 id=&#34;3角色分配策略&#34;&gt;&lt;strong&gt;3.角色分配策略&lt;/strong&gt;&lt;/h3&gt;
&lt;h4 id=&#34;一hdfs&#34;&gt;&lt;strong&gt;一、hdfs&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;NameNode一般在主节点上，初始化安装的时候没有高可用，所以有SecondaryNameNode的作为一个备份,NameNode它会将它拆分后进行分布式存储，其中的数据是分散在各个DataNode节点，且默认都会有3个副本，防止其中一台机器宕机使得数据缺失。balancer一般与namenode搭建在一起。&lt;/p&gt;
&lt;h4 id=&#34;二hive&#34;&gt;&lt;strong&gt;二、hive&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;hive metastore server与hiveServer2一般搭载一起上，但也可以分开，因为hive服务需要启动hiveServer2，访问sparksql需要启动metastore而hive gateway,事实上并不是真正的角色，也没有状态，但它们充当了告诉客户端配置应该放置在哪里。 添加Hive服务时，默认情况下会创建Hive网关。&lt;/p&gt;
&lt;h4 id=&#34;三cloudera-manager-server&#34;&gt;&lt;strong&gt;三、cloudera manager server&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;这个可以根据实际搭建，这个相当于是集群的监听器，在网页上出现的的图表也就是这个监听器类似的，这个可以搭建在主节点上，但若是主节点上分配的角色过多会影响其服务器的性能。&lt;/p&gt;
&lt;h4 id=&#34;四spark&#34;&gt;&lt;strong&gt;四、spark&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;这个角色可以分配这任意的机器上，按实际情况调整。spark-gateway全部部署在各个机器上，这个对于个人理解来说相当于spark、spark2机器之间的通信功能。&lt;/p&gt;
&lt;h4 id=&#34;五yarn&#34;&gt;&lt;strong&gt;五、yarn&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;jobhistory与resourcemanager进行通信，所以部署上一般在同一台机器上放在主节点上，而nodemanager分配在各个节点上&lt;/p&gt;
&lt;h4 id=&#34;六zookeeper&#34;&gt;&lt;strong&gt;六、zookeeper&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;这个若是机器足够一般是奇数的，所以部署在m节点上比较合适。&lt;strong&gt;奇数台、高可用、与管理角色共置&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&#34;七hue&#34;&gt;&lt;strong&gt;七、hue&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;会对外提供一个web ui，以便于数据分析和数据开发做即席查询。这个服务随意部署，根据自己的机器部署情况来看。&lt;/p&gt;
&lt;h3 id=&#34;4角色划分详情表&#34;&gt;&lt;strong&gt;4.角色划分详情表&lt;/strong&gt;&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
          &lt;th&gt;&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;控制核心&lt;/td&gt;
          &lt;td&gt;网关+入口&lt;/td&gt;
          &lt;td&gt;元数据+历史服务&lt;/td&gt;
          &lt;td&gt;存算一体&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;m1&lt;/td&gt;
          &lt;td&gt;m2&lt;/td&gt;
          &lt;td&gt;m3&lt;/td&gt;
          &lt;td&gt;n1&lt;/td&gt;
          &lt;td&gt;n2&lt;/td&gt;
          &lt;td&gt;n3&lt;/td&gt;
          &lt;td&gt;n4&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;cloudera management&lt;/td&gt;
          &lt;td&gt;Alert Publisher&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Event Server&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Host Monitor&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Service Monitor&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hdfs&lt;/td&gt;
          &lt;td&gt;NameNode&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;JournalNode&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Failover Controller&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HttpFs&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DataNode&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;yarn&lt;/td&gt;
          &lt;td&gt;ResourceManager&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;NodeManager&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;JobHistory Server&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hive&lt;/td&gt;
          &lt;td&gt;Hive MetaStore Server&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HiveServer2&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;HiveGateway&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;spark&lt;/td&gt;
          &lt;td&gt;Spark History Server&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Spark Gateway&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;impala&lt;/td&gt;
          &lt;td&gt;Impala StateStore&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Impala catalog Server&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Impala Daemon&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;zookeeper&lt;/td&gt;
          &lt;td&gt;zk-node&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;hue&lt;/td&gt;
          &lt;td&gt;Hue Server&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Hue Load Balancer&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;✅&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;5-未来升级项&#34;&gt;5. 未来升级项&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;work节点扩展硬盘，只需将新盘挂载到新目录/hadoop/data2或/hadoop/data3，更新hdfs配置就能完成存储扩展（支持热加入）&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
