Hadoop单机及集群部署

目录

    • [一、Hadoop 单机模式部署](#一、Hadoop 单机模式部署)
      • [1. 环境准备](#1. 环境准备)
      • [2. 安装 Java](#2. 安装 Java)
      • [3. 下载并安装 Hadoop](#3. 下载并安装 Hadoop)
      • [4. 配置环境变量](#4. 配置环境变量)
      • [5. 配置 Hadoop](#5. 配置 Hadoop)
        • [编辑 core-site.xml](#编辑 core-site.xml)
        • [编辑 hdfs-site.xml](#编辑 hdfs-site.xml)
        • [编辑 mapred-site.xml](#编辑 mapred-site.xml)
        • [编辑 yarn-site.xml](#编辑 yarn-site.xml)
      • [6. 格式化 Namenode](#6. 格式化 Namenode)
      • [7. 启动 Hadoop 服务](#7. 启动 Hadoop 服务)
      • [8. 验证 Hadoop](#8. 验证 Hadoop)
      • 注意事项
    • [二、Hadoop 集群模式部署](#二、Hadoop 集群模式部署)
      • [1. 环境准备](#1. 环境准备)
      • [2. 设置 SSH 免密码登录](#2. 设置 SSH 免密码登录)
      • [3. 下载并安装 Hadoop](#3. 下载并安装 Hadoop)
      • [4. 配置 Hadoop](#4. 配置 Hadoop)
        • [编辑 core-site.xml](#编辑 core-site.xml)
        • [编辑 hdfs-site.xml](#编辑 hdfs-site.xml)
        • [编辑 mapred-site.xml](#编辑 mapred-site.xml)
        • [编辑 yarn-site.xml](#编辑 yarn-site.xml)
        • [配置 slaves 文件](#配置 slaves 文件)
      • [5. 启动 Hadoop 集群](#5. 启动 Hadoop 集群)
      • [6. 验证集群状态](#6. 验证集群状态)
      • 注意事项
    • [三、Hadoop 使用案例:Word Count](#三、Hadoop 使用案例:Word Count)
      • [1. 创建输入文件](#1. 创建输入文件)
      • [2. 编写 MapReduce 程序](#2. 编写 MapReduce 程序)
      • [3. 编译并运行程序](#3. 编译并运行程序)
    • [四、使用 Python 实现 Word Count](#四、使用 Python 实现 Word Count)
      • [1. 环境准备](#1. 环境准备)
      • [2. 编写 Mapper 和 Reducer](#2. 编写 Mapper 和 Reducer)
      • [3. 设置可执行权限](#3. 设置可执行权限)
      • [4. 上传输入文件到 HDFS](#4. 上传输入文件到 HDFS)
      • [5. 使用 Hadoop Streaming 运行作业](#5. 使用 Hadoop Streaming 运行作业)
      • [6. 查看结果](#6. 查看结果)
      • [7. Python 实现 Word Count 示例](#7. Python 实现 Word Count 示例)
      • [8. 注意事项](#8. 注意事项)
      • [9. 总结](#9. 总结)
      • [10. 查看结果](#10. 查看结果)
    • 五、总结与注意事项

下面是关于如何在单机和集群环境中部署Hadoop的详细指南,以及部署过程中的注意事项和一个实际使用案例。我们将涵盖从基础安装到配置细节,并讨论一些常见的问题和解决方案。

一、Hadoop 单机模式部署

1. 环境准备

  • 操作系统:Linux (推荐使用 Ubuntu 20.04 或 CentOS 7)
  • Java:Hadoop 需要 Java 环境,推荐使用 OpenJDK 8。
  • SSH:Hadoop 需要 SSH 访问,因此要确保 SSH 服务已安装并运行。

2. 安装 Java

在 Ubuntu 中:

bash 复制代码
sudo apt update
sudo apt install openjdk-8-jdk

在 CentOS 中:

bash 复制代码
sudo yum install java-1.8.0-openjdk

验证 Java 安装:

bash 复制代码
java -version

3. 下载并安装 Hadoop

访问 Hadoop 官网 下载最新版本的 Hadoop。

bash 复制代码
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
tar -xzvf hadoop-3.3.1.tar.gz
mv hadoop-3.3.1 /usr/local/hadoop

4. 配置环境变量

编辑 ~/.bashrc 文件,添加以下内容:

bash 复制代码
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

应用更改:

bash 复制代码
source ~/.bashrc

5. 配置 Hadoop

编辑 core-site.xml

路径:$HADOOP_HOME/etc/hadoop/core-site.xml

xml 复制代码
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>
编辑 hdfs-site.xml

路径:$HADOOP_HOME/etc/hadoop/hdfs-site.xml

xml 复制代码
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///usr/local/hadoop/hadoop_data/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///usr/local/hadoop/hadoop_data/hdfs/datanode</value>
    </property>
</configuration>
编辑 mapred-site.xml

复制模板文件并编辑:

bash 复制代码
cp $HADOOP_HOME/etc/hadoop/mapred-site.xml.template $HADOOP_HOME/etc/hadoop/mapred-site.xml

路径:$HADOOP_HOME/etc/hadoop/mapred-site.xml

xml 复制代码
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
编辑 yarn-site.xml

路径:$HADOOP_HOME/etc/hadoop/yarn-site.xml

xml 复制代码
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

6. 格式化 Namenode

bash 复制代码
hdfs namenode -format

7. 启动 Hadoop 服务

bash 复制代码
start-dfs.sh
start-yarn.sh

8. 验证 Hadoop

访问 Hadoop Web 界面:

注意事项

  • 确保 Java 环境配置正确。
  • 确保 SSH 服务正常运行。
  • 检查配置文件路径和参数的正确性。

二、Hadoop 集群模式部署

1. 环境准备

  • 多台服务器,至少 3 台(1 个 NameNode,2 个 DataNode)。
  • 网络:确保各节点之间可以互相访问。
  • 操作系统:Linux (Ubuntu 或 CentOS)。
  • Java:在所有节点上安装 Java。

2. 设置 SSH 免密码登录

在主节点上生成 SSH 密钥:

bash 复制代码
ssh-keygen -t rsa

将公钥复制到所有从节点:

bash 复制代码
ssh-copy-id user@datanode1
ssh-copy-id user@datanode2

3. 下载并安装 Hadoop

在所有节点上安装 Hadoop,步骤与单机安装相同。

4. 配置 Hadoop

编辑 core-site.xml

在所有节点上配置相同的 core-site.xml:

xml 复制代码
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://namenode:9000</value>
    </property>
</configuration>
编辑 hdfs-site.xml

在所有节点上配置相同的 hdfs-site.xml:

xml 复制代码
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///usr/local/hadoop/hadoop_data/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///usr/local/hadoop/hadoop_data/hdfs/datanode</value>
    </property>
</configuration>
编辑 mapred-site.xml

在所有节点上配置相同的 mapred-site.xml:

xml 复制代码
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>
编辑 yarn-site.xml

在所有节点上配置相同的 yarn-site.xml:

xml 复制代码
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>
配置 slaves 文件

在 NameNode 上,编辑 $HADOOP_HOME/etc/hadoop/slaves 文件,添加所有 DataNode 的主机名:

plaintext 复制代码
datanode1
datanode2

5. 启动 Hadoop 集群

在 NameNode 上执行:

bash 复制代码
start-dfs.sh
start-yarn.sh

6. 验证集群状态

访问 Namenode 和 ResourceManager 的 Web 界面,确保所有节点正常运行。

注意事项

  • 确保所有节点的时钟同步。
  • 确保网络配置正确,各节点之间可访问。
  • 检查每个节点的配置文件,确保一致性。

三、Hadoop 使用案例:Word Count

1. 创建输入文件

在 HDFS 中创建一个目录,并上传一个文本文件:

bash 复制代码
hdfs dfs -mkdir -p /user/hadoop/input
hdfs dfs -put localfile.txt /user/hadoop/input

2. 编写 MapReduce 程序

以下是一个简单的 Word Count Java 程序:

java 复制代码
import java.io.IOException;
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;

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 {
      String[] tokens = value.toString().split("\\s+");
      for (String token : tokens) {
        word.set(token);
        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);
    File

InputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
  }
}

3. 编译并运行程序

编译程序:

bash 复制代码
javac -classpath `hadoop classpath` -d wordcount_classes WordCount.java
jar -cvf wordcount.jar -C wordcount_classes/ .

运行程序:

bash 复制代码
hadoop jar wordcount.jar WordCount /user/hadoop/input /user/hadoop/output

当然可以使用 Python 来实现 Word Count 的 Hadoop MapReduce 程序。Python 提供了一个名为 Hadoop Streaming 的工具,可以通过管道方式使得我们可以使用 Python、Perl、Ruby 等语言来编写 Map 和 Reduce 函数。

下面是使用 Python 实现的 Word Count 示例。

四、使用 Python 实现 Word Count

1. 环境准备

确保你的 Hadoop 环境支持 Hadoop Streaming,可以通过以下命令查看:

bash 复制代码
hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.3.1.jar

如果没有报错,那么你的 Hadoop 支持 Streaming。

2. 编写 Mapper 和 Reducer

Mapper (mapper.py)

Mapper 的任务是读取输入文件的每一行,将每个单词输出为一个键值对 (word, 1)

python 复制代码
#!/usr/bin/env python

import sys

# 读取标准输入
for line in sys.stdin:
    # 去除前后空格并分割成单词
    words = line.strip().split()
    for word in words:
        # 输出键值对
        print(f"{word}\t1")

保存为 mapper.py

Reducer (reducer.py)

Reducer 的任务是汇总 Mapper 的输出,统计每个单词出现的次数。

python 复制代码
#!/usr/bin/env python

import sys

current_word = None
current_count = 0
word = None

# 从标准输入读取数据
for line in sys.stdin:
    # 去除前后空格并解析输入
    line = line.strip()
    word, count = line.split('\t', 1)

    # 将 count 转换为 int
    try:
        count = int(count)
    except ValueError:
        continue

    # 检查当前单词是否与之前的单词相同
    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}")

保存为 reducer.py

3. 设置可执行权限

确保这两个 Python 脚本具有可执行权限:

bash 复制代码
chmod +x mapper.py
chmod +x reducer.py

4. 上传输入文件到 HDFS

确保 HDFS 已经运行,创建输入目录并上传数据文件:

bash 复制代码
hdfs dfs -mkdir -p /user/hadoop/input
hdfs dfs -put localfile.txt /user/hadoop/input

5. 使用 Hadoop Streaming 运行作业

使用 Hadoop Streaming 工具运行 MapReduce 作业:

bash 复制代码
hadoop jar /usr/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-3.3.1.jar \
    -input /user/hadoop/input \
    -output /user/hadoop/output \
    -mapper mapper.py \
    -reducer reducer.py \
    -file mapper.py \
    -file reducer.py

参数说明:

  • -input:指定输入数据所在的 HDFS 目录。
  • -output:指定输出结果存储的 HDFS 目录。
  • -mapper:指定 Mapper 的执行脚本。
  • -reducer:指定 Reducer 的执行脚本。
  • -file:将本地文件发送到 Hadoop 分布式缓存中,以便在集群节点上执行。

6. 查看结果

bash 复制代码
hdfs dfs -cat /user/hadoop/output/part-00000

7. Python 实现 Word Count 示例

假设 localfile.txt 内容如下:

plaintext 复制代码
Hello Hadoop
Hello Python
Hello World

运行以上命令后,输出结果可能如下:

plaintext 复制代码
Hadoop    1
Hello     3
Python    1
World     1

8. 注意事项

  1. 输入输出路径:确保输入路径正确,输出路径不存在(Hadoop 不允许输出路径已存在)。
  2. 权限问题:检查脚本的执行权限。
  3. Python 版本:确保 Python 版本与环境兼容。
  4. 换行符问题:确保输入文件中的换行符格式正确(Linux 使用 LF,而不是 CRLF)。

9. 总结

通过以上步骤,我们成功地使用 Python 实现了一个简单的 Hadoop Word Count 程序。Hadoop Streaming 提供了极大的灵活性,可以使用任意支持标准输入输出的编程语言来实现 MapReduce 作业。这使得开发者能够利用熟悉的编程语言进行大规模数据处理。

如果在开发过程中遇到任何问题,请确保查看 Hadoop 和 Python 的错误日志,以便更快地定位问题并进行调试。

10. 查看结果

bash 复制代码
hdfs dfs -cat /user/hadoop/output/part-r-00000

五、总结与注意事项

常见问题

  1. SSH 问题:确保所有节点之间的 SSH 无密码访问正常。
  2. Java 环境问题:确认所有节点上的 Java 版本一致。
  3. Hadoop 版本问题:确保所有节点的 Hadoop 版本一致。
  4. 文件权限问题:确保 HDFS 中的文件权限正确,避免权限问题导致的作业失败。
  5. 内存和资源配置:合理配置每个节点的内存和资源分配,以提高作业执行效率。

优化建议

  • 使用 HDFS 进行大规模数据存储,提高数据的可靠性和可用性。
  • 合理设置副本数量,根据集群规模和业务需求进行调整。
  • 监控集群状态,使用工具(如 Ambari、Ganglia)对 Hadoop 集群进行实时监控和管理。

通过以上步骤,您可以成功部署 Hadoop 单机和集群环境,并运行简单的 MapReduce程序进行数据处理。在实际生产环境中,还需要根据具体需求进行进一步优化和调整。

相关推荐
jlting19515 分钟前
Spark——安装步骤详细教程
大数据·spark
小阿龙...1 小时前
创建mapreduce项目使用maven
java·ide·hadoop·spark·big data
太阳伞下的阿呆1 小时前
kafka-clients之生产者发送流程
分布式·kafka·高并发·mq
Mr.Demo.1 小时前
[RabbitMQ] 重试机制+TTL+死信队列
分布式·rabbitmq
大数据编程之光1 小时前
Flink普通API之Source使用全解析
大数据·windows·flink
二进制_博客1 小时前
Flink学习连载文档第一篇--Flink集群的安装
大数据
青云交3 小时前
大数据新视界 -- Hive 查询性能优化:基于成本模型的奥秘(上)(5/ 30)
大数据·优化器·执行计划·统计信息·hive 查询性能·成本模型·hive 优化
gma9993 小时前
【BUG】ES使用过程中问题解决汇总
大数据·elasticsearch·搜索引擎
Mephisto.java3 小时前
【大数据学习 | Spark-Core】RDD的缓存(cache and checkpoint)
大数据·学习·spark
zmd-zk4 小时前
flink学习(3)——方法的使用—对流的处理(map,flatMap,filter)
java·大数据·开发语言·学习·flink·tensorflow