Hadoop 速查表
本文档提供 Hadoop 常用命令、配置和代码片段的快速参考。
HDFS 命令速查
文件操作
| 命令 | 说明 | 示例 |
|---|---|---|
hdfs dfs -ls <path> | 列出目录内容 | hdfs dfs -ls /user/hadoop |
hdfs dfs -ls -R <path> | 递归列出 | hdfs dfs -ls -R / |
hdfs dfs -mkdir <path> | 创建目录 | hdfs dfs -mkdir /user/test |
hdfs dfs -mkdir -p <path> | 递归创建目录 | hdfs dfs -mkdir -p /a/b/c |
hdfs dfs -put <local> <hdfs> | 上传文件 | hdfs dfs -put local.txt /user/ |
hdfs dfs -get <hdfs> <local> | 下载文件 | hdfs dfs -get /user/file.txt ./ |
hdfs dfs -cat <file> | 查看文件内容 | hdfs dfs -cat /user/file.txt |
hdfs dfs -tail <file> | 查看文件末尾 | hdfs dfs -tail /user/file.txt |
hdfs dfs -head <file> | 查看文件开头 | hdfs dfs -head /user/file.txt |
hdfs dfs -rm <path> | 删除文件 | hdfs dfs -rm /user/file.txt |
hdfs dfs -rm -r <path> | 递归删除 | hdfs dfs -rm -r /user/dir |
hdfs dfs -rm -skipTrash <path> | 跳过回收站删除 | hdfs dfs -rm -skipTrash /file |
hdfs dfs -mv <src> <dst> | 移动文件 | hdfs dfs -mv /a/file /b/ |
hdfs dfs -cp <src> <dst> | 复制文件 | hdfs dfs -cp /a/file /b/ |
hdfs dfs -du <path> | 查看大小 | hdfs dfs -du -h /user/ |
hdfs dfs -du -s <path> | 汇总大小 | hdfs dfs -du -s -h /user/ |
hdfs dfs -count <path> | 统计文件数量 | hdfs dfs -count /user/ |
hdfs dfs -touchz <file> | 创建空文件 | hdfs dfs -touchz /user/empty.txt |
hdfs dfs -test -e <path> | 检查文件是否存在 | hdfs dfs -test -e /user/file.txt |
权限管理
| 命令 | 说明 | 示例 |
|---|---|---|
hdfs dfs -chmod <mode> <path> | 修改权限 | hdfs dfs -chmod 755 /user/dir |
hdfs dfs -chmod -R <mode> <path> | 递归修改权限 | hdfs dfs -chmod -R 755 /user/ |
hdfs dfs -chown <owner> <path> | 修改所有者 | hdfs dfs -chown hadoop /file |
hdfs dfs -chown <owner>:<group> <path> | 修改所有者和组 | hdfs dfs -chown hdfs:hdfs /file |
hdfs dfs -chgrp <group> <path> | 修改所属组 | hdfs dfs -chgrp hadoop /file |
副本管理
| 命令 | 说明 | 示例 |
|---|---|---|
hdfs dfs -setrep <num> <path> | 设置副本数 | hdfs dfs -setrep 3 /user/file |
hdfs dfs -setrep -R <num> <path> | 递归设置副本数 | hdfs dfs -setrep -R 2 /user/ |
管理命令
| 命令 | 说明 |
|---|---|
hdfs dfsadmin -report | 查看集群状态报告 |
hdfs dfsadmin -safemode get | 查看安全模式状态 |
hdfs dfsadmin -safemode enter | 进入安全模式 |
hdfs dfsadmin -safemode leave | 离开安全模式 |
hdfs dfsadmin -refreshNodes | 刷新节点列表 |
hdfs dfsadmin -metasave <file> | 保存元数据信息 |
hdfs fsck / | 检查文件系统健康状态 |
hdfs fsck / -files | 检查文件详情 |
hdfs fsck / -blocks | 检查块信息 |
hdfs fsck / -locations | 检查块位置 |
hdfs fsck / -list-corruptfileblocks | 列出损坏的块 |
hdfs getconf -confKey <key> | 获取配置值 |
YARN 命令速查
应用管理
| 命令 | 说明 |
|---|---|
yarn application -list | 列出所有应用 |
yarn application -list -appStates RUNNING | 列出运行中的应用 |
yarn application -status <appId> | 查看应用状态 |
yarn application -kill <appId> | 杀死应用 |
yarn application -moveToQueue <appId> -queue <queue> | 移动应用到队列 |
节点管理
| 命令 | 说明 |
|---|---|
yarn node -list | 列出所有节点 |
yarn node -status <nodeId> | 查看节点状态 |
yarn rmadmin -refreshNodes | 刷新节点 |
yarn rmadmin -refreshQueues | 刷新队列配置 |
日志查看
| 命令 | 说明 |
|---|---|
yarn logs -applicationId <appId> | 查看应用日志 |
yarn logs -applicationId <appId> -containerId <containerId> | 查看容器日志 |
yarn logs -applicationId <appId> -appOwner <owner> | 指定应用所有者 |
队列管理
| 命令 | 说明 |
|---|---|
yarn queue -status <queueName> | 查看队列状态 |
核心配置属性
core-site.xml
| 属性 | 默认值 | 说明 |
|---|---|---|
fs.defaultFS | file:/// | 默认文件系统,如 hdfs://namenode:9000 |
hadoop.tmp.dir | /tmp/hadoop-${user.name} | Hadoop 临时目录 |
io.file.buffer.size | 4096 | 读写缓冲区大小 |
io.compression.codecs | - | 压缩编解码器列表 |
hadoop.security.authentication | simple | 认证方式:simple 或 kerberos |
hdfs-site.xml
| 属性 | 默认值 | 说明 |
|---|---|---|
dfs.replication | 3 | 默认副本数 |
dfs.blocksize | 134217728 (128MB) | 数据块大小 |
dfs.namenode.name.dir | ${hadoop.tmp.dir}/dfs/name | NameNode 元数据目录 |
dfs.datanode.data.dir | ${hadoop.tmp.dir}/dfs/data | DataNode 数据目录 |
dfs.namenode.http-address | 0.0.0.0:9870 | NameNode Web UI 地址 |
dfs.namenode.handler.count | 10 | NameNode RPC 处理线程数 |
dfs.datanode.handler.count | 10 | DataNode 处理线程数 |
dfs.datanode.max.transfer.threads | 4096 | DataNode 最大传输线程数 |
dfs.heartbeat.interval | 3s | DataNode 心跳间隔 |
dfs.namenode.safemode.threshold-pct | 0.999f | 安全模式退出阈值 |
dfs.permissions.enabled | true | 是否启用权限检查 |
dfs.webhdfs.enabled | true | 是否启用 WebHDFS |
yarn-site.xml
| 属性 | 默认值 | 说明 |
|---|---|---|
yarn.resourcemanager.hostname | 0.0.0.0 | ResourceManager 主机名 |
yarn.resourcemanager.address | ${yarn.resourcemanager.hostname}:8032 | RM 地址 |
yarn.resourcemanager.webapp.address | ${yarn.resourcemanager.hostname}:8088 | RM Web UI 地址 |
yarn.nodemanager.resource.memory-mb | 8192 | NodeManager 可用内存 |
yarn.nodemanager.resource.cpu-vcores | 8 | NodeManager 可用 CPU 核心数 |
yarn.scheduler.minimum-allocation-mb | 1024 | 容器最小内存 |
yarn.scheduler.maximum-allocation-mb | 8192 | 容器最大内存 |
yarn.nodemanager.aux-services | - | 辅助服务,如 mapreduce_shuffle |
yarn.nodemanager.vmem-check-enabled | true | 是否启用虚拟内存检查 |
yarn.log-aggregation-enable | false | 是否启用日志聚合 |
mapred-site.xml
| 属性 | 默认值 | 说明 |
|---|---|---|
mapreduce.framework.name | local | 运行框架:local/yarn |
mapreduce.jobtracker.address | local | JobTracker 地址 |
mapreduce.jobhistory.address | 0.0.0.0:10020 | 历史服务器地址 |
mapreduce.jobhistory.webapp.address | 0.0.0.0:19888 | 历史服务器 Web UI |
mapreduce.map.memory.mb | 1024 | Map 任务内存 |
mapreduce.reduce.memory.mb | 1024 | Reduce 任务内存 |
mapreduce.map.java.opts | -Xmx820m | Map JVM 参数 |
mapreduce.reduce.java.opts | -Xmx820m | Reduce JVM 参数 |
mapreduce.task.io.sort.mb | 100 | Map 输出缓冲区大小 |
mapreduce.task.io.sort.factor | 10 | 合并因子 |
mapreduce.reduce.shuffle.parallelcopies | 5 | Reduce 拉取并行数 |
启动和停止命令
服务启动
| 命令 | 说明 |
|---|---|
start-dfs.sh | 启动 HDFS 集群 |
stop-dfs.sh | 停止 HDFS 集群 |
start-yarn.sh | 启动 YARN 集群 |
stop-yarn.sh | 停止 YARN 集群 |
start-all.sh | 启动所有服务 |
stop-all.sh | 停止所有服务 |
mr-jobhistory-daemon.sh start historyserver | 启动历史服务器 |
单组件启动
| 命令 | 说明 |
|---|---|
hdfs --daemon start namenode | 启动 NameNode |
hdfs --daemon start datanode | 启动 DataNode |
hdfs --daemon start secondarynamenode | 启动 SecondaryNameNode |
yarn --daemon start resourcemanager | 启动 ResourceManager |
yarn --daemon start nodemanager | 启动 NodeManager |
Web UI 端口
| 服务 | 默认端口 | URL |
|---|---|---|
| NameNode | 9870 | http://namenode:9870 |
| SecondaryNameNode | 9868 | http://secondary:9868 |
| DataNode | 9864 | http://datanode:9864 |
| ResourceManager | 8088 | http://rm:8088 |
| NodeManager | 8042 | http://nm:8042 |
| JobHistory Server | 19888 | http://history:19888 |
MapReduce 编程模板
基本作业模板
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class MyJob {
public static class MyMapper
extends Mapper<LongWritable, Text, Text, IntWritable> {
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// Map 逻辑
String line = value.toString();
// 处理数据...
context.write(new Text("key"), new IntWritable(1));
}
}
public static class MyReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
// Reduce 逻辑
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "my job");
job.setJarByClass(MyJob.class);
job.setMapperClass(MyMapper.class);
job.setReducerClass(MyReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
常用 Writable 类型
| Hadoop 类型 | Java 类型 | 说明 |
|---|---|---|
IntWritable | int | 整型 |
LongWritable | long | 长整型 |
FloatWritable | float | 浮点型 |
DoubleWritable | double | 双精度 |
Text | String | 文本字符串 |
BooleanWritable | boolean | 布尔型 |
NullWritable | null | 空值 |
BytesWritable | byte[] | 字节数组 |
ArrayWritable | 数组 | 数组类型 |
MapWritable | Map | 映射类型 |
常见运维命令
格式化和初始化
# 格式化 NameNode(仅首次)
hdfs namenode -format
# 格式化并指定集群 ID
hdfs namenode -format -clusterId mycluster
均衡数据
# 启动数据均衡
hdfs balancer
# 指定带宽均衡
hdfs balancer -Ddfs.datanode.balance.bandwidthPerSec=50m
# 指定阈值均衡
hdfs balancer -threshold 5
快照管理
# 允许目录创建快照
hdfs dfsadmin -allowSnapshot /user/data
# 创建快照
hdfs dfs -createSnapshot /user/data snapshot1
# 删除快照
hdfs dfs -deleteSnapshot /user/data snapshot1
# 列出快照
hdfs lsSnapshottableDir
配额管理
# 设置空间配额
hdfs dfsadmin -setSpaceQuota 1T /user/data
# 设置文件数量配额
hdfs dfsadmin -setQuota 1000 /user/data
# 查看配额使用
hdfs dfs -count -q /user/data
故障排查
常见错误
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
NameNode is not formatted | NameNode 未格式化 | 执行 hdfs namenode -format |
SafeModeException | 集群处于安全模式 | 等待或手动退出安全模式 |
NotReplicatedYetException | 副本数不足 | 检查 DataNode 状态 |
NoRouteToHostException | 网络不通 | 检查网络和防火墙 |
DiskOutOfSpaceException | 磁盘空间不足 | 清理空间或扩容 |
日志位置
| 组件 | 日志路径 |
|---|---|
| NameNode | $HADOOP_HOME/logs/hadoop--namenode-.log |
| DataNode | $HADOOP_HOME/logs/hadoop--datanode-.log |
| ResourceManager | $HADOOP_HOME/logs/yarn--resourcemanager-.log |
| NodeManager | $HADOOP_HOME/logs/yarn--nodemanager-.log |
检查命令
# 检查 Java 进程
jps
# 检查端口占用
netstat -tlnp | grep 9000
# 检查磁盘空间
df -h
# 检查内存使用
free -m
# 查看 NameNode 日志
tail -f $HADOOP_HOME/logs/hadoop-*-namenode-*.log
性能调优参数
内存配置建议
| 集群规模 | NameNode 内存 | DataNode 内存 | ResourceManager 内存 |
|---|---|---|---|
| 小型(少于 50 节点) | 8-16GB | 4-8GB | 4-8GB |
| 中型(50-200 节点) | 16-32GB | 8-16GB | 8-16GB |
| 大型(超过 200 节点) | 32-64GB | 16-32GB | 16-32GB |
关键调优参数
<!-- NameNode 处理线程数 -->
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<!-- Map 输出缓冲区 -->
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>256</value>
</property>
<!-- Reduce 拉取并行数 -->
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>10</value>
</property>
<!-- YARN 容器最小内存 -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<!-- YARN 容器最大内存 -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>32768</value>
</property>
压缩编解码器
| 编解码器 | 类名 | 特点 |
|---|---|---|
| Gzip | org.apache.hadoop.io.compress.GzipCodec | 压缩率高,CPU 消耗高 |
| Snappy | org.apache.hadoop.io.compress.SnappyCodec | 压缩速度快,压缩率中等 |
| LZO | com.hadoop.compression.lzo.LzoCodec | 压缩速度快,可分割 |
| Bzip2 | org.apache.hadoop.io.compress.BZip2Codec | 压缩率高,可分割 |
| LZ4 | org.apache.hadoop.io.compress.Lz4Codec | 压缩速度快 |
启用压缩配置
<!-- Map 输出压缩 -->
<property>
<name>mapreduce.map.output.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.map.output.compress.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
<!-- Reduce 输出压缩 -->
<property>
<name>mapreduce.output.fileoutputformat.compress</name>
<value>true</value>
</property>
<property>
<name>mapreduce.output.fileoutputformat.compress.codec</name>
<value>org.apache.hadoop.io.compress.GzipCodec</value>
</property>