Linux 安装、配置 hadoop

5,301 阅读6分钟

准备工作

依赖说明

hadoop 依赖于 java 环境,且不同的 hadoop 版本对应的 java 的版本也不同,具体如下

Hadoop 版本java 版本
2.7.x - 2.xjava7 、 java8
3.0 - 3.2java8
3.3java8、java11
Apache Hadoop 社区将 OpenJDK 用于构建/测试/发布环境,其他 jdks/jvms 应该可以正常工作。但最好还是使用 OpenJDK

hadoop 版本选择

截止此文发布为止,Hadoop 最新版本为 3.3.0,但从公告中可以看出,3.1.3 才是最新的稳定版,建议选择稳定版,可以避免很多坑!

本文也是以 3.1.3 版本来搭建 hadoop 环境!

安装 OpenJDK

既然选择了hadoop 3.1.3 ,哪对应的 OpenJDK 也要选择 java8 的版本

Linux 怎么安装配置 java 环境? 参考Linux 安装配置 java 环境

安装其他组件

安装 pdsh

sudo yum install -y pdsh

安装、部署

下载

wget https://archive.apache.org/dist/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz

解压

tar -zxvf hadoop-3.1.3.tar.gz

Hadoop 安装部署模式

Hadoop 存在多种安装部署模式

  • 单机模式:不需要配置任何东西,直接解压就可以使用,这种模式下不存在分布式文件系统,单机模式下数据的存取来源于本地文件系统,没有任何守护进程,该模式主要用于开发调试MapReduce程序的应用逻辑。

  • 伪分布式模式:将hadoop安装在一个节点上,存在分布式文件系统,用起来和完全分布式没有区别,只是性能较差,一般常用于个人测试使用。

  • 完全分布式:多台机器组成的hadoop集群,使用的是master-slave(一主多从)的架构,该模式由于只有一个namanode,存在单点故障问题,所以生产中一般很少使用。

  • 高可用模式:该模式解决了完全分布式单点故障的问题,该模式下namenode有多个,但是只有一个处于活跃(active)的状态,其他的全部是热备份(standby)的状态,当 namenode 出现故障的时候会自动的切换到其他备份的namenode,这种hadoop搭建的模式在生产中经常使用,但是也有缺点,例如:同时对外提供服务的namenode只有一个,当随着业务数据的增多和集群的扩大,namenode的压力会越来越大

  • 联邦模式:该模式适用于大规模的集群,同一时间可以有多个namenode对外提供服务,每一个namenode只负责维护一部分 datanode 的元数据

本地模式

本地模式主要是用于本地开发过程中的运行调试用,下载、解压 hadoop 后不做任何设置,默认的就是本地模式。本地模式下所有模块都运行在一个JVM进程中,使用的本地文件系统,而不是HDFS。

为了验证本地模式是否已配置正确,我们可以使用 hadoop 自带的字符统计程序来测试

  1. 首先准备一个待分析的文本文件,并随便添加一下内容
vi ~/test.txt

2、 运行hadoop自带的mapreduce Demo

~/hadoop-3.1.3/bin/hadoop jar ~/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount ~/test.txt ~/test

~/test 是分析结果的目录,不要自己去创建

如果你机器的内存不够,可能还会出现 OOM 错误

解决办法:调低 hadoop 最大堆内存

vi ~/hadoop-3.1.3/etc/hadoop/hadoop-env.sh

找到 export HADOOP_HEAPSIZE=,并在下方追加 export HADOOP_HEAPSIZE=512(我的台机器内存比较小,就只分配512MB内存)

再次执行上面的命令,可以看到job ID中有local字样,说明是运行在本地模式下的。

查看输出文件

本地模式下,mapreduce 的输出是输出到本地。 输出目录中有 _SUCCESS 文件说明 JOB 运行成功,part-r-00000 是输出结果文件。

伪分布模式

伪分布式模式是在单机上,模拟一个分布式的环境,具备Hadoop的所有功能

需要配置的文件有5个

  • ~/hadoop-3.1.3/etc/hadoop/hadoop-env.sh
  • ~/hadoop-3.1.3/etc/hadoop/core-site.xml
  • ~/hadoop-3.1.3/etc/hadoop/hdfs-site.xml
  • ~/hadoop-3.1.3/etc/hadoop/mapred-site.xml
  • ~/hadoop-3.1.3/etc/hadoop/yarn-site.xml

配置 hadoop-env.sh

首先,查看 JAVA_HOME 的地址

echo $JAVA_HOME

配置 JAVA_HOME 路径

vi ~/hadoop-3.1.3/etc/hadoop/hadoop-env.sh

找到 export JAVA_HOME,在下方添加

export JAVA_HOME=JAVA_HOME 的地址

配置 core-site.xml

vi ~/hadoop-3.1.3/etc/hadoop/core-site.xml

配置默认hdfs的访问端口和数据临时目录

<configuration>
    <property>
        <!-- 存放数据的临时目录,注意这里的路径要写绝对路径,并且不要使用 ~ 等符号 -->
        <name>hadoop.tmp.dir</name>
        <value>/root/hadoop-3.1.3/hdfs/tmp</value>
    </property>
    <property>
        <!-- hdfs的访问端口 -->
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

hadoop.tmp.dir 是 Hadoop 临时目录, HDFS 的 NameNode 数据都存放这个目录下,如果不进行配置,默认的 hadoop.tmp.dir 指向 /tmp/hadoop-${user.name}, 此时如果操作系统重启,系统会清空 /tmp 目录下所有文件,所以建议还是配置

注意,示例中的 Hadoop 临时目录  `~/hadoop-3.1.3/hdfs/tmp` 需要自己去提前创建
mkdir -p ~/hadoop-3.1.3/hdfs/tmp
tree -C -fp ~/hadoop-3.1.3/hdfs/

配置 hdfs-site.xml

vi ~/hadoop-3.1.3/etc/hadoop/hdfs-site.xml

配置复制数

<configuration>
    <property>
        <!-- 配制复制数为1,即不进行复制 -->
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>

格式化 HDFS

格式化是对HDFS这个分布式文件系统中的DataNode进行分块,统计所有分块后的初始元数据的存储在NameNode中。

格式化时,要注意 hadoop.tmp.dir 目录的权限问题
~/hadoop-3.1.3/bin/hdfs namenode -format

显示 has been successfully formatted 则表示格式化成功

格式化成功后,查看 core-site.xmlhadoop.tmp.dir 指定的目录下是否有了 dfs 目录

tree -C -pf ~/hadoop-3.1.3/hdfs/tmp/

  • fsimage_* 是 NameNode 元数据在内存满了后,持久化保存到本地的文件。
  • fsimage_.md5 是校验文件,用于校验 fsimage_ 的完整性。
  • seen_txid 是 hadoop 的版本
  • vession 文件内容
    • namespaceID :NameNode 的唯一ID
    • clusterID : 集群ID,NameNode 和 DataNode 的集群ID应该一致,表明是一个集群。
cat /root/hadoop-3.1.3/hdfs/tmp/dfs/name/current/VERSION

启动 HDFS

我们已经配置好了 hadoop-env.shcore-site.xmlhdfs-site.xml 并且也对 HDFS 进行了初始化操作,现在就可以启动HDFS 了。

一个完整的 HDFS 系统有以下组成部分

  • 一个 namenode 节点
  • 一个 namenode 节点备用节点(与上面的 namenode 节点一起组成高可用)
  • N个 datanode 节点

启动 namenode

~/hadoop-3.1.3/bin/hdfs --daemon start namenode

启动 secondarynamenode

~/hadoop-3.1.3/bin/hdfs --daemon start secondarynamenode

启动 datanode

~/hadoop-3.1.3/bin/hdfs --daemon start datanode

查看启动情况

jps

在 HDFS 上创建目录、上传、下载文件

在HDFS上创建目录

~/hadoop-3.1.3/bin/hdfs dfs -mkdir /demo

上传本地文件到HDFS上

~/hadoop-3.1.3/bin/hdfs dfs -put /root/test.txt /demo

/root/test.txt 是要上传的文件, /demo 是上面创建在 hdfs 上的路径

查看在HDFS上的文件

~/hadoop-3.1.3/bin/hdfs dfs -cat /demo/test.txt

下载HDFS上的文件到本地

~/hadoop-3.1.3/bin/hdfs dfs -get /demo/test.txt /root/test

/demo/test.txt 是HDFS上要下载的文件, /root/test 是本地路径,需要提前创建

配置 mapred-site.xml

如果没有 `mapred-site.xml` 文件,看下是不是有个 `mapred-site.xml.template` 的配置模板文件,复制此模板生成 `mapred-site.xml`
vi ~/hadoop-3.1.3/etc/hadoop/mapred-site.xml

设置 mapreduce 使用的框架,这里使用 yarn

<configuration>
    <property>
        <!-- 设置 mapreduce 使用 yarn 框架 -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

配置 yarn-site.xml

vi ~/hadoop-3.1.3/etc/hadoop/yarn-site.xml

设置 yarn 的混洗方式为 mapreduce 默认的混洗算法

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

启动 YARN

我们已经配置好了 hadoop-env.shcore-site.xmlmapred-site.xmlyarn-site.xml,现在只需要启动 YARN

YARN 系统由 resourcemanager 、nodemanager 组成

启动 resourcemanager

~/hadoop-3.1.3/bin/yarn --daemon start resourcemanager

在YARN中,ResourceManager 负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序(实际上是ApplicationManager)

启动 nodemanager

~/hadoop-3.1.3/bin/yarn --daemon start nodemanager

查看启动情况

jps

YARN 的 Web 客户端端口号是 8088,通过 http://localhost:8088 可以查看。

运行MapReduce Job

在 Hadoop 的 share 目录里,自带了一些 jar 包,里面带有一些 mapreduce 实例小例子,位置在 hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar,可以运行这些例子体验刚搭建好的 Hadoop 平台,我们这里运行最经典的 WordCount 实例来测试

首先查看服务启动状态,要保证所有的服务都已启动

~/hadoop-3.1.3/bin/yarn jar ~/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /demo/test.txt /demo/output

其中 /demo/test.txt 是 hdfs 中的文件,没有的需要提前准备, /demo/output 是 hdfs 中的输出目录会自动创建,如果已经存在,那么会报错,必须手工先删除

hadoop fs -rm -r /demo/output

如果出现 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster,则需要在 yarn-site.xml 文件中配置 hadoop classpath

查看 hadoop classpath

~/hadoop-3.1.3/bin/hadoop classpath

配置 hadoop classpath

vi ~/hadoop-3.1.3/etc/hadoop/yarn-site.xml
<configuration>
    <property>
        <name>yarn.application.classpath</name>
		<value>上面查到的  hadoop classpath </value>
    </property>
</configuration>

再次尝试执行 WordCount 实例

~/hadoop-3.1.3/bin/yarn jar ~/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /demo/test.txt /demo/output

这次不再报错了,查看输出目录

~/hadoop-3.1.3/bin/hdfs dfs -ls /demo/output

完全分布式模式

伪分布式模式还可以在一台 vps 上完成,完全分布式模式就需要多台 vps 了(至少3台)。 具体搭建参考我的另一篇文章 hadoop 完全分布式系统搭建