小菜鸟

java菜鸟号正在起航

MapReduce Join 操作:大表关联小表用 Map 端,大表关联大表用 Reduce 端

数据处理中,多表关联是家常便饭——订单关联用户、日志关联商品、销售关联库存。在 SQL 里一个 JOIN 就搞定,在 MapReduce 里得自己实现。

MapReduce 提供了两种 Join 方案:

  • Reduce 端 Join:通用,任何规模都能用,但要走 Shuffle,性能一般
  • Map 端 Join:快,但要求一张表足够小,能塞进内存

怎么选?就一句话:小表能装进内存就用 Map 端 Join,装不下就用 Reduce 端 Join。

Join 的核心难点:怎么让相同 Key 的数据到同一个地方

两个表关联,关键是把相同关联键的数据凑到一起。

  • 订单表有商品 ID → 需要找到商品表里相同商品 ID 的信息
  • 问题是:订单数据分散在不同节点,商品数据也分散在不同节点
  • 怎么让同一个商品 ID 的订单数据和商品数据落到同一个节点?

这就是 Join 的核心挑战。MapReduce 用两种方式解决:

方案 怎么凑到一起 前提
Reduce 端 Join 通过 Shuffle,相同 Key 自动分到同一个 Reduce 无限制
Map 端 Join 小表提前加载到每个 Map 任务的内存里 小表能装进内存

Reduce 端 Join:通用方案,任何规模都能用

实现原理
flowchart TD
    A[表 A 数据] -->|Map 阶段| B["打标签 <Key, (A, ValueA)>"]  
    C[表 B 数据] -->|Map 阶段| D["打标签 <Key, (B, ValueB)>"]  
    B --> E[Shuffle 按 Key 分组]  
    D --> E  
    E --> F["Reduce 阶段合并 <Key, (A, B)>"]  
    F --> G[输出关联结果]

思路:

  1. Map 阶段:从不同表读数据,统一输出 <关联键, 来源标记 + 数据>
  2. Shuffle 阶段:相同关联键自动分到同一个 Reduce
  3. Reduce 阶段:把同一 Key 的两张表数据合并

关键点:Map 阶段一定要标记数据来源。 Reduce 阶段收到的是同一个 Key 的 value 列表,不知道哪些来自订单表、哪些来自商品表,所以需要标记(比如用 “order” 和 “product” 前缀)。

代码骨架:

阅读全文 »

jQuery 基本操作详解:选择器、DOM 操作与样式控制全指南

jQuery 是一款经典的 JavaScript 库,其核心价值在于 “简化 DOM 操作、统一浏览器兼容性、提供便捷的工具方法”。掌握 jQuery 的基本操作(选择器、DOM 增删改、属性与样式控制)是高效开发前端页面的基础。从 “jQuery 对象基础→选择器体系→DOM 操作→样式与属性控制” 四个维度,系统讲解 jQuery 的核心用法与实战技巧,帮你快速上手 jQuery 开发。

jQuery 基础:引入与对象概念

在使用 jQuery 前,需先理解 “如何引入库” 和 “jQuery 对象与 DOM 对象的区别”—— 这是避免后续操作报错的关键。

1. 引入 jQuery 库

jQuery 是外部库,需通过 <script> 标签引入后才能使用,常见引入方式有两种:

(1)本地引入(推荐开发环境)

将 jQuery 文件下载到本地项目,通过相对路径引入:

<!-- 引入本地 jQuery 文件(版本为 3.5.1,可替换为其他版本) -->
<script type="text/javascript" src="js/jquery-3.5.1.min.js"></script>

<!-- 注意:自定义 JS 必须在 jQuery 之后引入,否则无法使用 jQuery 语法 -->
<script type="text/javascript">
  // 此处可编写 jQuery 代码
</script>
(2)CDN 引入(推荐生产环境)

通过公共 CDN(如百度、谷歌、BootCDN)直接引入,无需下载文件,加载速度快:

<!-- 百度 CDN 引入 jQuery 3.5.1 -->
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>

版本选择

  • 1.x 版本:兼容 IE 6/7/8 等旧浏览器,功能稳定;
  • 2.x/3.x 版本:不兼容旧 IE,体积更小、性能更好(推荐现代项目使用)。

2. jQuery 对象与 DOM 对象的互转

jQuery 操作的是 “jQuery 对象”(通过 $() 包装 DOM 对象得到),而非原生 “DOM 对象”,二者方法不能混用(如 DOM 对象的 innerHTML 不能在 jQuery 对象上使用)。

(1)DOM 对象 → jQuery 对象

通过 $(DOM 对象) 包装即可将原生 DOM 对象转为 jQuery 对象:

阅读全文 »

ConcurrentHashMap 深度解析(基于 JDK 8)

ConcurrentHashMap 是 Java 并发包(java.util.concurrent)中提供的线程安全的 Map 实现,专为高并发场景设计。它解决了传统 Hashtable 全表锁效率低下的问题,通过细粒度的同步机制(JDK 8 中为 CAS + synchronized)实现高效并发,是多线程环境下键值对存储的首选。

ConcurrentHashMap 核心特性

线程安全

通过细粒度同步机制(而非全表锁)保证多线程读写安全,不同桶(数组索引)的操作可并发执行,大幅提升并发效率。

高效并发

  • 读操作(get)无锁(依赖 volatile 保证可见性),性能接近 HashMap
  • 写操作(putremove)仅锁定哈希冲突的链表 / 红黑树头节点,不阻塞其他桶的操作。

不允许 null 键值

键(key)和值(value)均不能为 null,避免与 get 方法返回 null 的歧义(无法区分 “键不存在” 和 “值为 null”)。

支持原子操作

提供 putIfAbsentremove(带条件)、replace 等原子操作,无需额外同步即可实现线程安全的复合逻辑(如 “不存在则插入”“存在则更新”)。

弱一致性迭代器

迭代器遍历期间允许其他线程修改集合,不会抛出 ConcurrentModificationException(弱一致性),但可能无法实时反映最新修改。

底层结构与并发机制演变

ConcurrentHashMap 的底层结构随 JDK 版本演进,核心差异在于锁机制:

JDK 7:分段锁(Segment)

阅读全文 »

MapReduce OutputFormat 解析:结果怎么从键值对变成文件

MapReduce 处理完数据后,最后一步是把结果写出去。

OutputFormat 就是干这个的——把 Reduce 输出的 <key, value> 键值对,转成目标格式写到指定位置。

它干三件事:

  1. 格式转换:把键值对转成文本、二进制或自定义格式
  2. 写文件:写到 HDFS 指定路径
  3. 路径校验:检查输出目录是否存在、权限对不对

和 InputFormat 是对称的——输入从文件到键值对,输出从键值对到文件。

OutputFormat 的继承结构

OutputFormat(抽象类)
├─ FileOutputFormat(文件输出基类)
│  ├─ TextOutputFormat(默认,文本输出)
│  ├─ SequenceFileOutputFormat(二进制序列文件)
│  └─ 自定义 OutputFormat
└─ 非文件类 OutputFormat(如数据库、消息队列)

所有文件类 OutputFormat 都继承自 FileOutputFormat,它负责输出目录的创建和校验,子类只需实现”怎么写”的逻辑。

三种常用 OutputFormat

1. TextOutputFormat——默认,人类可读

TextOutputFormat 是默认输出格式,每条键值对输出一行:

key\tvalue

键和值之间用 Tab(\t)分隔。输出文件是 part-r-xxxxx(xxxxx 是 Reduce 任务编号)。

// 什么都不用配,默认就是这个
job.setOutputFormatClass(TextOutputFormat.class);

输出示例:

hello	100
world	200
阅读全文 »

JavaScript DOM 操作详解:节点操作与文档交互实战指南

DOM(Document Object Model,文档对象模型)是浏览器将 HTML 文档解析后形成的树形结构,JavaScript 通过 DOM 操作可以动态修改网页的内容、结构和样式。从 “DOM 基础概念→核心操作流程→实战场景→常见问题” 四个维度,系统讲解 DOM 操作的底层逻辑与实用技巧,帮你掌握动态网页开发的核心能力。

DOM 核心概念:节点与文档树

在进行 DOM 操作前,需先理解 “节点” 和 “文档树” 的基本概念 ——HTML 文档中所有内容(标签、属性、文本)都被抽象为 “节点”,这些节点按层级关系组成 “文档树”。

1. 三种核心节点类型

HTML 文档中的节点主要分为三类,每种节点的特性和用途不同:

节点类型 描述 示例(基于 <p title="remark">备注</p> 核心属性(nodeType/nodeName/nodeValue
元素节点 HTML 标签(如 <p><div><li>),是文档树的 “骨架”,可包含子节点 <p> 标签本身 nodeType: 1nodeName: 标签名大写(如 P);nodeValue: null(元素节点无此属性)
属性节点 元素节点的属性(如 titleidclass),依附于元素节点存在 title="remark" 属性 nodeType: 2nodeName: 属性名(如 title);nodeValue: 属性值(如 remark
文本节点 元素节点内的文本内容(如标签中的文字、空格、换行),是元素节点的子节点 <p> 标签内的 “备注” 文本 nodeType: 3nodeName: #textnodeValue: 文本内容(如 备注
关键补充:
  • 除上述三种外,DOM 还有注释节点(nodeType: 8)、文档节点(documentnodeType: 9)等,但日常开发中以 “元素 / 属性 / 文本节点” 为主;
  • 节点关系:元素节点可包含子节点(文本节点、其他元素节点),属性节点是元素节点的 “附属”,不参与文档树的层级关系。

2. 文档树结构

HTML 文档被解析后,节点按 “父子、兄弟” 关系组成树形结构,例如:

阅读全文 »
0%