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

大数据Hadoop集群搭建

文章目录

  • 大数据Hadoop集群搭建
      • 一、VMware准备Linux虚拟机
      • 二、VMware虚拟机系统设置
        • 1、主机名、IP、SSH免密登录
        • 2、JDK环境部署
        • 3、防火墙、SELinux、时间同步
      • 三、VMware虚拟机集群上部署HDFS集群
        • 1、集群规划
        • 2、上传&解压
        • 3、Hadoop安装包目录结构
        • 4、修改配置文件,应用自定义设置
        • 5、准备数据目录
        • 6、分发Hadoop文件夹
        • 7、配置环境变量
        • 8、授权为hadoop用户
        • 9、格式化整个文件系统
        • 10、查看HDFS WEBUI
      • 四、HDFS的Shell操作
        • 1、HDFS相关进程的启停管理命令
          • 一键启停脚本
          • 单进程启停
        • 2、HDFS的文件系统操作命令
          • HDFS文件系统基本信息
          • 介绍
            • 1、创建文件夹
            • 2、查看指定目录下内容
            • 3、上传文件到HDFS指定目录下
            • 4、查看HDFS文件内容
            • 5、下载HDFS文件
            • 6、拷贝HDFS文件
            • 7、追加数据到HDFS文件中
            • 8、HDFS数据移动操作
            • 9、HDFS数据删除操作
            • 10、HDFS shell其它命令
            • 11、HDFS WEB浏览
        • 3、HDFS客户端 - Jetbrians产品插件
        • 4、HDFS客户端 - NFS
      • 五、MapReduce和YARN的部署
        • 一、部署说明
        • 二、集群规划
        • 三、MapReduce配置文件
        • 四、YARN配置文件
        • 五、分发配置文件
        • 六、集群启动命令介绍
        • 七、查看YARN的WEB UI页面
      • 提交MapReduce程序至YARN运行
      • 六、Hive部署
    • WordCount单词计数程序
        • JobMain类
        • WordCountMapper类
        • WordCountReducer类

大数据Hadoop集群搭建

一、VMware准备Linux虚拟机

1、首先准备VMware软件,用于后续创建虚拟机:

这里我使用的是VMware WorkStation Pro 17的版本,如下图:
在这里插入图片描述

2、设置VMware网段

在VMware的虚拟网络编辑器中,将VMnet8虚拟网卡的网段设置为192.168.88.0,网关设置为192.168.88.2,如下图:
在这里插入图片描述

点击右下角的“更改设置”,进入到下图所示的页面进行网段修改:
在这里插入图片描述

修改好之后点击“确定”即可。

3、下载CentOS的操作系统镜像文件

这里我放在了D:\Hadoop大数据虚拟机路径下
在这里插入图片描述

4、创建虚拟机

选择创建虚拟机
在这里插入图片描述

选择“典型”
在这里插入图片描述

选择刚刚下载好的虚拟机镜像文件
在这里插入图片描述

然后设置账号和密码(用于学习的话密码建议直接设置为123456):
在这里插入图片描述

接下来给虚拟机起一个名称,选择虚拟机的存放位置,这里我选择放在路径D:\Hadoop大数据虚拟机\vm\bigdata下面,后续创建的三个虚拟机结点也是存放在这个文件夹下面:
在这里插入图片描述
在这里插入图片描述

磁盘大小选择20~40GB都可以,我这里选择默认的20GB:
在这里插入图片描述

最后点击完成,等待虚拟机的安装完成:
在这里插入图片描述

接下来我通过已经创建好的名为“CentOS-7.6 Base”的这一个虚拟机去克隆出来三个结点的虚拟机:
在这里插入图片描述

虚拟机创建好后如下所示:
在这里插入图片描述

然后还要修改一下每个结点的硬件配置,如下:(硬件配置集群规划)

因为后续在node1的节点上运行的软件会多一些,所以这里我们给node1的内存调大一些。

节点CPU内存
node11核心4GB
node21核心2GB
node31核心2GB

二、VMware虚拟机系统设置

1、主机名、IP、SSH免密登录

配置固定IP地址

开启node1,修改主机名为node1,并修改固定IP为:192.168.88.131
在终端的root用户下执行下面的命令:

# 修改主机名
hostnamectl set-hostname node1# 修改IP地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR="192.168.88.131"# 重启网卡
systemctl stop network
systemctl start network
# 或者直接
ststemctl restart network

同样的操作启动node2和node3,修改node2主机名为node2,设置ip为192.168.88.132;修改node3主机名为node3,设置ip为192.168.88.133。

配置主机名映射

在Windows系统中修改hosts文件,填入如下内容:

192.168.88.131 node1
192.168.88.132 node2
192.168.88.133 node3

在3台Linux的/etc/hosts的文件中,填入如下内容(3台都要添加)

192.168.88.131 node1
192.168.88.132 node2
192.168.88.133 node3

配置SSH免密登录

后续安装的集群化软件,多数需要远程登录以及远程执行命令,我们可以简单起见,配置三台Linux服务器之间的免密码互相SSH登录

1、在每一台机器都执行:ssh-keygen -t rsa -b 4096,一路回车到底即可。

2、在每一台机器都执行:

ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3

3、执行完毕后,node1、node2、node3之间将完成root用户之间的免密互通。

创建hadoop用户并配置免密登录

后续大数据的软件,将不会以root用户启动(确保安全,养成良好的习惯)。

我们为大数据的软件创建一个单独的用户hadoop,并为三台服务器同样配置hadoop用户的免密互通。

1、在每一台机器都执行:useradd hadoop,创建hadoop用户

2、在每一台机器都执行:passwd hadoop,设置hadoop用户密码为123456

3、在每一台机器均切换到hadoop用户:su -hadoop,并执行ssh-keygen -t rsa -b 4096,创建ssh秘钥

4、在每一台机器均执行

ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
2、JDK环境部署

下载JDK1.8,这里我存放到了D:\Hadoop大数据虚拟机路径下:
在这里插入图片描述

1、创建文件夹,用来部署JDK,将JDK和Tomcat都安装部署到:/export/server内

mkdir -p /export/server

2、解压缩JDK安装文件

tar -zxvf jdk-8u361-linux-x64.tar.gz -C /export/server

3、配置JDK的软连接

ln -s /export/server/jdk1.8.0_361 /export/server/jdk

4、配置JAVA_HOME环境变量

# 编辑/etc/profile文件
export JAVA_HOME=/export/server/jdk
export PATH=$PATH:$JAVA_HOME/bin
3、防火墙、SELinux、时间同步

关闭防火墙和SELinux:

集群化软件之间需要通过端口互相通讯,为了避免出现网络不通的问题,我们可以简单的在集群内部关闭防火墙。

在每一台机器都执行:

systemctl stop firewalld
systemctl disable firewalld

Linux有一个安全模块:SELinux,用以限制用户和程序的相关权限,来确保系统的安全稳定。

在当前,我们只需要关闭SELinux功能,避免导致后面的软件出现问题即可。

在每一台机器都执行:

vim /etc/sysconfig/selinux# 将第七行,SELINUX=enforcing改为
SELINUX=disabled
# 退出保存后,重启虚拟机即可,千万要注意disabled单词不要写错,不然无法启动系统

修改时区并配置自动时间同步:

一下操作在三台Linux均执行

1、安装ntp软件

yum install -y ntp

2、更新时区

rm -f /etc/localtime;sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3、同步时间

ntpdate -u ntp.aliyun.com

4、开启ntp服务并设置开机自启

systemctl start ntpd
systemctl enable ntpd

至此,配置Hadoop大数据集群环境的前置准备就已经全部完成了,下面开始正式进入Hadoop集群环境的配置:

三、VMware虚拟机集群上部署HDFS集群

Hadoop安装包下载:(这里我使用hadoop3.3.4的版本)
在这里插入图片描述

1、集群规划

在前面的操作中,我们准备了基于VMware的三台虚拟机,其硬件配置如下:

节点CPU内存
node11核心4GB
node21核心2GB
node31核心2GB

Hadoop HDFS的角色包含:

  • NameNode,主节点管理者
  • DataNode,从节点工作者
  • SecondaryNameNode,主节点辅助

服务规划:

节点服务
node1NameNode、DataNode、SecondaryNameNode
node2DataNode
node3DataNode
2、上传&解压

注意:请确认已经完成前置准备中的服务器创建、固定IP、防火墙关闭、Hadoop用户创建、SSH免密、JDK部署等操作。

(下面的操作均在node1节点执行,以root身份登录)

1、上传Hadoop安装包到node1节点中

2、解压缩安装包到/export/server/中

tar -zxvf hadoop-3.3.4.tar.gz -C /export/server

3、构建软链接

cd /export/server
ln -s /export/server/hadoop-3.3.4 hadoop

4、进入hadoop安装包内

cd hadoop
3、Hadoop安装包目录结构

cd进入Hadoop安装包内,通过ls -l命令查看文件夹内部结构

4、修改配置文件,应用自定义设置

配置HDFS集群,我们主要涉及到如下文件的修改:

  • workers:配置从节点(DataNode)有哪些
  • hadoop-env.sh:配置Hadoop的相关环境变量
  • core-site.xml:Hadoop核心配置文件
  • hdfs-site.xml:HDFS核心配置文件

这些文件均存在与 H A D O O P H O M E / e t c / h a d o o p 文件夹中。( HADOOP_HOME/etc/hadoop文件夹中。( HADOOPHOME/etc/hadoop文件夹中。(HADOOP_HOME是后续我们要设置的环境变量,其指代Hadoop安装文件夹即/export/server/hadoop)

  • 配置workers文件
# 进入配置文件目录
cd etc/hadoop
# 编辑workers文件
vim workers
# 填入如下内容
node1
node2
node3

上面填入的node1、node2、node3表明集群记录了三个从节点(DataNode)

  • 配置hadoop-env.sh文件
# 填入如下内容
export JAVA_HOME=/export/server/jdk                #JAVA_HOME,指明JDK环境的位置在哪
export HADOOP_HOME=/export/server/hadoop           #HADOOP_HOME,指明Hadoop安装位置
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop     #HADOOP_CONF_DIR,指明Hadoop配置文件目录位置
export HADOOP_LOG_DIR=$HADOOP_HOME/logs            #HADOOP_LOG_DIR,指明Hadoop运行日志目录位置

通过记录这些环境变量,来指明上述运行时的重要信息。

  • 配置core-site.xml文件
# 在文件内部填入如下内容
<configuration><property><name>fs.defaultFS</name><value>hdfs://node1:8020</value></property><property><name>io.file.buffer.size</name><value>131072</value></property>
</configuration>
  • hdfs://node1:8020为整个HDFS内部的通讯地址,应用协议为hdfs://(Hadoop内置协议)

  • 表明DataNode将和node1的8020端口通讯,node1是NameNode所在机器

  • 此配置固定了node1必须启动NameNode进程

  • 配置hdfs-site.xml文件

<configuration><property>                                       # key:dfs.datanode.data.dir.perm<name>dfs.datanode.data.dir.perm</name>      # 含义:hdfs文件系统,默认创建的文件权限位置<value>700</value>                           # 值:700,即:rwx------</property><property>                                       # key:dfs.namenode.name.dir<name>dfs.namenode.name.dir</name>           # 含义:NameNode元数据的存储位置<value>/data/nn</value>                      # 值:/data/nn,在node1节点的/data/nn目录下</property><property>                                       # key:dfs.namenode.hosts<name>dfs.namenode.hosts</name>              # 含义:NameNode允许哪几个节点的DataNode连接(即允许加入集群)<value>node1,node2,node3</value>             # 值:node1、node2、node3,这三台服务器被授权</property><property>                                       # key:dfs.blocksize<name>dfs.blocksize</name>                   # 含义:hdfs默认块大小<value>268435456</value>                     # 值:268435456(256MB)</property><property>                                       # key:dfs.namenode.handler.count<name>dfs.namenode.handler.count</name>      # 含义:nameode处理的并发线程数<value>100</value>                           # 值:100,以100个并行度处理文件系统的管理任务</property><property>                                       # key:dfs.datanode.data.dir<name>dfs.datanode.data.dir</name>           # 含义:从节点DataNode的数据存储目录<value>/data/dn</value>                      # 值:/data/dn,即数据存放在node1、node2、node3,三台机器的</property>                                      #    /data/dn内
</configuration>
<configuration><property>                                       <name>dfs.datanode.data.dir.perm</name>      <value>700</value>                           </property><property>                                       <name>dfs.namenode.name.dir</name>           <value>/data/nn</value>                      </property><property>                                       <name>dfs.namenode.hosts</name>              <value>node1,node2,node3</value>            </property><property>                                       <name>dfs.blocksize</name>                   <value>268435456</value>                     </property><property>                                      <name>dfs.namenode.handler.count</name>      <value>100</value>                           </property><property>                                  <name>dfs.datanode.data.dir</name><value>/data/dn</value></property>                                    
</configuration>
5、准备数据目录

在这里插入图片描述

6、分发Hadoop文件夹

目前,已经基本完成Hadoop的配置操作,可以从node1将hadoop安装文件夹远程复制到node2、node3。

  • 分发
# 在node1执行如下命令
cd /export/server
scp -r hadoop-3.3.4 node2:`pwd`/
scp -r hadoop-3.3.4 node3:`pwd`/
  • 在node2执行,为hadoop配置软链接
# 在node2执行如下命令
ln -s /export/server/hadoop-3.3.4/export/server/hadoop
  • 在node3执行,为hadoop配置软链接
# 在node3执行如下命令
ln -s /export/server/hadoop-3.3.4/export/server/hadoop

在这里插入图片描述

7、配置环境变量

为了方便我们操作Hadoop,可以将Hadoop的一些脚本、程序配置到PATH中,方便后续使用。

在Hadoop文件夹中的bin、sbin两个文件夹内有许多的脚本和程序,现在来配置一下环境变量。

1、vim /etc/profile

# 在/etc/profile文件底部追加如下内容
export HADOOP_HOME=/export/server/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

在这里插入图片描述

2、在node2和node3配置同样的环境变量

8、授权为hadoop用户

hadoop部署准备的工作基本完成。

为了确保安全,hadoop系统不以root用户启动,我们以普通用户hadoop来启动整个Hadoop服务。

所以,现在需要对文件权限进行授权。

(请确保已经提前创建好了hadoop用户,并配置好了hadoop用户之间的免密登录)

  • 以root身份,在node1、node2、node3三台服务器上均执行如下命令
# 以root身份,在三台服务器上均执行
chown -R hadoop:hadoop /data
chown -R hadoop:hadoop /export
9、格式化整个文件系统

前期准备全部完成,现在对整个文件系统执行初始化。

  • 格式化namenode
# 确保以hadoop用户执行
su - hadoop
# 格式化namenode
hadoop namenode -format
  • 启动
# 一键启动hdfs集群
start-dfs.sh
# 一键关闭hdfs集群
stop-dfs.sh# 如果遇到命令未找到的错误,表明环境变量未配置好,可以以绝对路径执行
/export/server/hadoop/sbin/start-dfs.sh
/export/server/hadoop/sbin/stop-dfs.sh

启动后,可以通过jps命令来查看当前系统重正在运行的Java进行进程有哪些。

10、查看HDFS WEBUI

启动完成后,可以在浏览器打开:http://node1:9870,即可查看到hdfs文件系统的管理网页。

四、HDFS的Shell操作

1、HDFS相关进程的启停管理命令
一键启停脚本

Hadoop HDFS组件内置了HDFS集群的一键启停脚本。

  • $HADOOP_HOME/sbin/start-dfs.sh,一键启动HDFS集群

    执行原理:

    • 在执行此脚本的机器上,启动SecondaryNameNode
    • 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,启动NameNode
    • 读取workers内容,确认DataNode所在机器,启动全部DataNode
  • $HADOOP_HOME/sbin/stop-dfs.sh,一键关闭HDFS集群

    执行原理:

    • 在执行此脚本的机器上,关闭SecondaryNameNode
    • 读取core-site.xml内容(fs.defaultFS项),确认NameNode所在机器,关闭NameNode
    • 读取workers内容,确认DataNode所在机器,关闭全部DataNode
单进程启停

除了一键启停外,也可以单独控制进程的启停。

1、$HADOOP_HOME/sbin/hadoop-daemon.sh,此脚本可以单独控制所在机器的进程的启停

用法:hadoop-daemon.sh (start|status|stop) (namenode|secondarynamenode|datanode)

2、$HADOOP_HOME/bin/hdfs,此程序也可以用以单独控制所在机器的进程的启停

用法:hdfs --daemon (start|status|stop) (namenode|secondarynamenode|datanode)

2、HDFS的文件系统操作命令
HDFS文件系统基本信息

HDFS作为分布式存储的文件系统,有其对数据的路径表达方式。

HDFS同Linux系统一样,均是以/作为根目录的组织形式。

在这里插入图片描述

  • Linux:file:/// => file:///usr/local/hello.txt
  • HDFS:hdfs://namenode:port**/** => hdfs://node1:8020/usr/local/hello.txt

协议头file:///或hdfs://node1:8020/可以省略

  • 需要提供Linux路径的参数,会自动识别为file://
  • 需要提供HDFS路径的参数,会自动识别为hdfs://

除非是明确需要写或者是不写会有BUG,否则一般不用写协议头。

介绍

关于HDFS文件系统的操作命令,Hadoop提供了2套命令体系。

  • hadoop命令(老版本用法),用法:hadoop fs [generic options]
  • hdfs命令(新版本用法),用法:hdfs dfs [generic options]

两者在文件系统操作上,用法完全一致,用哪个都可以(只有某些个别的特殊操作需要选择hadoop命令或hdfs命令)

1、创建文件夹
  • hadoop fs -mkdir [-p]
  • hdfs dfs -mkdir [-p]

path为待创建的目录,-p选项的行为与Linux mkdir -p一致,它会沿着路径创建父目录。

2、查看指定目录下内容
  • hadoop fs -ls [-h] [-R] [ …]
  • hdfs dfs -ls [-h] [-R] [ …]

path指定目录路径,-h人性化显示文件size,-R递归查看指定目录及其子目录。

3、上传文件到HDFS指定目录下
  • hadoop fs -put [-f] [-p] …
  • hdfs dfs -put [-f] [-p] …
4、查看HDFS文件内容
  • hadoop fs -cat …
  • hdfs dfs -cat …

读取大文件可以使用管道符配合more(more命令是Linux中对内容进行翻页的命令)

  • hadoop fs -cat | more
  • hdfs dfs -cat | more
5、下载HDFS文件
  • hadoop fs -get [-f] [-p] …
  • hdfs dfs -get [-f] [-p] …

下载文件到本地文件系统指定目录,localhost必须是目录。

-f 覆盖目标文件(已存在下);-p 保留访问和修改时间,所有权和权限。

6、拷贝HDFS文件
  • hadoop fs -cp [-f] …
  • hdfs dfs -cp [-f] …

-f 覆盖目标文件(已存在下)

7、追加数据到HDFS文件中

​ 整个HDFS文件系统,它的文件的修改只支持两种,第一种是直接删掉,第二种是追加内容。(整个HDFS文件系统只能够进行删除和追加,不能修改里面某一行某一个字符)。

  • hadoop fs -appendToFile …
  • hdfs dfs -appendToFile …

​ 将所有给定本地文件的内容追加到给定dst文件。dst如果文件不存在,将创建该文件 。如果为-,则输入为从标准输入中读取。

8、HDFS数据移动操作
  • hadoop fs -mv …
  • hdfs dfs -mv …

移动文件到指定文件夹下,可以使用该命令移动数据以及重命名文件的名称。

9、HDFS数据删除操作
  • hadoop fs -rm -r [-skipTrash] URI [URI…]
  • hdfs dfs -rm -r [-skipTrash] URI [URI…]

删除指定路径的文件或文件夹,-skipTrash 跳过回收站,直接删除。

# 回收站功能默认关闭,如果要开启需要在core-site.xml内配置:
<property><name>fs.trash.interval</name><value>1440</value>
</property><property><name>fs.trash.checkpoint.interval</name><value>120</value>
</property>#无需重启集群,在哪个机器配的,在哪个机器执行命令就生效。回收站默认位置在:/usr/用户名(hadoop)/.Trash
10、HDFS shell其它命令

命令官方指导文档:https://hadoop.apache.org/docs/r3.3.4/hadoop-project-dist/hadoop-common/FileSystemShell.html

11、HDFS WEB浏览

除了使用命令操作HDFS文件系统之外,在HDFS的WEB UI上也可以查看HDFS文件系统的内容。

在这里插入图片描述

但使用WEB浏览操作文件系统,一般会遇到权限问题:

在这里插入图片描述

这是因为WEB浏览器中是以匿名用户(dr.who)登录的,其只有只读权限,多数操作是做不了的。

如果需要以特权用户在浏览器中进行操作,需要配置如下内容到core-site.xml并重启集群。

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

​ 但是,不推荐这样做:HDFS WEBUI只读权限挺好的,简单浏览即可。而且如果给与高权限,会有很大的安全问题,造成数据泄露或丢失。

3、HDFS客户端 - Jetbrians产品插件
4、HDFS客户端 - NFS

注意:要求Windows电脑为专业版,家庭版没有NFS服务。

在这里插入图片描述

五、MapReduce和YARN的部署

一、部署说明

Hadoop HDFS分布式文件系统,我们会启动:

  • NameNode进程作为管理节点
  • DataNode进程作为工作节点
  • SecondaryNameNode作为辅助

同理,Hadoop YARN分布式资源调度,会启动:

  • ResourceManager进程作为管理节点
  • NodeManager进程作为工作节点
  • ProxyServer、JobHistoryServer这两个辅助节点
    在这里插入图片描述

MapReduce运行在YARN容器内,无需启动独立进程。

所以关于MapReduce和YARN的部署,其实就是2件事情:

  • 关于MapReduce:修改相关配置文件,但是没有进程可以启动。
  • 关于YARN:修改相关配置文件,并启动ResourceManager、NodeManager进程以及辅助进程(代理服务器、历史服务器)。

通过表格汇总如下:

组件配置文件启动进程备注
Hadoop HDFS需修改需启动NameNode作为主节点、DataNode作为从节点、SecondaryNameNode主节点辅助分布式文件系统
Hadoop YARN需修改需启动ResourceManager作为集群资源管理者、NodeManager作为单机资源管理者、ProxyServer代理服务器提供安全性、JobHistoryServer记录历史信息和日志分布式资源调度
Hadoop MapReduce需修改无需启动任何进程,MapReduce程序运行在YARN容器内分布式数据计算
二、集群规划

有3台服务器,其中node1配置较高。

集群规划如下:

主机角色
node1ResourceManager、NodeManager、ProxyServer、JobHistoryServer
node2NodeManager
node3NodeManager
三、MapReduce配置文件

在$HADOOP_HOME/etc/hadoop文件夹内,修改:

  • mapred-env.sh文件,添加如下环境变量
# 设置JDK路径
export JAVA_HOME=/export/server/jdk
# 设置JobHistoryServer进程的内存为1G
export HADOOP_JOB_HISTORYSERVER_HEAPSIZE=1000
# 设置日志级别为INFO
export HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA
  • mapred-site.xml文件,添加如下配置信息
<property><name>mapreduce.framework.name</name><value>yarn</value><description>MapReduce的运行框架设置为YARN</description>
</property><property><name>mapreduce.jobhistory.address</name><value>node1:10020</value><description>历史服务器通讯端口为node1:10020</description>
</property><property><name>mapreduce.jobhistory.webapp.address</name><value>node1:19888</value><description>历史服务器web端口为node1的19888</description>
</property><property><name>mapreduce.jobhistory.intermediate-done-dir</name><value>/data/mr-history/tmp</value><description>历史信息在HDFS的记录临时路径</description>
</property><property><name>mapreduce.jobhistory.done-dir</name><value>/data/mr-history/done</value><description>历史信息在HDFS的记录路径</description>
</property><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description>
</property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description>
</property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value><description>MapReduce HOME设置为HADOOP_HOME</description>
</property>
四、YARN配置文件

在$HADOOP_HOME/etc/hadoop文件夹内,修改:

  • yarn-env.sh文件,添加如下4行环境变量内容:
# 设置JDK路径的环境变量
export JAVA_HOME=/export/server/jdk
# 设置HADOOP_HOME的环境变量
export HADOOP_HOME=/export/server/hadoop
# 设置配置文件路径的环境变量
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# 设置日志文件路径的环境变量
export HADOOP_LOG_DIR=$HADOOP_HOME/logs
  • yarn-site.xml文件
<property><name>yarn.resourcemanager.hostname</name><value>node1</value><description>ResourceManager设置在node1节点</description>
</property><property><name>yarn.nodemanager.local-dirs</name><value>/data/nm-local</value><description>NodeManager中间数据本地存储路径</description>
</property><property><name>yarn.nodemanager.log-dirs</name><value>/data/nm-log</value><description>NodeManager数据日志本地存储路径</description>
</property><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value><description>为MapReduce程序开启Shuffle服务</description>
</property><property><name>yarn.log.server.url</name><value>http://node1:19888/jobhistory/logs</value><description>历史服务器URL</description>
</property><property><name>yarn.web-proxy.address</name><value>node1:8089</value><description>代理服务器主机和端口</description>
</property><property><name>yarn.log-aggregation-enable</name><value>true</value><description>开启日志聚合</description>
</property><property><name>yarn.nodemanager.remote-app-log-dir</name><value>/tmp/logs</value><description>程序日志HDFS的存储路径</description>
</property><property><name>yarn.resourcemanager.scheduler.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value><description>选择公平调度器</description>
</property>
五、分发配置文件

MapReduce和YARN的配置文件修改好后,需要分发到其它的服务器节点中。

scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node2:`pwd`/
scp mapred-env.sh mapred-site.xml yarn-env.sh yarn-site.xml node3:`pwd`/

分发完配置文件,就可以启动YARN的相关进程了。

六、集群启动命令介绍

常见的进程启动命令如下:

  • 一键启动YARN集群:$HADOOP_HOME/sbin/start-yarn.sh
    • 会基于yarn-site.xml中配置的yarn.resourcemanager.hostname来决定在哪台机器上启动resourcemanager
    • 会基于workers文件配置的主机启动NodeManager
  • 一键停止YARN集群:$HADOOP_HOME/sbin/stop-yarn.sh
七、查看YARN的WEB UI页面

打开http://node:8080即可看到YARN集群的监控页面(ResourceManager的WEB UI)

提交MapReduce程序至YARN运行

六、Hive部署

Hive是分布式运行的框架还是单击运行的?

Hive是单机工具,只需要部署在一台服务器即可。

Hive虽然是单机的,但是它可以提交分布式运行的MapReduce程序运行。

WordCount单词计数程序

下面单词计数程序的运行命令:

hadoop jar mapreduce_wordcount-1.0-SNAPSHOT.jar cn.itcast.mapreduce.JobMain

hdfs dfs -rm -r hdfs://node1:8020/wordcount_out

hadoop jar mapreduce_wordcount-1.0-SNAPSHOT.jar cn.itcast.mapreduce.JobMain 1

hadoop jar mapreduce_wordcount-1.0-SNAPSHOT.jar cn.itcast.mapreduce.JobMain 2

hadoop jar mapreduce_wordcount-1.0-SNAPSHOT.jar cn.itcast.mapreduce.JobMain 3

JobMain类
package cn.itcast.mapreduce;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;public class JobMain extends Configured implements Tool {@Overridepublic int run(String[] strings) throws Exception {//创建一个任务对象Job job = Job.getInstance(super.getConf(), "mapreduce-wordcount");//打包放在集群运行时,需要做一个配置job.setJarByClass(JobMain.class);//第一步:设置读取文件的类:K1和V1job.setInputFormatClass(TextInputFormat.class);TextInputFormat.addInputPath(job,new Path("hdfs://node1:8020/wordcount"));//第二步:设置Mapper类job.setMapperClass(WordCountMapper.class);//设置Map阶段的输出类型:K2和V2的类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);//第三、四、五、六步采用默认方式(分区、排序、规约、分组)//第七步:设置我们的Reducer类job.setReducerClass(WordCountReducer.class);//设置Reduce阶段的输出类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);//第八步:设置输出类job.setOutputFormatClass(TextOutputFormat.class);//设置输出路径TextOutputFormat.setOutputPath(job,new Path("hdfs://node1:8020/wordcount_out"));boolean b = job.waitForCompletion(true);return b?0:1;}public static void main(String[] args) throws Exception {Configuration configuration = new Configuration();//启动一个任务int run = ToolRunner.run(configuration, new JobMain(), args);System.exit(run);}
}
WordCountMapper类
package cn.itcast.mapreduce;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** Mapper的泛型:* KEYIN:K1的类型     行偏移量         LongWritable* VALUEIN:v1的类型   一行的文本数据    Text* KEYOUT:k2的类型    每个单词         Text* VALUEOUT:v2的类型  固定值1          LongWritable*/
public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> {/*map方法是将k1和v1转为k2和v2key:k1value:v1context:表示MapReduce上下文对象K1      V10     hello,world11    hello,hadoop-----------------------K2       V2hello    1world    1hadoop   1
*/@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//1、对每一行的数据进行字符串拆分String line = value.toString();String[] split = line.split(",");//2、遍历数组,获取每一个单词for(String word : split){context.write(new Text(word),new LongWritable(1));}}
}
WordCountReducer类
package cn.itcast.mapreduce;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** KEYIN:K2的类型        Text            每个单词* VALUEIN:v2的类型      LongWritable    集合中泛型的类型* KEYOUT:k3的类型       Text            每个单词* VALUEOUT:v3的类型     LongWritable    每个单词出现的次数*/
public class WordCountReducer extends Reducer<Text, LongWritable,Text,LongWritable> {/*reduce的方法的作用是将K2和V2转化为K3和V3key:K2values:集合context:MapReduce的上下文对象*//*新    K2      V2hello   <1,1>world   <1,1>hadoop  <1,1,1>--------------------K3      V3hello     2world     2hadoop    3*/@Overrideprotected void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException {long count = 0;//1、遍历values集合for(LongWritable value : values){//2、将集合中的值相加count+=value.get();}//3、将k3和v3写入上下文中context.write(key,new LongWritable(count));}
}
package cn.itcast.mapreduce;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** KEYIN:K2的类型        Text            每个单词* VALUEIN:v2的类型      LongWritable    集合中泛型的类型* KEYOUT:k3的类型       Text            每个单词* VALUEOUT:v3的类型     LongWritable    每个单词出现的次数*/
public class WordCountReducer extends Reducer<Text, LongWritable,Text,LongWritable> {/*reduce的方法的作用是将K2和V2转化为K3和V3key:K2values:集合context:MapReduce的上下文对象*//*新    K2      V2hello   <1,1>world   <1,1>hadoop  <1,1,1>--------------------K3      V3hello     2world     2hadoop    3*/@Overrideprotected void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException {long count = 0;//1、遍历values集合for(LongWritable value : values){//2、将集合中的值相加count+=value.get();}//3、将k3和v3写入上下文中context.write(key,new LongWritable(count));}
}
http://www.lryc.cn/news/573058.html

相关文章:

  • Linux (2)
  • Java常见八股-(6.算法+实施篇)
  • 知识蒸馏(Knowledge Distillation, KD)
  • gitea本地部署代码托管后仓库的新建与使用(配置好ssh密钥后仍然无法正常克隆仓库是什么原因)
  • 李宏毅 《生成式人工智能导论》| 第6讲-第8讲:大语言模型修炼史
  • 【大模型学习】项目练习:知乎文本生成器
  • IPv6 | 地址解析 / 地址管理 / 邻居发现协议(NDP)/ 无状态自动配置(SLAAC)
  • 简单的 ​Flask​ 后端应用
  • FPGA基础 -- Verilog 的属性(Attributes)
  • HTTP Server
  • 解决uni-app发布微信小程序主包大小限制为<2M的问题
  • C/C++ 高频八股文面试题1000题(一)
  • DB面试题
  • C++基础算法————并查集
  • Python中布尔值在函数中的巧妙运用
  • 【Python进阶系列】第9篇:聊聊 Python 中常用的第三方库
  • docker基础入门于应用的实践
  • 让Agent的应用价值增长
  • mysql 执行计划 explain命令 详解
  • Agent轻松通-P3:分析我们的Agent
  • 详解Redis的内存淘汰策略
  • HCIP-华为VRP系统基础
  • Linux——库文件生成和使用
  • 软件架构的发展历程——从早期的单体架构到如今的云原生与智能架构
  • 初学python的我开始Leetcode题10-2
  • RPC常见问题回答
  • 【Go语言基础】对齐边界与内存填充
  • HTTP 请求方法与状态码
  • 深入解析:如何实时获取Socket接收缓冲区的数据量
  • Cesium、ThreeWebGL详解(二)渲染引擎向GPU传数据、性能优化、引擎对比