0%

网络模型:从 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:插入数据

1
2
3
4
5
6
7
8
9
10
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:更新与删除

1
2
3
4
5
6
7
8
9
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函数全解析:从内置函数到自定义函数的实战指南

Hive 提供了丰富的函数库,包括内置函数(UDF、UDAF、UDTF)和自定义函数,满足数据清洗、转换、聚合等复杂分析需求。本文详细讲解 Hive 函数的分类、常用内置函数(尤其是窗口函数)的用法,以及自定义函数的开发流程,帮助开发者高效处理数据。

Hive 函数基础与分类

Hive 函数按输入输出关系可分为三类,覆盖不同的数据处理场景:

函数分类

类型 全称 作用 示例
UDF User-Defined Function 一进一出(单条记录输入,单条结果输出) concat()nvl()
UDAF User-Defined Aggregate Function 多进一出(多条记录输入,单条聚合结果输出) sum()avg()collect_set()
UDTF User-Defined Table-Generating Function 一进多出(单条记录输入,多条结果输出) explode()split()

函数查询与帮助

  • 查看所有内置函数

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

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

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

常用内置函数详解

数据清洗与转换函数

空值处理:nvl

NULL 值赋默认值,避免计算异常。

阅读全文 »

hive分区信息丢失问题全解析:从原因到修复方案

在 Hive 分区表使用中,“通过 HDFS 直接上传数据到分区目录后,Hive 无法查询到该分区” 是常见问题。这一问题的核心在于 元数据与实际数据不同步,Hive 元数据服务(Metastore)未记录手动创建的分区信息。本文详细讲解问题原因、修复方法及预防措施,确保分区表数据可正常查询。

问题现象与核心原因

现象描述

  1. 在 HDFS 上手动创建分区目录(如 date=20210415)并上传数据文件;
  2. 在 Hive 中执行 SHOW PARTITIONS test_partitioned; 未显示该分区;
  3. 执行 SELECT * FROM test_partitioned WHERE date='20210415'; 无结果,提示 “分区不存在”。

核心原因:元数据与实际数据不同步

Hive 分区表的分区信息需同时满足两个条件才能被查询:

  1. 实际数据存在:HDFS 上有对应的分区目录(如 date=20210415)及数据文件;
  2. 元数据记录:Hive Metastore(元数据存储,如 MySQL)中存在该分区的元数据条目。

当通过 HDFS 命令手动创建分区目录时,仅满足条件 1,但未通知 Metastore 记录元数据,导致 Hive 无法识别该分区。

修复分区信息的核心方法:MSCK REPAIR TABLE

Hive 提供 MSCK REPAIR TABLE 命令(MSCKMetaStore Check),用于扫描表的 HDFS 目录,自动发现未被元数据记录的分区,并将其添加到 Metastore 中。

操作步骤

  1. 确认 HDFS 分区目录存在
    先通过 HDFS 命令验证分区目录和数据文件已正确上传:

阅读全文 »

Hive 分区表详解:从基础分区到二级分区的优化实践

分区表是 Hive 提升大数据查询效率的核心特性,通过将数据按指定维度(如日期、地域)拆分到不同目录,避免全表扫描,显著减少查询耗时。本文详细讲解 Hive 分区表的创建、数据插入、查询优化及二级分区的应用,帮助开发者合理设计分区策略。

分区表的核心作用与原理

Hive 作为数据仓库,存储的表往往包含海量数据(如每日千万级日志)。若直接查询全表,需扫描所有数据,效率极低。分区表通过 “文件夹拆分数据”,将大表按分区列(如 dateregion)拆分为多个子目录,查询时只需扫描目标分区目录,大幅提升效率。

底层存储原理

分区表在 HDFS 上的存储路径格式为:

1
/user/hive/warehouse/<数据库名>.db/<表名>/<分区列1>=<值1>/<分区列2>=<值2>/...  

例如,按 date='2023-10-01' 分区的表,数据存储路径为:

1
/user/hive/warehouse/study_hive.db/test_partitioned/date=2023-10-01/  

基础分区表操作

创建分区表

通过 PARTITIONED BY 关键字定义分区列(分区列不算表的普通列,仅用于分区目录拆分)。

语法格式
阅读全文 »