小菜鸟

java菜鸟号正在起航

Hive 压缩配置:Map 阶段压中间数据,Reduce 阶段压最终结果

阶段 压什么 目的 推荐算法
Map 输出压缩 Map 任务输出的中间数据 减少 Shuffle 阶段网络传输 Snappy(速度快)
Reduce 输出压缩 最终写入 HDFS 的结果数据 减少存储占用 Snappy / Gzip(看场景)

选压缩算法的核心原则:中间数据要快(Snappy),结果数据要省空间(Gzip)。

Map 输出压缩:让 Shuffle 跑得更快

Map 阶段的输出会通过网络传到 Reduce 节点。数据量一大,网络就成了瓶颈。

Map 输出压缩就是把 Map 的结果先压缩再传,减少网络传输量。

配置(在 Hive 会话中执行):

-- 开启中间数据压缩
SET hive.exec.compress.intermediate=true;

-- 指定压缩算法(Snappy 速度最快,推荐)
SET mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

什么时候该开:

  • Map 输出数据量大(每个 Map 输出 > 100MB)
  • 网络带宽是瓶颈
  • 集群 CPU 有余量(压缩消耗 CPU)

什么时候不该开:

  • Map 输出数据量小(< 10MB)
  • CPU 已经是瓶颈
  • 集群 Snappy 没装(会报错)

Reduce 输出压缩:让 HDFS 存得更省

Reduce 输出的数据最终写入 HDFS,存得越久越占空间。

Reduce 输出压缩就是压缩最终结果文件,省存储。

配置:

阅读全文 »

RabbitMQ 核心概念与工作原理详解

RabbitMQ 是基于 AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的开源消息中间件,以高可靠性、灵活的路由机制和丰富的功能著称。它通过消息队列实现组件间的解耦,支持复杂的消息路由场景。本文将深入解析 RabbitMQ 的核心概念、交换机类型及工作原理,帮助理解其在分布式系统中的应用。

RabbitMQ 核心组件

RabbitMQ 的架构围绕 “消息路由” 设计,核心组件包括以下部分:

组件 作用描述
Broker 消息队列服务器实体(即 RabbitMQ 服务实例),负责接收、存储和转发消息。
Exchange 消息交换机,接收生产者发送的消息,根据路由规则将消息转发到绑定的队列。本身不存储消息,未绑定队列的消息会被丢弃。
Queue 消息队列,实际存储消息的容器,消息最终被投递到队列中等待消费者获取。队列是持久化的(默认情况下),即使 Broker 重启,消息也不会丢失(需配置持久化)。
Binding 绑定关系,用于将 Exchange 与 Queue 关联,并指定路由规则(如 Routing Key 或匹配条件)。
Routing Key 路由关键字,生产者发送消息时指定,Exchange 根据该关键字和绑定规则决定消息流向。
VHost 虚拟主机,用于隔离不同的消息环境(如开发、测试、生产),每个 VHost 拥有独立的交换机、队列和权限控制。默认 VHost 为 /
Producer 消息生产者,向 Exchange 发送消息的应用程序。
Consumer 消息消费者,从 Queue 中获取并处理消息的应用程序。
Channel 消息通道,在客户端与 Broker 的连接中创建的轻量级会话,用于发送 / 接收消息。复用 TCP 连接,减少连接开销,支持并发操作。

核心工作流程

RabbitMQ 的消息传递流程可概括为:

阅读全文 »

网络模型:从 OSI 到 TCP/IP 的分层体系

网络模型是计算机网络通信的 “设计蓝图”,通过将复杂的通信过程拆分为分层的功能模块,降低了协议设计的复杂度,实现了不同设备和系统的互联互通。目前主流的网络模型包括OSI 七层模型TCP/IP 四层模型五层协议模型,它们虽结构不同,但核心思想一致:分层负责、接口标准化

OSI/RM 七层模型(理论基石)

OSI(Open Systems Interconnection,开放系统互连)模型由 ISO(国际标准化组织)于 1984 年提出,是网络分层理论的经典框架。它将网络通信分为 7 层,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。尽管 OSI 模型因过于复杂未被广泛应用,但其分层思想为后续模型奠定了基础。

各层功能与核心特征

层级 名称 核心功能 典型协议 / 设备 数据单位
7 应用层 为用户应用程序提供网络服务(如文件传输、邮件收发) HTTP、FTP、SMTP、Telnet 数据
6 表示层 处理数据格式转换(如加密 / 解密、压缩 / 解压、编码转换) JPEG、ASCII、SSL/TLS(部分) 数据
5 会话层 建立、管理和终止进程间的会话连接(如断点续传的会话控制) RPC、NetBIOS 数据
4 传输层 为端到端进程提供可靠或高效的数据传输(如分段、流量控制、重传) TCP、UDP 段(TCP)/ 用户数据报(UDP)
3 网络层 负责跨网络的数据包路由和转发(如 IP 寻址、路径选择) IP、ICMP、ARP、路由协议 分组 / 数据包
2 数据链路层 处理同一链路内的帧传输(如 MAC 寻址、差错校验、冲突处理) Ethernet、PPP、MAC 协议
1 物理层 传输原始比特流,定义物理介质的电气特性(如电压、接口、传输速率) 双绞线、光纤、集线器(Hub) 比特(bit)

OSI 模型的设计原则

  • 功能分离:每一层专注于单一功能(如物理层仅负责比特传输,网络层仅负责路由)。
  • 接口标准化:层与层之间通过明确的接口交互,上层无需关心下层的实现细节。
  • 分层适度:层数足够多以避免功能混杂,同时避免过多导致复杂度上升。
阅读全文 »

MyBatis 注解开发全指南:从基础到高级用法

MyBatis 注解方式提供了一种无需 XML 配置即可编写映射语句的方案,适用于 SQL 逻辑简单、追求代码集中管理的场景。系统梳理注解开发的完整用法,包括基础 CRUD、高级映射、动态 SQL 及最佳实践,帮助你灵活选择 XML 或注解方式。

基础注解:CRUD 操作

MyBatis 提供了 @Insert@Update@Delete@Select 四个核心注解,分别对应 XML 中的 <insert><update><delete><select> 标签,使用简单直接。

1. @Insert:插入数据

public interface UserMapper {
    // 基础插入
    @Insert("INSERT INTO user(username, age, email) VALUES(#{username}, #{age}, #{email})")
    int insertUser(User user);

    // 插入并返回自增主键(等价于 XML 中的 useGeneratedKeys)
    @Insert("INSERT INTO user(username, age) VALUES(#{username}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
    int insertUserWithId(User user);
}
  • @Options 用于配置插入策略,useGeneratedKeys=true 启用自增主键,keyProperty 绑定实体类属性,keyColumn 绑定数据库列(可选,默认与属性名一致)。

2. @Update@Delete:更新与删除

public interface UserMapper {
    // 更新用户
    @Update("UPDATE user SET username=#{username}, age=#{age} WHERE id=#{id}")
    int updateUser(User user);

    // 根据 ID 删除
    @Delete("DELETE FROM user WHERE id=#{id}")
    int deleteUserById(Integer id);
}

3. @Select:查询数据

阅读全文 »

Hive 函数:内置函数够用 80% 的场景,窗口函数是分析利器,UDF 是最后一张牌

Hive 的函数分三类:

类型 输入 → 输出 典型函数
UDF 一行 → 一行 concatnvldate_format
UDAF 多行 → 一行 sumavgcollect_set
UDTF 一行 → 多行 explodesplit

日常开发中,80% 的需求用内置 UDF 和 UDAF 就能解决。窗口函数是进阶工具,解决”既要聚合又要保留明细”的问题。 自定义 UDF 是最后的手段——内置函数实在搞不定了再写

函数查询与帮助

  • 查看所有内置函数

    hive> show functions;  -- 列出所有可用函数  
  • 查看函数用法

    -- 基础说明  
    hive> desc function concat;  
    -- 详细说明(含示例)  
    hive> desc function extended concat;
  • 模糊查询函数

    hive> desc function like '*date*';  -- 查找含“date”的函数  

数据清洗类函数

空值处理:nvl

-- 薪资为空时补 0
SELECT ename, nvl(sal, 0) FROM emp;

字符串拼接:concat / concat_ws

-- concat:直接拼,有一个 NULL 整个结果是 NULL
SELECT concat(ename, '_', deptno) FROM emp;

-- concat_ws:指定分隔符,自动跳过 NULL
SELECT concat_ws(',', ename, deptno, sal) FROM emp;

字符串切割:split

-- 把逗号分隔的标签切成数组
SELECT split('java,python,sql', ',') FROM dual;
-- 输出:["java","python","sql"]

数组展开:explode + lateral view

explode 把数组拆成多行,但必须跟 lateral view 配合使用:

-- 把每个标签拆成一行,同时保留订单 ID
SELECT order_id, tag
FROM orders
LATERAL VIEW explode(split(tags, ',')) t AS tag;

日期处理函数

函数 作用 示例
date_format 日期格式化 date_format('2026-07-01', 'yyyyMMdd')20260701
unix_timestamp 日期 → 时间戳 unix_timestamp('2026-07-01', 'yyyy-MM-dd')
from_unixtime 时间戳 → 日期 from_unixtime(1696108800, 'yyyy-MM-dd')

跨格式转换:先转时间戳,再转目标格式

阅读全文 »
0%