文章目录
前言
在当前这个大数据时代,海量数据的处理和分析已经成为许多企业和研究机构的核心需求。Hadoop作为一个开源的分布式计算框架,以其高效、可靠和可扩展的特性,成为了处理大数据的首选工具之一。Hadoop生态系统不仅包括了HDFS(Hadoop分布式文件系统)和MapReduce编程模型,还集成了诸如Hive、Pig、HBase等一系列丰富的工具,能够满足不同场景下的数据存储和计算需求。
然而,对于初学者来说,Hadoop的安装和配置可能显得复杂和繁琐。本文旨在通过一步步的指导,帮助读者顺利完成Hadoop的安装和配置过程。无论你是数据科学家、数据工程师还是系统管理员,掌握这一技能都将为你的职业发展增色不少。
在开始之前,本文假设读者具有基本的Linux操作系统使用经验,并对分布式计算有一定的了解。如果你还不熟悉这些概念,也不要担心,我会尽量详细地解释每一步操作,以确保大家都能跟上进度。
接下来,我们将从准备工作开始,逐步讲解如何在Linux环境下安装和配置Hadoop,以及如何解决安装过程中可能遇到的各种问题。希望通过这篇博文,你能够全面了解Hadoop的安装流程,为后续的数据处理和分析打下坚实的基础。
一、使用docker镜像创建三个容器
1.1、写dockerfile
写dockerfile
# 创建文本,将dockerfile写入
vi dockerfile-centos
我使用dockerfile
# 指定镜像为 centos:7
FROM centos:7
# 设置作者和创建时间
LABEL maintainer="HRS"
LABEL creation_date="2024-05-01"
# 开机工作目录
ENV MYPATH /root
WORKDIR $MYPATH
# 下载ip addr、ifconfig、ssh、sudo、service命令、并设置系统为中文,其他的看第一个dockerfile。
RUN yum -y update && \
yum makecache fast && \
yum install -y net-tools iproute openssh-clients openssh-server sudo initscripts && \
yum install -y kde-l10n-Chinese && \
yum reinstall -y glibc-common && \
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 && \
sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config && \
echo 'export LC_ALL=zh_CN.utf8' >> /etc/environment
# 添加测试用户root,密码root,并且将此用户添加到sudoers里
RUN echo "root:123456" | chpasswd && \
echo "root ALL=(ALL) ALL" >> /etc/sudoers && \
ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key && \
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
# 开机启动ssh服务
RUN systemctl enable sshd
# 将 LC_ALL 环境变量设置为 zh_CN.utf8
ENV LC_ALL zh_CN.utf8
# 启动容器时默认进入 /bin/bash
CMD ["/bin/bash"]
1.2、构建镜像
docker build -f dockerfile-centos -t centos-1:1.0 .
二、创建容器和网络
2.1、创建网络
#创建名为Hadoop的docker自定义网络
docker network create --subnet=172.18.0.0/16 Hadoop
创建master、slave1、slave2容器,可以根据自己的需求修改端口映射,privileged=true特权模式,加入后可以使用systemctl命令。
#创建master容器
docker run -d --name master -h master --network=Hadoop --ip=172.18.0.2 -p 9870:9000 --privileged=true centos-1:1.0 /usr/sbin/init
#创建slave1容器
docker run -d --name slave1 -h slave1 --network=Hadoop --ip=172.18.0.3 -p 6582:22 --privileged=true centos-1:1.0 /usr/sbin/init
#创建slave2容器
docker run -d --name slave2 -h slave2 --network=Hadoop --ip=172.18.0.4 -p 6583:22 --privileged=true centos-1:1.0 /usr/sbin/init
三、安装Java
3.1、进入容器内
方法一
使用docker命令进入
#虚拟机在命令行窗口执行进入,需要三个命令行窗口。
docker exec -it master /bin/bash
docker exec -it slave1 /bin/bash
docker exec -it slave2 /bin/bash
方法二
通过MobaXterm工具远程ssh进入
方法三
通过Windows上自带的ssh工具进入,本质上和方法二一样
# ssh命令,根据我的dockerfile创建的容器,密码是123456
ssh root@172.18.0.2
ssh root@172.18.0.3
ssh root@172.18.0.3
补充:通过方法二和方法三进入容器时,需要验证Windows是否能ping通虚拟机,如果能ping通,还需要验证端口是否能连接。
如果ping不通,可以添加路由,添加路由的方法在另外一篇文章
端口验证命令,telnet命令,Windows使用telnet命令
3.2、安装java
3.2.1、上传安装包(上传到master)
方法一、没有使用MobaXterm工具
先将安装包上传到Linux的root目录下
#在linux的命令窗口上的root目录下执行,根据自己的安装包修改命令
docker cp jdk-8u391-linux-x64.tar.gz master:/usr/local/
docker cp jdk-8u391-linux-x64.tar.gz slave1:/usr/local/
docker cp jdk-8u391-linux-x64.tar.gz slave2:/usr/local/
方法二、使用MobaXterm工具,直接鼠标拖入即可。
3.2.2、解压安装
# 传cd到对应目录下(在master操作)
cd /usr/local
# 解压(在master操作)
tar -zxvf hadoop-3.1.3.tar.gz
# 对文件重命名(在master操作)
mv jdk1.8.0_391 jdk
# 删除安装包(在master操作)
rm -rf jdk-8u391-linux-x64.tar.gz
3.2.3、配置环境变量
# 配置环境变量(在三个节点上操作)
vi ~/.bashrc
# 在文本的下面加入以下代码(不要删除任何原文本内容)
# JAVA_HOME
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin
# 加入后更新环境变量(在三个节点上操作)
source ~/.bashrc
3.2.4、发送jdk到另外两台主机
# 在master操作
scp -r /usr/local/jdk/ root@slave1:/usr/local/
scp -r /usr/local/jdk/ root@slave2:/usr/local/
3.2.5、验证java安装成功
# 使用命令检查(在三个节点上操作)
java -version
四、安装Hadoop
4.1、上传安装包(上传到master)
方法一、没有使用MobaXterm工具
先将安装包上传到Linux的root目录下
#在linux的命令窗口上的root目录下执行,根据自己的安装包修改命令
docker cp hadoop-3.1.3.tar.gz master:/usr/local/
docker cp hadoop-3.1.3.tar.gz slave1:/usr/local/
docker cp hadoop-3.1.3.tar.gz slave2:/usr/local/
方法二、使用MobaXterm工具,直接鼠标拖入即可。
4.2、解压安装
# 传cd到对应目录下(在master操作)
cd /usr/local
# 解压(在master操作)
tar -zxvf hadoop-3.1.3.tar.gz
# 对文件重命名(在master操作)
mv hadoop-3.1.3 hadoop
# 删除安装包(在master操作)
rm -rf hadoop-3.1.3.tar.gz
4.3、配置环境变量
# 配置环境变量(在三个节点上操作)
vi ~/.bashrc
# 在java的环境变量下面加(在三个节点上操作)
# HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin
# 加入后更新环境变量(在三个节点上操作)
source ~/.bashrc
4.4、验证Hadoop安装成功
# 使用命令检查(在master操作)
hadoop version
五、设置主机名和添加映射关系
5.1、设置主机名
# 进入vi编辑器
vi /etc/sysconfig/network
# master容器下
NETWORKING=yes
HOSTNAME=master
# slave1容器下
NETWORKING=yes
HOSTNAME=slave1
# slave2容器下
NETWORKING=yes
HOSTNAME=slave2
5.2、添加映射关系
# 在master、slave1、slave2上执行命令,进入文件。
vi /etc/hosts
# master中
172.18.0.2 master
172.18.0.3 slave1
172.18.0.4 slave2
# slave1中
172.18.0.3 slave1
172.18.0.2 master
172.18.0.4 slave2
# slave2中
172.18.0.4 slave2
172.18.0.2 master
172.18.0.3 slave1
5.3、开机设置映射
原因:docker容器重启后/etc/hosts会重置
# 进入环境变量(在三个节点上操作)
vi ~/.bashrc
# master中
# add 2 lines to fix the problem : restart container ,/etc/hosts reset
echo "172.18.0.3 slave1" >> /etc/hosts
echo "172.18.0.4 slave2" >> /etc/hosts
# slave1中
# add 2 lines to fix the problem : restart container ,/etc/hosts reset
echo "172.18.0.2 master" >> /etc/hosts
echo "172.18.0.4 slave2" >> /etc/hosts
# slave2中
# add 2 lines to fix the problem : restart container ,/etc/hosts reset
echo "172.18.0.2 master" >> /etc/hosts
echo "172.18.0.3 slave1" >> /etc/hosts
# 更新环境变量(在三个节点上操作)
source ~/.bashrc
补充:可以写一个shell脚本,开机时将映射写入文件内
六、ssh免密登录
# 生成私钥和公钥,按三次回车生成密码(在三个节点上操作)
ssh-keygen -t rsa
# 进入目录(在三个节点上操作)
cd ~/.ssh
# 传送(master节点)
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
# 传送(slave1节点)
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
# 传送(slave2节点)
ssh-copy-id master
ssh-copy-id slave1
ssh-copy-id slave2
# 查文件内的主机名(在三个节点上操作)
cat authorized_keys
补充:每次传送需要输入yes和密码123456
七、修改配置文件
说明:在配置master文件时,端口可以用9000和50090,datanode的端口为8020是Hadoop高可用的配置方法,这里不搭建高可用,所以使用9000端口
7.1、修改启动权限
进入文件内(以下命令在master操作)
vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# 设置用户为root,添加java的路径
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_ZKFC_USER=root
export JAVA_HOME=/usr/local/jdk
7.2、core-site.xml
进入文件
vi /usr/local/hadoop/etc/hadoop/core-site.xml
添加以下代码,注意文本自带的<configuration>标签
<configuration>
<property><!-- 指定NameNode的地址 -->
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
<property><!-- 指定hadoop数据的存储目录,根据自身情况做出更改 -->
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/</value>
</property>
<property><!-- 配置HDFS网页登录使用的静态用户为root -->
<name>hadoop.http.staticuser.user</name>
<value>root</value>
</property>
<!--hive远程连接配置的用户权限-->
<property><!--配置所有节点的root用户都可作为代理用户-->
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property><!--配置root用户能够代理的用户组为任意组-->
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<property><!--配置root用户能够代理的用户为任意组-->
<name>hadoop.proxyuser.root.users</name>
<value>*</value>
</property>
</configuration>
7.3、hdfs-site.xml
进入文件
vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml
添加以下代码,注意文本自带的<configuration>标签
<configuration>
<property><!--配置存储namenode数据的目录-->
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/name</value>
</property>
<property><!--配置存储datanode数据的目录-->
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/data</value>
</property>
<property><!--配置副本数量-->
<name>dfs.replication</name>
<value>3</value>
</property>
<property><!--配置第二名称节点-->
<name>dfs.secondary.http.address</name>
<value>master:50090</value>
</property>
</configuration>
7.4、mapred-site.xml
进入文件
vi /usr/local/hadoop/etc/hadoop/mapred-site.xml
添加以下代码,注意文本自带的<configuration>标签
<configuration>
<property>
<name>mapreduce.Framework.name</name>
<value>yarn</value>
</property>
<property><!-- 设置jobhistoryserver 服务器地址及对应端口 -->
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property><!-- 配置web端口 -->
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
7.5、yarn-site.xml
进入文件
vi /usr/local/hadoop/etc/hadoop/yarn-site.xml
添加以下代码,注意文本自带的<configuration>标签
<configuration>
<property> <!--配置yarn主节点-->
<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.pmem-check-enabled</name>
<value>false</value>
</property>
<property><!-- 取消虚拟内存检查 -->
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
</configuration>
7.6、workers
进入文件
vi /usr/local/hadoop/etc/hadoop/workers
将原来的localhost删除,添加以下代码,注意不要多加入空格
master
slave1
slave2
补充:Hadoop2使用的是slave文件,Hadoop使用的是works文件。
八、发送并格式化
8.1、发送
# 在master中将已经配置好的文件传送给slave1
scp -r /usr/local/hadoop root@slave1:/usr/local/
# 在master中将已经配置好的文件传送给slave2
scp -r /usr/local/hadoop root@slave2:/usr/local/
8.2、格式化
在master节点格式化
hdfs namenode -format
九、启动和验证
9.1、启动和停止命令
# 启动命令
start-all.sh
# 停止命令
stop-all.sh
# 2.启动日志记录
mapred --daemon start historyserver
# 2.停止日志记录
mapred --daemon stop historyserver
9.2、验证
# master使用以下命令,看到有三个节点的信息就是成功
hdfs dfsadmin -report
# Windows登录172.18.0.2:9870网页界面,在datanode看到有三个节点,也代表成功
使用jps命令,看到以下(使用的是别的博主的图片,因为现在是期末)。
9.2.1、使用代码验证
# 在root目录下,
vi hello.txt
# 写入
hello world
# 使用Hadoop目录上传
hdfs dfs -put hello.txt /
# 使用Hadoop命令查看文件内容,出现hello world表示,hdfs正常工作。
hdfs dfs -cat /hello.txt
补充,如果Hadoop集群没问题,关闭集群,停止docker容器,关机,拍摄快照,这样以后Hadoop集群出现问题能通过快照救回来。
十、docker命令
# 查看正在运行的容器
docker ps
# 查看所有的容器(包括停止的)
docker ps
# 启动
docker start 容器名一 容器名二
# 停止
docker stop 容器名一 容器名二
总结
恭喜你!经过一番努力,你已经成功地在你的系统上安装并配置好了Hadoop。这标志着你已经迈出了大数据处理的重要一步。通过这篇博文,我们详细讲解了Hadoop的安装步骤,包括环境的准备、Hadoop的下载与安装、配置文件的修改以及启动与验证等环节。相信通过这些实战操作,你对Hadoop的基础架构和工作原理也有了更深入的理解。
在安装过程中,你可能遇到了各种各样的问题,比如依赖包的缺失、配置文件的错误或者权限问题。但正是通过解决这些实际问题,你的技术能力得到了提升,也为以后的大数据项目积累了宝贵的经验。
安装只是第一步。在接下来的工作中,你可以开始探索Hadoop生态系统中的其他组件,如Hive、Pig、HBase和Spark等,来进一步丰富你的大数据处理工具箱。同时,可以尝试处理一些实际的业务数据,体验Hadoop带来的高效和便捷。
总之,Hadoop的学习和应用是一个持续的过程,需要不断地实践和总结。希望这篇博文能够为你的大数据旅程提供一个良好的开端。如果你在后续的学习和使用过程中遇到任何问题,欢迎在评论区留言,我们一起探讨和交流。感谢你的阅读,祝你在大数据领域取得更多的成就!