当前位置: 首页 > article >正文

【Hadoop】一、Hadoop入门:基础配置、集群配置、常用脚本

基础设置

网络设置

创建好一个 centos 虚拟机,修改网络配置文件:

/etc/sysconfig/network-scripts/ifcfg-ens33

修改 BOOTPROTO 为 static

以及添加 IPADDR、GATEWAY、DNS1

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="896ed56e-1848-44a7-98ed-244ebc978e1c"
DEVICE="ens33"
ONBOOT="yes"

IPADDR=192.168.202.142
GATEWAY=192.168.202.1
DNS1=192.168.202.1

修改主机名称:

/etc/hostname

修改为 hadoop100

在主机名映射文件中添加映射

/etc/hosts
192.168.202.142 hadoop100
192.168.202.143 hadoop101
192.168.202.144 hadoop102
192.168.202.145 hadoop103
192.168.202.146 hadoop104
192.168.202.147 hadoop105
192.168.202.148 hadoop106
192.168.202.149 hadoop107
192.168.202.150 hadoop108

关闭防火墙

systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld.service

之后检查 ifconfgi 中 ens33 的ip、hostname、ping www.baidu.com 进行检查,都通过则证明网络配置成功

文件设置

配置用户 root 权限:
打开

/etc/sudoers

并在这个位置这样配:

root    ALL=(ALL)       ALL

## Allows members of the 'sys' group to run networking, software, 
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL

hadoop ALL=(ALL)      NOPASSWD:ALL

之后我们在 hadoop 用户下面的 sudo 指令就会生效

切换到 opt 目录

sudo rm -rf rh

在 opt 目录下进行后续操作:

创建两个目录module 用于存放安装包、software 用与存放软件
sudo mkdir -p module
sudo mkdir -p software

现在我们创建的这两个文件是属于 root 的,所以我们要修改这两个目录的归属:

sudo chown hadoop:hadoop module
sudo chown hadoop:hadoop software

将这两个目录的归属全部改为 hadoop(自己的用户)

之后我们需要将自带的 jdk 删除:

rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps

注意这句话的前半句话意思是找到所有文件名带有 java 的文件,后半句话是依次独立删除

注意这个操作必须在 root 的场景下进行

  • 虚拟机克隆:注意克隆完整虚拟机

    克隆三台虚拟机,之后修改其 网络配置文件中的 ip 地址和主机名

JDK与Hadoop的安装

hadoop下载地址:

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

将下载好的文件发送到虚拟机的 /opt/software 路径中

将 JDK 压缩包解压到 module 目录下,同时配置环境变量

环境变量位置的配置,我们的常用做法是在 /etc/profile 下进行配置,但是此处我们选择在 /etc/profile.d 目录下新建 .sh 文件的方式进行配置,这样也可以配置的原因是 /etc/profile 文件中声明了遍历 /etc/profile.d 目录中所有以 .sh 结尾的文件,将其所有的文件都遍历执行一遍

在 /etc/profile.d 目录中创建:

my_env.sh

#JAVA_ENV
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$JAVA_HOME/bin

之后还是需要进行 source 操作 就可以使用 java -version 看到 jdk 版本了

解压 Hadoop 到 module 目录,之后同样在 my_env.sh 上配置环境变量,注意 hadoop 的环境变量需要配置 /bin 和 /sbin

# BASE_PATH
export PATH=/bin:/usr/bin:$PATH

#JAVA_ENV
export JAVA_HOME=/opt/module/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

# HADOOP
export HADOOP_HOME=/opt/module/hadoop-3.1.3
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

配置好 hadoop 之后,文件应该是上面这样

  • hadoop基础文件结构介绍

    hadoop 文件中 bin 目录中存放hadoop中可执行的许多命令,例如:hdfs、yarn、mapred 等

    etc/hadoop 目录中存放配置文件信息,关键的配置文件信息有:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml

    sbin 目录中存放的是 我们需要使用到的一些命令:例如 start-all.sh 这种

  • 分布式介绍

    本地分布式:仅用于测试,数据存储在本地

    伪分布式:仅有一台服务器,假装是很多台服务器,数据存储在 HDFS

    完全分布式:有很多服务器,数据分布式存储在多台服务器上,是标准的分布式

wordcount 案例测试:

随意新建一个 txt 里面补充一些单词

之后像下面这样执行就可以尝试进行一个大数据计算

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount wcinput wcoutput

后面的wcoutput 是输出文件夹,要求这个输出文件夹不存在,里面会生成两个文件,cat 其中一个文件就可以看到结果,另一个文件是成功或者失败的标识。

使用SCP 命令编写集群文件分发脚本

首先保证目录是创建好的

之后使用下面的命令将 102 中的文件传入 自己,自己传给别人,别人传给别人

scp -r /opt/module/jdk1.8.0_212/ hadoop@hadoop102:/opt/module
scp -r hadoop@hadoop102:/opt/module/jdk1.8.0_212 /opt/module
scp -r hadoop@hadoop102:/opt/module/hadoop-3.1.3 hadoop@hadoop104:/opt/module

但是如果我们不需要全部复制,而是需要同步文件内容,比如说有某个文件修改了,就可以使用同步命令进行修正:rsync…(注意:第一次同步等同于拷贝)具体用法和远程同步的方法和 scp 命令一致

rsync -av /from /to

但要注意 rsync 要求目的地和出发地不能都是远程连接

  • 我们创建一个脚本(在 ~/bin 下创建),实现同步两台机器上的文件内容,致使文件内容的同步,同时实现配置环境变量以达到在任意位置都可以使用

    #!/bin/bash
    
    # 检查是否至少有一个参数传递给脚本
    if [ "$#" -lt 1 ]; then
        echo "Not Enough Argument!"
        exit 1 # 通常使用非零值来表示异常退出
    fi
    
    # 遍历所有集群中的机器
    for host in hadoop102 hadoop103 hadoop104
    do
    	echo "=================== $host ==================="
    	# 遍历所有目录,挨个发送
    	for file in $@
    	do
    		if [ -e $file ]; then
    			# 获取父目录
    			pdir=$(cd -P $(dirname $file); pwd)
    			# 获取当前文件名称
    			fname=$(basename $file)
    			ssh $host "mkdir -p $pdir"
    			rsync -av $pdir/$fname $host:$pdir
    		else
            	echo  "$file does not exists"
    		fi
    	done
    	
    done
    

    这个脚本这样子就实现了 xsync from 直接在另两台机器上的对应位置直接进行同步的操作】

接下来,就使用这个脚本来同步环境变量信息 /etc/profile.d/my-env.sh

sudo ./xsync /etc/profile.d/my_env.sh

之后就同步完成了

配置 ssh 免密登录

我们为三台机器实现免密登录

在家目录中键入下面的命令可以生成一个密钥对,这个密钥对存储在 .ssh 文件夹中,公钥为 id_rsa.pub 这个公钥是要发送到所有主机的(保存在 连接目的地主机的 authorized 文件中),id_rsa 则为私钥,私钥自己保存

ssh-keygen -t rsa

之后进行公钥的拷贝(注意自己也要拷贝):

ssh-copy-id hadoop102		
ssh-copy-id hadoop103
ssh-copy-id hadoop104

对三台机器都这样进行操作,就可以实现三台机器的相互免密登录

注意,这里的免密登录是针对于 用户的,也就是说,这个登录在 root 上也需要再配置一遍

集群配置

集群结构:

Hadoop 集群结构:

  • hadoop102:
    • HDFS:NameNode、DataNode
    • YARN:NodeManager
  • hadoop103:
    • HDFS:DataNode
    • YARN:ResourceManager、NodeManager
  • hadoop104:
    • HDFS:SecondaryNameNode、DataNode
    • YARN:NodeManager

配置 core-site.xml:

这里第一个是 hadoop 的对内数据传输暴露地址,第二个是hadoop数据文件的存储地址

<configuration>
 <property>
  <name>fs.defaultFS</name>
  <value>hdfs://hadoop102:8020</value>
 </property>
 <property>
  <name>hadoop.tmp.dir</name>
  <value>/opt/module/hadoop-3.1.3/data</value>
 </property>
</configuration>

配置 hdfs-site.xml:

这里的两个配置分别是 hadoop外部访问地址和secondarynamenode的地址:

<configuration>
 <property>
  <name>dfs.namenode.http-address</name>
  <value>hadoop102:9870</value>
 </property>
 <property>
  <name>dfs.namenode.secondary.http-address</name>
  <value>hadoop104:9868</value>
 </property>
</configuration>

配置 yarn-site.xml:

第一个是建议的配置、第二个是 resourcemanager的地址、第三个是环境变量白名单

<configuration>
 <property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
 </property>
 <property>
  <name>yarn.resourcemanager.hostname</name>
  <value>hadoop103</value>
 </property>
 <property>
  <name>yarn.nodemanager.env-whitelist</name>
  <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
 </property>
</configuration>

配置 mapred-site.xml 令 mapreduce在yarn 上运行

<configuration>
 <property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
 </property>
</configuration>

之后进行分发:

xsync /opt/module/hadoop-3.1.3/etc/hadoop

workers的配置:只有配置了 workers,我们的启动命令才能够找到正确的服务器地址进行启动

/opt/module/hadoop-3.1.3/etc/hadoop/workers

hadoop102
hadoop103
hadoop104

之后进行分发

xsync workers

初始化,只有第一次启动需要初始化

hdfs namenode -format

初始化完毕后,hadoop-3.1.3 中会多出两个文件,分别是 data 和 logs

此时我们使用:

.../sbin/start-dfs.sh

就可以启动集群的hadoop服务了,这里启动之后只会启动 hadoop相关的服务:

NameNode、DataNode 和 SecondaryNameNode

此时还差 ResourceManager、NodeManager,这个需要我们在 103服务器中使用

.../sbin/start-yarn.sh 

命令进行启动

此时我们可以打开两个页面,一个是 hdfs 的文件管理界面,另一个是yarn的资源调度界面:

hadoop102:9870
hadoop103:8088

集群基本测试

创建目录

hadoop fs -mkdir /wcinput

我们将 wordcount 上传

hadoop fs -put wcinput/test.txt /wcinput

之后,我们可以在前端展示界面找到我们的文件,这个文件的真实存储是存在于 hadoop的 data目录内的,其原路径是:/data/dfs/data/current/xxxxxx/current/finalized/subdir0/subdir0 小文件会存储在一块中,大文件会存储在多块中,我们可以使利用 cat xxx >> tmp.tar.gz 的方式来追加,从而实现拼接处源文件的效果,但这只是一个尝试,正常不会这么做。

注意,在默认情况下,我们上传上去的数据会被复制两份,共计三份存储在不同的服务器上

此时,我们运行一下 wordcount 程序尝试一下,注意这里的所有操作都是基于 HDFS 文件系统的

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar wordcount /wcinput /output

此时程序正常运行

  • 注意此处:若集群因为配置失败或操作不当删除导致集群无法启动

    应先关闭集群:sbin/stop-dfs.sh、sbin/stop-yarn.sh

    之后删除每个集群上的 data 和 logs 命令,然后初始化:hdfs namenode -format

    之后再启动就可以了,但是这样会删除历史记录。

  • 此时还有一个问题需要注意,就是此处执行的任务无法保存,无法在历史中查看,这是我们必要的功能,所以我们进一步进行配置:

    我们 配置 mapred-site.xml 文件:

    添加如下配置,上面是内部通信地址,下面是web页面展示地址

     <property>
      <name>mapreduce.jobhistory.address</name>
      <value>hadoop102:10020</value>
     </property>
     <property>
      <name>mapreduce.jobhistory.webapp.address</name>
      <value>hadoop102:19888</value>
     </property>
    

    之后我们使用如下指令启动历史服务:

    bin/mapred --daemon start historyserver
    
    

    之后就可以通过 jps 看到启动了jobHistoryServer 服务

    关闭指令:

    bin/mapred --daemon stop historyserver
    
  • 配置日志

    在 yarn-site.xml 中进行日志功能的配置,注意日志需要集成在 jobhistory对应的端口,并且只需要保存七天

    配置分别是:开启日志聚集、对应日志端口、保存时间

     <property>
      <name>yarn.log-aggregation-enable</name>
      <value>true</value>
     </property>
     <property>
      <name>yarn.log.server.url</name>
      <value>http://hadoop102:19888/jobhistory/logs</value>
     </property>
     <property>
      <name>yarn.log-aggregation.retain-seconds</name>
      <value>604800</value>
     </property>
    

    之后记得分发重启就可以实现日志操作啦

  • 对于Manager的服务:

    yarn --daemon start/stop xxxxmanager
    

    对于 node 的服务

    hdfs --daemon start/stop xxx
    

    这两个命令可以实现单个服务的启停

服务一键启停脚本和jps全部脚本

一键启停脚本(myhadoop.sh):

记得要添加权限以允许所有用户都执行脚本

chmod 777 myhadoop.sh

#!/bin/bash

if [ $# -lt 1 ]
then
    echo "No Args Input..."
    exit ;
fi

case $1 in
"start")
    echo " ========== 启动 hadoop 集群 ========== "
    echo " ---------- 启动 hdfs ---------- "

    ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/start-dfs.sh"

    echo " ---------- 启动 yarn ----------"

    ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/start-yarn.sh"

    echo " ---------- 启动 historyserver ---------- "

    ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon start historyserver"
;;
"stop")
    echo " ========== 关闭 hadoop 集群 ========== "
    echo " ---------- 关闭 historyserver ----------"

    ssh hadoop102 "/opt/module/hadoop-3.1.3/bin/mapred --daemon stop historyserver"

    echo " ---------- 关闭 yarn  ----------"

    ssh hadoop103 "/opt/module/hadoop-3.1.3/sbin/stop-yarn.sh"

    echo " ---------- 关闭 hdfs  ---------- "

    ssh hadoop102 "/opt/module/hadoop-3.1.3/sbin/stop-dfs.sh"
;;
*)
    echo "Input Args Error..."
;;
esac

chmod 777 jpsall

jps集群脚本(jpsall):

#!/bin/bash

for host in hadoop102 hadoop103 hadoop104
do
    echo ========== $host =========
    ssh $host jps
done

同样,两个脚本都放在 ~/bin 中

如果需要的话,也可以使用 xsync 进行分发来让所有集群都使用到这两个脚本

其他问题

  • hadoop 常用端口号

    HDFS Namenode 内部端口:8020/9000/9820

    HDFS Namenode 对外暴露端口:9870

    Yarn 查看任务运行情况端口:8088

    历史服务器查看端口:19888

时间同步

使用 ntpd 服务实现时间同步功能

在 hadoop102 中进行时间服务的配置

systemctl status ntpd
systemctl start ntpd
systemctl is-enabled ntpd	# 自启动情况

之后进行时间服务器配置的修改:

sudo vim /etc/ntp.conf

修改几项:

  • 打开 restrict 192.168.xx.0 mask 255.255.255.0 nomodify notrap 的注释,这代表允许所有在 192.168.xx.0 网段的服务器访问自己

  • 之后注释掉 server 0、server 1、server 2、server 3 这四行,这代表从互联网获取时间信息,若我们是公网服务器,则无需进行修改

  • 在文件最末尾添加如下信息:

    server 127.127.1.0
    fudge 127.127.1.0 stratum 10
    

    这段代码允许当丢失网络连接时依然使用本地服务器作为集群中心为其他节点提供时间同步

  • 之后配置硬件时间信息:

    在末尾添加

    sudo vim /etc/sysconfig/ntpd
    
    SYNC_HWCLOCK=yes
    
  • 之后我们先关闭所有节点上的 ntpd 服务并关闭其自启动,这是为了避免一会在配置的时候出现外网和内网交替同步的乱象

    sudo systemctl stop ntpd
    sudo systemctl disable ntpd
    
  • 在其他机器上配置时间同步机制:一分钟同步一次

    sudo crontab -e
    

    之后进行编写定时同步

    在编辑crontab文件时,你可以添加新的计划任务或者修改现有的计划任务。每一行都代表一个计划任务,格式如下:
    0 3 * * * /path/to/command
    
    */1 * * * * /usr/sbin/ntpdate hadoop102
    
  • 之后我们可以进行测试,输入 date 可以查看系统时间

    sudo date -s "2015-6-5 11:11:15"
    

    这样调整系统时间之后,我们过一分钟就会自动将时间同步

注意在修改完之后,这子服务器的 ntpd 是关闭的状态,时间服务器的 ntpd 是启用的状态

ENS33 消失的处理方式

systemctl stop NetworkManager #关闭NetworkManager
systemctl disable NetworkManager #开机禁用NetworkManager
systemctl start network.service #开启网卡
service network restart #重启网卡

添加用户展示页面的操作权限

在正常情况下,hdfs 页面只有展示查询权限,是没有修改和删除权限的,基于这种情况,我们可以在 core-site.xml 中添加配置来添加用户的查询权限:

 <property>
  <name>hadoop.http.staticuser.user</name>
  <value>hadoop</value>
 </property>

http://www.kler.cn/a/320580.html

相关文章:

  • C++内存管理 - new/delete
  • <项目代码>YOLOv8 番茄识别<目标检测>
  • 层归一化和批归一化
  • Excel SUMIFS
  • HTML5+CSS前端开发【保姆级教学】+新闻文章初体验
  • UNI-APP小程序答题功能开发(左右滑动,判断,填空,问答,答题卡,纠错,做题倒计时等)
  • 记录docker phpadmin 链接 docker mysql
  • MQTT客户端实战:从连接到通信。详细说明MQTT客户端和MQTT代理进行通信
  • 微服务Docker相关指令
  • 使用python搭建Web项目
  • swiper3匀速滚动会卡顿问题,已解决
  • Linux线程同步—竞态条件与互斥锁、读写锁(C语言)
  • <Java>String类型变量的使用
  • 基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
  • 【c语言数据结构】栈的详解! 超级详细!(模拟实现,OJ练习题)
  • kubernetes K8S 挂载分布式存储 ceph
  • 算法基础8-双链表
  • Xcode16 iOS18 编译问题适配
  • 微信小程序教程:如何在个人中心实现头像贴纸功能
  • python爬虫解析工具BeautifulSoup(bs4)和CSS选择器——处理HTML和XML数据(7)
  • Windows系统修改Tomcat虚拟机内存参数
  • 《CUDA编程》3.简单CUDA程序的基本框架
  • 计算机毕业设计python+spark知识图谱房价预测系统 房源推荐系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习
  • RuoYi-App根据不同角色权限实现功能按钮显隐
  • OpenHarmony(鸿蒙南向)——平台驱动指南【I2C】
  • 简易STL实现 | 红黑树的实现