下面是一个详细的 YARN(Yet Another Resource Negotiator)单机和集群环境部署教程,包括部署过程中的注意事项以及一个使用案例。YARN 是 Hadoop 的资源管理器,可以调度和管理分布式应用程序的资源。
一、YARN 单机环境部署
1. 环境准备
- 操作系统:Linux (推荐使用 Ubuntu 20.04 或 CentOS 7)
- Java:YARN 需要 Java 环境,推荐使用 OpenJDK 8 或 11。
- Hadoop:YARN 是 Hadoop 的一部分,所以需要安装 Hadoop。
2. 安装 Java
在 Ubuntu 中:
sudo apt update
sudo apt install openjdk-11-jdk
在 CentOS 中:
sudo yum install java-11-openjdk
验证 Java 安装:
java -version
3. 下载并安装 Hadoop
访问 Hadoop 官网 下载最新版本的 Hadoop。
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
tar -xzvf hadoop-3.3.4.tar.gz
mv hadoop-3.3.4 /usr/local/hadoop
4. 配置环境变量
编辑 ~/.bashrc
文件,添加以下内容:
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
应用更改:
source ~/.bashrc
5. 配置 Hadoop
编辑 Hadoop 的配置文件,位于 $HADOOP_HOME/etc/hadoop
。
配置 hadoop-env.sh
设置 Java 路径:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
配置 core-site.xml
配置 HDFS 的默认文件系统:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
配置 hdfs-site.xml
配置 HDFS 的副本数量和数据节点目录:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/hdfs/datanode</value>
</property>
</configuration>
配置 yarn-site.xml
配置 YARN 资源管理器和节点管理器:
<configuration>
<property>
<name>yarn.resourcemanager.address</name>
<value>localhost:8032</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
</configuration>
配置 mapred-site.xml
配置 MapReduce 框架为 YARN:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
6. 格式化 HDFS
在首次使用 HDFS 前,需要格式化文件系统:
hdfs namenode -format
7. 启动 Hadoop 和 YARN
启动 HDFS 和 YARN:
start-dfs.sh
start-yarn.sh
8. 验证 YARN
访问 YARN ResourceManager Web 界面,确保 YARN 正常运行:
- ResourceManager: http://localhost:8088
9. 运行一个简单的 YARN 应用
我们可以运行 Hadoop 自带的 MapReduce 示例程序,以验证 YARN 配置是否正确。
# 创建输入目录并上传文件
hdfs dfs -mkdir -p /user/hadoop/input
hdfs dfs -put $HADOOP_HOME/etc/hadoop/*.xml /user/hadoop/input
# 运行 WordCount 示例
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.4.jar wordcount /user/hadoop/input /user/hadoop/output
# 查看输出
hdfs dfs -cat /user/hadoop/output/part-r-00000
注意事项
- 确保 Java 和 Hadoop 环境配置正确。
- 检查防火墙设置,确保 YARN 的端口可访问。
- 内存和资源配置:根据实际需求调整
yarn-site.xml
中的资源配置。
二、YARN 集群环境部署
1. 环境准备
- 多台服务器:至少 3 台(1 个 ResourceManager,2 个 NodeManager)。
- 网络:确保各节点之间可以互相访问。
- 操作系统:Linux (Ubuntu 或 CentOS)。
- Java:在所有节点上安装 Java。
- Hadoop:在所有节点上安装 Hadoop。
2. 配置 SSH 免密码登录
在 ResourceManager 节点上生成 SSH 密钥:
ssh-keygen -t rsa
将公钥复制到所有 NodeManager 节点:
ssh-copy-id user@nodemanager1
ssh-copy-id user@nodemanager2
3. 安装 Hadoop
在所有节点上安装 Hadoop,步骤与单机安装相同。
4. 配置 Hadoop 集群
配置 hadoop-env.sh
设置 Java 路径:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
配置 core-site.xml
配置 HDFS 的默认文件系统:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
配置 hdfs-site.xml
配置 HDFS 的副本数量和数据节点目录:
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/hdfs/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/hdfs/datanode</value>
</property>
</configuration>
配置 yarn-site.xml
配置 YARN 资源管理器和节点管理器:
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
</configuration>
配置 mapred-site.xml
配置 MapReduce 框架为 YARN:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
配置 slaves
文件
在 Master 节点上,编辑 $HADOOP_HOME/etc/hadoop/slaves
文件,添加所有 NodeManager 节点的主机名:
nodemanager1
nodemanager2
5. 格式化 HDFS
在 Master 节点上格式化 HDFS:
hdfs namenode -format
6. 启动 Hadoop 和 YARN
在 Master 节点上启动 HDFS 和 YARN:
start-dfs.sh
start-yarn.sh
7. 验证集群状态
访问 YARN ResourceManager Web 界面,确保所有节点正常运行:
- ResourceManager: http://master:8088
注意事项
- **确保 SSH
配置正确**,Master 节点需要通过 SSH 无密码访问 Worker 节点。
- 内存和资源配置:根据实际需求调整
yarn-site.xml
中的资源配置。 - 时钟同步:使用
ntpd
或chrony
确保所有节点的时钟同步。
三、YARN 使用案例:Word Count
使用 Java 实现 YARN Word Count
1. 编写 Java 程序
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;
import java.util.StringTokenizer;
public class WordCount {
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCount.class);
job.setMapperClass(TokenizerMapper.class);
job.setCombinerClass(IntSumReducer.class);
job.setReducerClass(IntSumReducer.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);
}
}
2. 编译并打包 Java 程序
确保你已经安装了 Maven,并在 pom.xml
文件中配置了 Hadoop 依赖:
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.3.4</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>3.3.4</version>
</dependency>
</dependencies>
编译并打包:
mvn clean package
3. 运行 Java 程序
将输入文件上传到 HDFS:
hdfs dfs -put localfile.txt /user/hadoop/input
运行 YARN 应用:
hadoop jar target/wordcount-1.0-SNAPSHOT.jar WordCount /user/hadoop/input /user/hadoop/output
4. 查看结果
hdfs dfs -cat /user/hadoop/output/part-r-00000
使用 Python 实现 YARN Word Count
可以使用 Hadoop Streaming 来实现 Python 版的 Word Count。
1. 编写 Python 程序
创建 mapper.py
:
#!/usr/bin/env python3
import sys
for line in sys.stdin:
words = line.strip().split()
for word in words:
print(f"{word}\t1")
创建 reducer.py
:
#!/usr/bin/env python3
import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
word, count = line.strip().split('\t', 1)
count = int(count)
if current_word == word:
current_count += count
else:
if current_word:
print(f"{current_word}\t{current_count}")
current_word = word
current_count = count
if current_word == word:
print(f"{current_word}\t{current_count}")
给文件添加可执行权限:
chmod +x mapper.py reducer.py
2. 运行 Python 程序
将输入文件上传到 HDFS:
hdfs dfs -put localfile.txt /user/hadoop/input
运行 Hadoop Streaming:
hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-3.3.4.jar \
-input /user/hadoop/input \
-output /user/hadoop/output \
-mapper mapper.py \
-reducer reducer.py \
-file mapper.py \
-file reducer.py
3. 查看结果
hdfs dfs -cat /user/hadoop/output/part-00000
总结
通过以上步骤,我们成功部署了 YARN 单机和集群环境,并实现了一个简单的 Word Count 应用。YARN 提供了强大的资源管理和调度能力,可以支持多种分布式计算框架,如 Hadoop MapReduce、Apache Spark 等。
部署过程中的注意事项
- 确保 Java 和 Hadoop 环境配置正确。
- 检查网络配置,确保各节点之间的通信正常。
- 合理分配资源,根据集群规模和任务需求调整 YARN 的资源配置。
- 时钟同步:使用
ntpd
或chrony
确保所有节点的时钟同步。 - 监控集群状态,定期检查节点状态和资源使用情况,及时处理故障节点。
通过合理配置和优化,YARN 可以在多种场景下提供高效的资源管理和任务调度能力,为大规模数据处理提供强有力的支持。