小菜鸟

java菜鸟号正在起航

Hadoop 操作 Parquet 文件:怎么读、怎么写、要注意什么

Parquet 是 Hadoop 生态里最常用的列式存储格式。跟 Text 格式相比,它的核心优势:

  • 压缩率高:列式存储 + 编码压缩,文件体积比 Text 小得多
  • 查询快:只读需要的列,不用整行加载(谓词下推 + 列裁剪)
  • Schema 自带:文件里包含字段名、类型,读的时候不用额外定义

在 Hive、Spark、Impala 里直接用 SQL 就能查,但如果你要自己写 MapReduce 读 Parquet,就得用专门的 API。

添加依赖

<dependency>
    <groupId>org.apache.parquet</groupId>
    <artifactId>parquet-column</artifactId>
    <version>1.8.1</version>
</dependency>
<dependency>
    <groupId>org.apache.parquet</groupId>
    <artifactId>parquet-hadoop</artifactId>
    <version>1.8.1</version>
</dependency>

注意: Parquet 依赖的 Guava 版本如果跟 Hadoop 的不一样,会报 NoSuchMethodError。如果遇到,参考前面问题集锦的处理方式——统一两边 Guava 版本。

读取流程三步走

读取 Parquet 文件的核心步骤是三件事:① 创建输入格式 → ② 创建记录读取器 → ③ 遍历解析每条记录

public class ParquetReaderMapper extends Mapper<Void, Group, NullWritable, Text> {
    
    private Gson gson = new Gson();
    private Text outValue = new Text();
    
    @Override
    protected void map(Void key, Group value, Context context) 
            throws IOException, InterruptedException {
        // 第三步:解析每条记录
        outValue.set(groupToJson(value));
        context.write(NullWritable.get(), outValue);
    }
    
    private String groupToJson(Group group) {
        Map<String, Object> map = new HashMap<>();
        // 按字段名取数,类型要匹配
        map.put("name", group.getString("name", 0));
        map.put("age", group.getInteger("age", 0));
        return gson.toJson(map);
    }
}
阅读全文 »

请求转发与重定向:Java Web 中的页面跳转机制

在 Java Web 开发中,页面跳转是常见需求,主要通过请求转发(Forward)请求重定向(Redirect) 两种方式实现。它们在原理、使用场景和特性上有显著区别,理解这些差异对构建高效的 Web 应用至关重要。本文将详细解析两种机制的实现、区别及适用场景。

请求转发(Forward)

请求转发是指服务器收到客户端请求后,将请求 “转发” 给内部另一个资源(如 Servlet、JSP)处理,最终由目标资源生成响应返回给客户端。整个过程在服务器内部完成,客户端感知不到中间转发步骤。

实现方式

通过 HttpServletRequestgetRequestDispatcher() 方法获取 RequestDispatcher 对象,再调用其 forward() 方法实现转发:

// 请求转发到 /targetServlet
request.getRequestDispatcher("/targetServlet").forward(request, response);

RequestDispatcher 接口

RequestDispatcher 由 Servlet 容器创建,用于封装目标资源并提供转发或包含功能,核心方法:

  • forward(request, response):将请求转发到目标资源,目标资源的响应会直接返回给客户端。
  • include(request, response):将目标资源的响应包含到当前响应中(如页面片段复用)。

接口中定义了多个常量(如 FORWARD_REQUEST_URIINCLUDE_CONTEXT_PATH),用于在转发 / 包含时传递原始请求的元信息(如 URI、路径等)。

转发的特性

  • 一次请求:客户端仅发起一次请求,服务器内部转发,requestresponse 对象在整个过程中复用。
  • 地址栏不变:客户端地址栏显示的仍是初始请求的 URL,不显示目标资源的路径。
  • 共享 request 数据:转发过程中,requestattribute 可在多个资源间共享(通过 setAttribute/getAttribute)。
  • 仅限内部资源:只能转发到当前 Web 应用内的资源(如 /target.jsp/servlet/demo),无法跨应用或跨域。
  • 路径规则:转发路径中的 / 代表当前 Web 应用的根目录(如 /target 等价于 http://localhost:8080/应用名/target)。
阅读全文 »

Java Web 响应处理:HttpServletResponse 详解

在 Java Web 开发中,服务器对客户端请求的响应由 HttpServletResponse 对象封装。它负责构建 HTTP 响应消息(状态行、响应头、响应正文),并将结果返回给客户端。本文将详细解析 HttpServletResponse 的核心功能,包括状态码设置、响应头管理、响应正文输出及常见应用场景。

HttpServletResponse 概述

HttpServletResponseServletResponse 接口的子接口,专门用于处理 HTTP 协议的响应。它由 Servlet 容器创建,通过 service() 方法传递给 Servlet,开发者通过其提供的方法构建响应内容。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 通过 resp 构建响应...
}

状态行处理

HTTP 响应状态行由协议版本状态码状态描述组成(如 HTTP/1.1 200 OK)。状态码用于告知客户端请求处理结果,HttpServletResponse 提供以下方法设置状态码:

核心方法

  • setStatus(int sc):设置状态码(如 200 表示成功,404 表示资源不存在)。
  • sendError(int sc):发送错误状态码,并触发容器的错误页面机制(如 404 会显示自定义错误页)。
  • sendError(int sc, String msg):发送错误状态码及自定义描述信息。

常见状态码

状态码 含义 常量(HttpServletResponse) 应用场景
200 请求成功 SC_OK 正常返回响应正文
302 临时重定向 SC_FOUND 页面跳转(如登录后跳首页)
400 客户端请求错误 SC_BAD_REQUEST 参数格式错误
401 未认证 SC_UNAUTHORIZED 未登录访问受保护资源
403 权限不足 SC_FORBIDDEN 登录后无操作权限
404 资源不存在 SC_NOT_FOUND 请求 URL 错误
500 服务器内部错误 SC_INTERNAL_SERVER_ERROR 代码抛出异常

示例

阅读全文 »

Linux 定时任务全指南:at 与 crontab 详解

在 Linux 系统中,定时任务是自动化运维的核心工具,能够帮助用户在指定时间自动执行脚本或命令。本文将详细介绍两种常用的定时任务工具:at(一次性任务)和 crontab(周期性任务),包括它们的使用方法、配置规则及实战技巧。

at:一次性定时任务

at 工具用于安排在未来某个特定时间执行一次的任务(如临时备份、定时发送邮件),依赖 atd 服务。

启动 atd 服务

at 命令需要 atd 守护进程支持,使用前需确保服务已启动:

# 启动 atd 服务
sudo service atd start

# 设置开机自启动(CentOS)
sudo chkconfig atd on

# 设置开机自启动(Ubuntu)
sudo systemctl enable atd

at 命令基本用法

at [选项] 时间
常用选项
  • -f 脚本文件:指定要执行的脚本(默认从标准输入读取命令)。
  • -m:任务执行完成后,通过邮件通知用户(需系统配置邮件服务)。
  • -c 作业号:查看指定作业的具体内容。
时间格式

at 支持多种时间表达方式,灵活易用:

阅读全文 »

Nginx Gzip 压缩配置详解:提升传输效率的实战指南

Gzip 压缩是优化 Web 性能的关键手段,通过对响应数据(如 HTML、CSS、JS)进行实时压缩,减少网络传输量,提升页面加载时间。Nginx 内置 Gzip 模块,可通过简单配置实现高效压缩。本文详细讲解 Gzip 的核心参数、配置方法及最佳实践,帮助最大化压缩效率。

Gzip 压缩原理与优势

  • 原理:Nginx 在向客户端发送响应前,对符合条件的文件(如文本类资源)进行 Gzip 压缩,客户端接收后自动解压(现代浏览器均支持);
  • 优势
    • 减少传输数据量(通常压缩率可达 50%-70%);
    • 降低带宽消耗,提升页面加载速度;
    • 尤其适合文本类资源(HTML、CSS、JS),对图片(已压缩格式如 JPG/PNG)效果有限。

核心配置参数详解

Nginx 的 Gzip 配置主要通过gzip及相关指令实现,常用参数如下:

指令 作用 推荐值
gzip 开启 / 关闭 Gzip 压缩 on(开启)
gzip_comp_level 压缩级别(1-9,级别越高压缩率越高但 CPU 消耗越大) 2-4(平衡压缩率与性能)
gzip_min_length 最小压缩文件大小(小于该值的文件不压缩,避免反增体积) 1k(1024 字节)
gzip_buffers 压缩缓存空间(个数 × 大小) 16 8k(16 个缓存块,每个 8k)
gzip_types 指定需要压缩的 MIME 类型(文件类型) text/plain text/css application/javascript ...
gzip_vary 向响应头添加Vary: Accept-Encoding,告知代理服务器缓存压缩 / 非压缩版本 on
gzip_proxied 对代理后端返回的数据是否压缩(如反向代理场景) any(无条件压缩)
gzip_static 优先使用预压缩的.gz文件(如index.html.gz),减少实时压缩开销 on

基础配置示例

以下是通用的 Gzip 配置,适用于大多数 Web 服务:

阅读全文 »
0%