小菜鸟

java菜鸟号正在起航

SCP 命令详解:跨机器文件传输的高效工具

scp(Secure Copy)是基于 SSH 协议的跨机器文件传输命令,具有安全性高、使用简单的特点,常用于服务器之间或本地与服务器之间的文件同步。本文将详细介绍 scp 的用法、参数及实战技巧。

scp 基本语法与核心参数

基本语法

scp [参数] 源文件 目标路径
  • 源文件 / 目标路径格式:
    • 本地路径:直接使用绝对路径(如 /home/user/file.txt)或相对路径(如 ./docs)。
    • 远程路径:用户名@主机地址:文件路径(如 root@192.168.1.100:/var/log)。

核心参数

参数 作用
-r 递归复制目录(必须用于目录传输,否则仅复制文件)
-v 显示详细传输过程(便于调试)
-P 端口 指定 SSH 端口(默认 22,非默认端口需指定)
-i 私钥文件 使用指定的 SSH 私钥进行认证(适用于密钥登录)
-l 限速 限制传输速率(单位:Kbit/s,如 -l 800 限制为 100KB/s)
-p 保留文件的修改时间、权限等元数据

常见传输场景示例

本地文件 → 远程服务器

阅读全文 »

YARN 日志聚集:别一台一台登录服务器查日志了

在 YARN 上跑作业,每个任务分散在不同节点。如果没开日志聚集,排查问题你得这样:

  1. 去 YARN Web UI 看任务跑在哪个节点
  2. SSH 登录那个节点
  3. $HADOOP_HOME/logs/userlogs/ 下面翻日志
  4. 如果任务在不同节点重试过,每个节点都要登一遍

如果那个节点刚好宕机了,日志直接没了。

日志聚集干的事情很简单:任务完成后,自动把日志从各个节点收集起来,存到 HDFS 的一个统一目录里。 你不需要登录任何节点,在 Web UI 或者命令行直接看。

配置:就四个参数

$HADOOP_HOME/etc/hadoop/yarn-site.xml 里加这几行:

<!-- 开启日志聚集功能 -->  
<property>  
  <name>yarn.log-aggregation-enable</name>  
  <value>true</value>  
</property>  

<!-- 日志在 HDFS 中保留 7 天(604800 秒) -->  
<property>  
  <name>yarn.log-aggregation.retain-seconds</name>  
  <value>604800</value>  
</property>  

<!-- 日志清理检查间隔为 1 天(86400 秒) -->  
<property>  
  <name>yarn.log-aggregation.retain-check-interval-seconds</name>  
  <value>86400</value>  
</property>  

<!-- 日志在 HDFS 中的存储路径 -->  
<property>  
  <name>yarn.nodemanager.remote-app-log-dir</name>  
  <value>/var/log/hadoop-yarn/apps</value>  
</property>  

<!-- 日志目录后缀(默认使用用户名) -->  
<property>  
  <name>yarn.nodemanager.remote-app-log-dir-suffix</name>  
  <value>logs</value>  
</property>

配置完要重启 YARN 才生效:

stop-yarn.sh
start-yarn.sh

确认配置生效了

跑一个简单的 MapReduce 任务(比如 WordCount),等它跑完,去 HDFS 里看:

hdfs dfs -ls /var/log/hadoop-yarn/apps/

如果能看到以你用户名命名的目录,说明日志聚集已经生效了。

或者用命令行直接查日志:

yarn logs -applicationId application_xxx_xxx
阅读全文 »

Hadoop 历史服务器:作业跑完就消失?用它找回来

YARN Web UI 只能看到当前正在跑的作业。作业一旦完成,它就消失了——你看不到它跑了多久、占了多少资源、失败了为什么失败。

这就是历史服务器解决的问题:把已完成作业的日志和统计信息保存下来,方便事后追溯。

它只存 MapReduce 作业。Spark 有 Spark History Server,Flink 有 Flink History Server,各管各的。

历史服务器

核心配置:改两个文件

文件1:mapred-site.xml——历史服务器自己

<!-- RPC 通信地址 -->
<property>
  <name>mapreduce.jobhistory.address</name>
  <value>hadoop1:10020</value>
</property>

<!-- Web UI 地址 -->
<property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>hadoop1:19888</value>
</property>

<!-- 作业运行时临时日志目录 -->
<property>
  <name>mapreduce.jobhistory.intermediate-done-dir</name>
  <value>/mr-history/tmp</value>
</property>

<!-- 作业完成后归档日志目录 -->
<property>
  <name>mapreduce.jobhistory.done-dir</name>
  <value>/mr-history/done</value>
</property>

hadoop1 换成你实际部署历史服务器的那台机器的主机名。

文件2:yarn-site.xml——让 YARN Web UI 能跳转过来

<configuration>  
  <!-- 配置历史服务器地址,用于 YARN Web UI 跳转 -->  
  <property>  
    <name>yarn.log.server.url</name>  
    <value>http://hadoop1:19888/jobhistory/logs</value> <!-- 与历史服务器 Web UI 地址对应 -->  
  </property>  
</configuration>
阅读全文 »

Hadoop 三种运行模式:从单机调试到生产集群,一路搭过来

Hadoop 提供三种运行模式,本质上对应三个场景:

  • 单机模式:我电脑上写代码,跑通逻辑就行
  • 伪分布式模式:我测试 HDFS + YARN 功能对不对
  • 完全分布式模式:生产环境,多台机器跑大数据

从单机到完全分布式的过程,就是你的 Hadoop 技能从入门到生产的过程。

不管哪种模式,先配 Java 环境

Hadoop 依赖 Java,不管哪种模式,这一步都逃不掉。

# 安装 Java(以 CentOS 为例)
sudo yum install java-1.8.0-openjdk-devel

# 确认 Java 路径
which java
# 输出:/usr/bin/java

# 找到 JAVA_HOME
readlink -f /usr/bin/java | sed 's:/bin/java::'

然后在 $HADOOP_HOME/etc/hadoop/hadoop-env.sh 里加上:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

验证 Hadoop 能跑:

hadoop version

单机模式:什么都不配,直接跑

Hadoop 默认就是单机模式,解压即用。所有进程跑在单个 JVM 里,不启动 HDFS、不启动 YARN,读写本地文件系统。

什么时候用? 写 MapReduce 代码的时候,跑通逻辑就行。输入输出都在本地,不用跟 HDFS 打交道。

快速上手 WordCount:

# 创建输入目录
mkdir -p input
echo "hello hadoop world" > input/file.txt
echo "hello yarn" >> input/file.txt

# 运行 WordCount(JAR 包路径按实际版本调整)
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount input output

# 看结果
cat output/part-r-00000
# hadoop    1
# hello     2
# world     1
# yarn      1
阅读全文 »

Java 过滤器(Filter):Java Web 中的请求与响应拦截器

过滤器(Filter)是 Java Web 中用于拦截和处理请求 / 响应的组件,基于 Servlet 容器的函数回调机制工作。它可以在请求到达目标资源(如 Servlet、JSP)前预处理请求,或在响应返回客户端前处理响应,常用于身份验证、日志记录、数据转换等场景。本文将详细解析 Filter 的工作原理、使用方式及典型应用。

Filter 核心概念与作用

什么是 Filter?

Filter 是实现 javax.servlet.Filter 接口的 Java 类,由 Servlet 容器管理,主要作用包括:

  • 请求拦截:在请求到达目标资源前进行处理(如验证登录状态、过滤非法参数)。
  • 响应处理:在响应返回客户端前进行处理(如压缩数据、添加统一响应头)。
  • 链式处理:多个 Filter 可组成过滤器链,按顺序对请求 / 响应进行多级处理。

常见 Filter 类型

根据功能,Filter 可分为以下类型:

  • 身份验证过滤器:验证用户登录状态,未登录则重定向到登录页。
  • 日志过滤器:记录请求 URL、访问时间、客户端 IP 等信息。
  • 数据压缩过滤器:对响应数据进行 GZIP 压缩,减少传输量。
  • 编码过滤器:统一设置请求 / 响应的字符编码(如 UTF-8)。
  • XSS 过滤器:过滤请求中的恶意脚本,防止跨站脚本攻击。

Filter 接口与生命周期

Filter 接口核心方法

阅读全文 »
0%