0%

多触发策略组合问题解析:Cron 与 TimeBased 是否会重复触发

1
2
3
4
5
<Policies>
<CronTriggeringPolicy schedule="0 0 0 * * ?"/>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="1024 MB"/>
</Policies>

<Policies> 同时包含了 CronTriggeringPolicyTimeBasedTriggeringPolicySizeBasedTriggeringPolicy,核心疑问是 “0 点时是否会触发两个策略(Cron 和 TimeBased)”。下面从 Log4j2 多策略执行逻辑、两种时间相关策略的差异入手,详细分析问题并给出优化建议。

多触发策略的核心执行逻辑

Log4j2 的 <Policies>组合触发策略(CompositeTriggeringPolicy),其核心规则是:
只要任意一个策略满足触发条件,就会立即执行日志滚动,且后续策略不再判断(即 “短路执行”,类似if-else的逻辑,而非 “所有满足条件的策略都执行”)。

具体流程如下:

  1. 日志写入时,Log4j2 按 <Policies> 中策略的配置顺序依次检查;
  2. 若第一个策略(如CronTriggeringPolicy)满足条件,则触发滚动,跳过后续策略;
  3. 若第一个策略不满足,再检查第二个(如TimeBasedTriggeringPolicy),以此类推;
  4. SizeBasedTriggeringPolicy 会在每次日志写入时检查文件大小,若达到阈值,无论其他策略是否满足,都会优先触发滚动。

0 点时的策略触发分析

配置中,CronTriggeringPolicy(0 点触发)和 TimeBasedTriggeringPolicy(默认按天触发)在 “0 点” 这个时间点看似都满足条件,但实际不会重复触发,原因如下:

1. 两种时间策略的本质差异

虽然两者都与 “时间” 相关,但触发逻辑和依赖条件完全不同:

策略 触发逻辑 依赖配置 执行方式
CronTriggeringPolicy 基于 Cron 表达式的定时任务,内部启动独立线程,到时间后主动标记 “需要滚动” schedule(Cron 表达式) 主动触发(与日志写入无关)
TimeBasedTriggeringPolicy 基于 filePattern 时间粒度,日志写入时检查当前时间是否超出粒度范围 filePattern(如%d{yyyyMMdd} 被动触发(依赖日志写入)

2. 0 点时的实际执行场景

阅读全文 »

jq 处理 JSON 详解:从安装到高级应用

在日常工作中,JSON 格式的日志、配置文件或接口响应非常常见,jq 作为轻量级的命令行 JSON 处理器,能高效完成过滤、提取、分组、计数等操作,是处理 JSON 数据的必备工具。本文将从安装 jq 开始,围绕 JSON 数组和 “每行一个 JSON 对象”(JSON Lines)两种常见格式,详解 jq 的核心用法。

安装 jq

jq 不是系统默认安装的工具,需手动安装,以下是主流操作系统的安装方法:

Linux 系统

(1)Debian/Ubuntu 系列
1
sudo apt-get update && sudo apt-get install -y jq
(2)CentOS/RHEL 系列
1
2
3
4
5
6
# CentOS 7 及以上(需启用 EPEL 源)
sudo yum install -y epel-release
sudo yum install -y jq

# CentOS 8 / Rocky Linux 等(使用 dnf)
sudo dnf install -y jq
(3)Fedora
1
sudo dnf install -y jq
(4)Arch Linux
1
sudo pacman -S jq

macOS 系统

(1)使用 Homebrew(推荐)
阅读全文 »

推荐系统中的协同过滤算法:原理、实现与应用

协同过滤(Collaborative Filtering)是推荐系统中最经典且应用广泛的算法之一,其核心思想是利用用户群体的行为数据(如评分、点击、购买),发现用户或物品之间的相似性,进而为用户推荐其可能感兴趣的物品。与基于内容的推荐不同,协同过滤无需依赖物品的具体特征(如电影的类型、书籍的作者),仅通过用户行为的 “协同” 模式即可生成推荐。

协同过滤的核心思想与分类

协同过滤的核心假设是:

如果用户 A 和用户 B 在过去对某些物品有相似的偏好,那么用户 A 未来可能喜欢用户 B 喜欢的其他物品;反之亦然。

根据数据利用方式的不同,协同过滤可分为两大主流类型:

  1. 基于用户的协同过滤(User-Based Collaborative Filtering) 找到与目标用户兴趣相似的 “邻居用户”,将邻居用户喜欢的物品推荐给目标用户。
  2. 基于物品的协同过滤(Item-Based Collaborative Filtering) 计算物品之间的相似度(如 “喜欢物品 A 的用户也喜欢物品 B”),为用户推荐与其之前喜欢的物品相似的其他物品。

基于用户的协同过滤(User-Based CF)

算法流程

步骤 1:构建用户 - 物品评分矩阵

假设存在用户集合U = {u1, u2, ..., um}和物品集合I = {i1, i2, ..., in},构建一个m×n的评分矩阵R,其中R[u][i]表示用户u对物品i的评分(若未评分则为 0 或空)。

示例矩阵(行:用户,列:物品,值:评分 1-5):

用户 \ 物品 电影 A 电影 B 电影 C 电影 D 电影 E
用户 1 5 4 0 0 1
用户 2 0 0 5 4 0
用户 3 5 0 0 0 1
用户 4 0 0 4 5 0
步骤 2:计算用户相似度

衡量两个用户uv的相似度,常用方法:

  • 皮尔逊相关系数(Pearson Correlation):衡量两个用户评分趋势的一致性(取值范围 [-1,1],越接近 1 越相似)。 公式:

    sim(u,v)=iIuv(R[u][i]R¯[u])(R[v][i]R¯[v])iIuv(R[u][i]R¯[u])2iIuv(R[v][i]R¯[v])2

    其中,I_uv是用户uv共同评分的物品集合,\bar{R}[u]是用户u的平均评分。

  • 余弦相似度(Cosine Similarity):将用户的评分向量视为高维空间中的向量,相似度为向量夹角的余弦值(取值范围 [0,1])。 公式:

    sim(u,v)=iIR[u][i]R[v][i]iIR[u][i]2iIR[v][i]2
阅读全文 »

Hadoop 配置实践:从零开始搭建单机环境

以下以 Apache Hadoop 2.7.x 为例,讲解单机环境的核心配置与启动流程(生产环境需配置分布式集群)。

步骤 1:核心配置文件

Hadoop 配置文件位于 $HADOOP_HOME/etc/hadoop 目录,主要包括:

1. core-site.xml(核心配置)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- NameNode 节点的 URI:协议、主机、端口 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<!-- Hadoop 临时文件存储目录(需手动创建)
如果在hdfs-site.xml中不配置NameNode节点和DataNode节点的数据存放位置时,默认放在该目录下
-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/data/hadoop/tmp</value>
</property>
<!-- 缓冲区大小,默认 4096 -->
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
</configuration>

2. hdfs-site.xml(HDFS 配置)

阅读全文 »

八皇后问题

八皇后问题是经典的回溯算法应用案例,由国际象棋棋手马克斯・贝瑟尔于 1848 年提出。问题要求在 8×8 的国际象棋棋盘上放置 8 个皇后,使得任意两个皇后不能处于同一行、同一列或同一斜线上,最终找出所有可能的摆放方案。

一、问题核心约束

放置皇后时需满足以下条件:

  1. 不同行:每一行只能放置 1 个皇后(可通过按行放置天然满足)。
  2. 不同列:任意两个皇后不能在同一列。
  3. 不同斜线:任意两个皇后不能在同一对角线(包括主对角线和副对角线)。

若用坐标 (row, col) 表示皇后位置,则对于两个皇后 (r1, c1)(r2, c2),需满足:

  • c1c2(不同列)
  • (|r1r2||c1c2|)(不同斜线,即行差不等于列差)

二、解决方案:回溯算法

回溯算法是解决八皇后问题的最优方法,其核心思想是逐行尝试放置皇后,若当前位置不满足约束则回退到上一行,尝试下一列,直到找到所有合法方案。

算法步骤:

  1. 初始化:创建一个数组 queens 记录每一行皇后的列位置(索引为行号,值为列号)。

  2. 递归放置:从第 0 行开始,逐行尝试在每一列放置皇后:

    • 检查当前列是否与已放置的皇后冲突(列冲突或斜线冲突)。
  • 若不冲突,放置皇后并递归处理下一行。

    • 若冲突,尝试下一列。

阅读全文 »