【李老师云计算】实验一:Hadoop伪分布式集群部署与Eclipse访问Hadoop进行单词计数统计

索引

    • 前言
    • 实验内容
    • 1. 安装虚拟机
      • 1.1 安装与激活
      • 1.2 ★解决使用虚拟机蓝屏(绿屏)
    • 2. 安装CentOS
      • 2.1 下载CentOS
      • 2.2 VMware新建虚拟机
      • 2.3 安装CentOS(包括GUI、主机名)
      • 2.4 ★解决已经创建虚拟机改主机名
    • 3. VMWare 网络配置
      • 3.0 使用VI编辑器和VMware
        • 3.0.1 使用VI编辑器
        • 3.0.2 使用VMware
      • 3.1 虚拟机IP设置
      • 3.2 验证设置成功
      • 3.3 ★解决ens33没有成功设置IP
      • 3.4 ★解决虚拟机待机问题
    • 4. 防火墙配置
      • 4.1 关闭防火墙
      • 4.2 确认防火墙状态
    • 5. 虚拟机互联互通
      • 5.1 添加映射
      • 5.2 互相ping验证连通性
      • 5.3 ★解决IP失效(之前能联网现在不行了)
    • 6. 虚拟机访问外网
      • 6.1 方法一:ping百度
      • 6.2 方法二:通过FireFox访问百度
    • 7. 免密安全登录
      • 7.1 生成秘钥及分享秘钥
      • 7.2 测试是否成功
    • 8. Hadoop集群设计与部署
      • 8.1 下载Hadoop-3.3.1
      • 8.2 创建目录解压Hadoop
      • 8.3 配置环境变量
      • 8.4 找到JDK位置
      • 8.5 修改主机配置文件
        • 8.5.1 hadoop-env.sh修改
        • 8.5.2 core-site.xml修改
        • 8.5.3 hdfs-site.xml修改
        • 8.5.4 yarn-site.xml修改
        • 8.5.5 mapred-site.xml修改
        • 8.5.6 workers修改
      • 8.6 分享主机配置文件
      • 8.7 格式化Hadoop
      • 8.8 启动Hadoop
      • 8.9 验证是否完成
      • 8.10 浏览器查看集群
      • 8.11 ★解决浏览器无法查看集群
      • 8.12 ★虚拟机拖拽文件
      • 8.13 ★解决Hadoop集群部署不成功
    • 9. Eclipse访问Hadoop
      • 9.1 下载Eclipse
      • 9.2 配置eclipse
      • 9.3 eclipse连接Hadoop
      • 9.4 ★解决eclipse连接Hadoop失败
      • 9.5 ★解决没有Hadoop Map/Reduce选项
    • 10. MapReduce模型
      • 10.1 在Hadoop集群创建文件
      • 10.2 创建Map/Reduce项目
      • 10.3 运行代码
      • 10.4 ★解决不能运行(爆红的几种情况)
      • 10.5 运行结果
      • 10.6 ★解决Map+Reduce方法二次编程
      • 10.7 ★解决运行后有目录但没有结果文件
      • 10.8 ★解决找不到项目栏的问题
      • 10.9 ★解决在网页查看output文件
    • 后记

前言

本来打算写在一起,奈何一个实验的内容实在是太多了……

其实我的学长已经写过云计算的实验过程并且我也得到了不少帮助,但是仍然还是要写下这一篇博客,一是把内容完全整合到这一篇博客——面向单次实验的博客;二是有许多问题是我自己遇到的;三是我的Hadoop版本不同,可以做一个更新版本的介绍,总之同学们可以自行选择。

下面实验的要求短短十条不过百字,里面多少心血,要走多少坑爬多少山?就算对着别人的经验来做也总是出很多莫名奇妙的BUG,做这个实验需要好几天也是正常不过的事情,稍安勿躁吧只能说。尽量把每个地方可能遇到的问题说一下。

带★的是可能遇到的问题可以看一下,以防后续操作出问题。

内容可能来自博主自己手搓、吸取同学的经验、网络上内容的整合等等,仅供参考,更多内容可以查看大三下速通指南专栏。

实验内容

实验1:Hadoop伪分布式集群部署与Eclipse访问Hadoop进行单词计数统计。

(1) VMWare客户端安装

(2) VMWare NAT或仅主机网络设计与配置

(3) 防火墙配置

(4) 虚拟机互联互通

(5) 虚拟机访问外网

(6) 免密安全登录

(7) Hadoop集群设计与部署

(8) Eclipse访问Hadoop

(9) Map方法二次编程

(10) Reduce方法二次编程

1. 安装虚拟机

1.1 安装与激活

虚拟机之前学Linux的时候都安装过,不再过多赘述,百度一搜有一堆比我说得要更加清楚的博客。

请添加图片描述

想要激活也很简单,网上搜到的相应版本的秘钥都是可以使用的。

1.2 ★解决使用虚拟机蓝屏(绿屏)

安装VMware最好装新版本的,旧版本可能与windows10、windows11不是很兼容导致经常蓝屏(绿屏),我刚开始做的时候使用的是VMware12,经常打开虚拟机或者拖拽文件就会死机,后续又下载的VMware16。

如果你已经开始操作了,没有问题的,重新安装VMware不会影响你创建好了的虚拟机。

2. 安装CentOS

2.1 下载CentOS

这里直接在阿里云镜像站下载的,如果下的慢可以去找其他的镜像站,这不是关键内容不做过多的阐述了。

选择CentOS-7-X86_64-DVD-1810.iso,等待下载完成。
请添加图片描述

2.2 VMware新建虚拟机

该操作需要重复三次(实验需要一个Master两个Slave……)

在VMware上选择文件->新建虚拟机

在这里插入图片描述

然后选择自定义(高级)

然后一直下一步,直到选择安装来源,选择安装程序光盘映像文件(iso)浏览选择刚才下载的CentOS的位置(iso文件)。

下一步直到命名虚拟机虚拟机的名称可以后续修改,改不改都可以,下面的位置是安装到的虚拟机位置(不想下C盘请修改)。

之后一直下一步就可以了,配置什么的后面可以通过编辑虚拟机进行修改。

三个虚拟机的位置最好都选在不同的文件夹中,如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvBqvUS3-1680265800495)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20230331084945205.png)]

2.3 安装CentOS(包括GUI、主机名)

该操作需要重复三次(实验需要一个Master两个Slave……)

新建虚拟机后会自动开机进入CentOS的安装程序,点进虚拟机,然后一直回车就好了,然后等待完成。

之后会弹出安装界面,按照需求选择,继续。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YnxXbxVn-1680265800495)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20230331085725203.png)]

之后的安装信息摘要比较重要了,直接拖到下面前三个选项不要管,我们需要打开的有下面红框标记的三个。

在这里插入图片描述

首先打开软件选择,选中带GUI的服务器,如果不选的话你的CentOS是纯命令行,说实话有点麻烦……点击完成即可。

在这里插入图片描述

然后打开安装位置,打开以后直接完成,什么都不需要选择。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YPqTR7Zq-1680265800496)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20230331090133266.png)]

最后选择网络和主机名,根据老师的要求修改主机名(我们的要求是Master学号后两位、Slave1-学号后两位、Slave2-学号后两位)。

在这里插入图片描述

返回到安装界面,点击开始安装

进入页面选择ROOT密码,设置为123456(别的也行,简单一点不要为难自己)。

在这里插入图片描述

然后等待安装完成即可。
在这里插入图片描述

2.4 ★解决已经创建虚拟机改主机名

方法一是使用指令hostnamectl set-hostname xxx,xxx是自己的主机名,但是这种方法设置的主机名是小写的。

方法二是使用指令vi /etc/hostname ,这个文件里的内容就是你的主机名,直接全删了,把自己的主机名输入进去就行了,大小写都可以,这种方法需要重启一次。

3. VMWare 网络配置

按照老师要求,主机的ip最后一个字节是学号,

从机1是学号+1,从机2是学号+2……

3.0 使用VI编辑器和VMware

该操作需要重复三次(实验需要一个Master两个Slave……)

3.0.1 使用VI编辑器

之后会经常用到VI编辑器,因此做几个介绍:

  1. 使用vi 文件路径指令打开文件
  2. 敲击键盘insert键或者i键进入insert模式(编辑)
  3. 敲击键盘字母o,可以插入新的一行并自动进入insert模式(编辑)
  4. 在VI编辑器(以及终端)中,选中就是复制
  5. 在VI编辑器(以及中断)中,鼠标中键(滚轮)是粘贴
  6. 修改完成后ESC:wq是保存退出,一定要小写,大写会出错。

3.0.2 使用VMware

登录虚拟机使用root,不要用用户。(root在未列出中,用户名root,密码123456)
如果暂时不做了,最好是使用挂起客户机而不是关闭客户机

在这里插入图片描述

3.1 虚拟机IP设置

首先查看一下虚拟机子网IP,在VMware上,点击编辑->虚拟网络编辑器

在这里插入图片描述

点击VMnet8,查看下面的子网IP,如下图子网IP是192.168.64.0

在这里插入图片描述

再点击一下NAT设置查看一下网关IP:

在这里插入图片描述

启动虚拟机,使用ROOT登录(未列出的->用户名root,密码123456)。

打开终端,输入vi /etc/sysconfig/network-scripts/ifcfg-ens33复制命令,鼠标中键粘贴到终端

在这里插入图片描述

需要修改的是:BOOTPROTO=staticONBOOT=yes

在最后添加以下内容,我们之前得到的子网IP是192.168.64.0因此我们的IPADDR前三个字节需要相同,最后一个字节根据自己的学号修改。

GATEWAYDNS1相同,都按照前面找到的网关IP填写。

IPADDR=192.168.64.60
NETMASK=255.255.255.0
GATEWAY=192.168.64.2
DNS1=192.168.64.2

然后ESC:wq退出,不要少写了冒号!

在这里插入图片描述

3.2 验证设置成功

终端输入指令systemctl restart network(中间粘贴)

之后通过指令ip addr来查看,只要ens33出现了inet并且是自己的设置的IP就是成功了,如果没有,请对照3.1.1的注意事项查找错误。

在这里插入图片描述

用上面的方法完成Slave1和Slave2的IP设置,不再重复演示。

3.3 ★解决ens33没有成功设置IP

首先确保已经使用了systemctl restart network指令。

然后上面的一定严格按照给的写:字母写错、不是大写都有可能导致无法连接网络。大概率问题出在ens33的文件配置中。

如果之前已经设置成功并且显示,后续打开发现失效,可以参考5.3来解决。

3.4 ★解决虚拟机待机问题

我们可能需要来回切换设置这三台虚拟机,从一台换到另一台的时候可能已经进入待机模式了,需要重新输入密码进入,怪麻烦的,下面给出关闭待机的方法。

在这里插入图片描述

在设置中选择Power(电源),然后把空白屏幕改成从不就可以了。

在这里插入图片描述

4. 防火墙配置

实验文档只告诉一个防火墙配置,也不说配置什么,全是泛泛之谈!一百个字的实验文档轻飘飘的话,剩下全靠自己悟。

4.1 关闭防火墙

该操作需要重复三次(实验需要一个Master两个Slave……)

在终端使用指令依次使用下面两个指令:

  1. systemctl stop firewalld 关闭防火墙
  2. systemctl disable firewalld 禁用防火墙(不再开机启动)

4.2 确认防火墙状态

在终端使用指令systemctl status firewalld查看防火墙状态,下图是已经关闭的状态:

在这里插入图片描述

没有关闭重启试试。

5. 虚拟机互联互通

该操作需要重复三次(实验需要一个Master两个Slave……)

5.1 添加映射

在终端使用指令vi /etc/hosts,将主机名与IP地址的映射关系存入。

如我的IP地址与主机名的对应关系是:

192.168.64.60 Master60
192.168.64.61 Slave1-60
192.168.64.62 Slave2-60

可以用#把前面两条注释掉,然后把自己的复制进去(鼠标中键),最后:wq保存,文档如下图所示:
在这里插入图片描述

5.2 互相ping验证连通性

首先确保三台虚拟机都已经完成了/etc/hosts的修改。

以Master(主机)为例,使用指令ping 192.168.64.61(IP以自己的从机IP为准),或者使用ping Slave2-60来检验是否连通(IP和主机名有映射关系了,所以ping IP和ping 主机名都可以)。

在这里插入图片描述

再分别从从机1和从机2去ping其他的两台机器,验证是否连通,过程是一样的只是把ip改一下,不再做演示。

5.3 ★解决IP失效(之前能联网现在不行了)

如果之前已经设置成功并且显示,后续打开发现失效可能是网卡出现问题了。

依次使用以下指令:

  1. systemctl stop NetworkManager
  2. systemctl disable NetworkManager
  3. systemctl restart network

然后再通过ip addr查看是否成功(ens33显示IP)。

6. 虚拟机访问外网

该操作需要重复三次(实验需要一个Master两个Slave……)

6.1 方法一:ping百度

在终端通过ping baidu.com验证是否成功。

下面以主机为例:

在这里插入图片描述

从机也需要验证,如果哪台机器ping不通请查看3.3以及5.3的解决方法或自行百度。

6.2 方法二:通过FireFox访问百度

这种方法需要再安装CentOS的时候选择了GUI界面(参考2.3)

在这里插入图片描述

然后输入www.baidu.com,看是否能成功访问,以下是成功界面:
在这里插入图片描述

7. 免密安全登录

7.1 生成秘钥及分享秘钥

该操作需要重复三次(实验需要一个Master两个Slave……)

以主机为例,在终端依次使用以下指令生成秘钥然后分享给除了自己以外的另外两台机器:

  1. ssh-keygen -t rsa(然后一直回车)
  2. ssh-copy-id Slave1-60(Slave1-60修改为你的从机1的主机名或IP)
  3. ssh-copy-id Slave2-60(Slave1-60修改为你的从机2的主机名或IP)
    步骤2、3需要输入yes,然后再输入密码(123456),密码不会显示(Linux特性)。

在这里插入图片描述

两个从机重复以上操作。

之后在**主机(Master)**进行如下操作(这一步从机不需要):

  1. cd .ssh(目前所在路径是~)
  2. touch authorized_keys
  3. chmod 600 authorized_keys
  4. cat id_rsa.pub >> authorized_keys

这一步是为了之后做准备的……

7.2 测试是否成功

以从机1为例,在终端使用指令ssh Master60(改为自己主机的主机名)或者`ssh 192.168.64.610(改为自己主机的IP)。

在这里插入图片描述

可以发现此时不需要键入密码就可以登录。

8. Hadoop集群设计与部署

OK,这一步的难度大于前面七步的和,尽量说的详细一点。

该操作需要重复三次(实验需要一个Master两个Slave……)

8.1 下载Hadoop-3.3.1

我用的是Hadoop-3.3.1,下面的操作只要是Hadoop-3.x应该都是适用的,但是Hadoop-2.x可能有细枝末节的地方不太相同,建议看一下PushyTao学长的博客。

建议是在自己的电脑上而不是虚拟机上下载,因为每台虚拟机都需要一份,所以直接下在自己电脑桌面上然后拖到虚拟机里就可以了。

下面给出两个镜像站地址,哪个快下哪个吧:

  1. 清华镜像站
  2. 阿里云镜像站

以阿里云镜像站为例,要下载的是hadoop-3.3.1.tar.gz

在这里插入图片描述

8.2 创建目录解压Hadoop

首先mkdir /user(现在的路径是~)

然后直接复制以下指令到终端(鼠标中键粘贴)

mkdir  /user/hadoop
mkdir  /user/hadoop/tmp
mkdir  /user/hadoop/var
mkdir  /user/hadoop/dfs
mkdir  /user/hadoop/dfs/name
mkdir  /user/hadoop/dfs/data

方便起见,后面的操作用GUI进行,点击应用程序,选择文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zA2pArY5-1680265800507)(C:\Users\dell\Documents\ShareX\Screenshots\2023-03\vmware_mXMFpi9xHu.png)]

点击其他位置,然后选择计算机

在这里插入图片描述

找到user文件夹点击进入,注意是user不是usr

在这里插入图片描述

进入里面的hadoop目录,然后把电脑上的压缩包拖进来(下面的图是解压完成的)
在这里插入图片描述

然后在这个界面右键选择在终端打开

在这里插入图片描述

这时候我终端的位置是这个目录:

在这里插入图片描述

然后输入指令tar -zxvf hadoop-3.3.1.tar.gz进行解压。

8.3 配置环境变量

在终端使用指令vi ~/.bashrc

在最后键入i进行插入,需要修改的只有第一行HADOOP_INSTALL,把它改成自己Hadoop的位置就好了(含有bin、etc、……的目录)。

export HADOOP_INSTALL=/user/hadoop/hadoop-3.3.1
export PATH=$PATH:$HADOOP_INSTALL/bin
export PATH=$PATH:$HADOOP_INSTALL/sbin
export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
export HADOOP_COMMON_HOME=$HADOOP_INSTALL 
export HADOOP_HDFS_HOME=$HADOOP_INSTALL
export YARN_HOME=$HADOOP_INSTALL
export HADOOP_HOME=$HADOOP_INSTALL

在这里插入图片描述

:wq保存退出。

然后在终端输入指令source ~/.bashrc

8.4 找到JDK位置

其实这个地方是搞错了的这里用的是JRE(运行包),而不是JDK(开发包),其中开发包是包含了运行包。但是后面的操作只需要运行即可,就是说不会影响到后续操作。我会在下一个实验的时候进行修正,或者到这一步时同学们可以自行下载JDK

这个CentOS是自带了一个JDK确实是能用的,所以我也不另外下载了,找到这个JDK就可以了。

依次使用指令:

  1. which java获得一个地址/usr/bin/java
  2. ls -lrt /usr/bin/java,根据前面得到的地址修改,会获得另一个地址/etc/alternatives/java
  3. ls -lrt /etc/alternatives/java,根据前面得到的地址修改,最终得到的就是jdk的位置。

在这里插入图片描述

比如我找到的是java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64,但实际上每个人可能有所差别,以自己的为准!

上面显示0.362是因为后面的操作应该是有了一个新的版本但是为了还原,我还是说我的过程吧。

点进去这个这个目录,把里面jre的bin和lib给复制出来。

在这里插入图片描述

不搞出来之后会报错,JAVA_HOME需要这俩东西应该是,如果重新下jdk也差不多这么个意思。

8.5 修改主机配置文件

在做这一步之前先确保主机和两台从机都完成了以上操作,然后在主机上完成以下操作。

用GUI来完成吧,首先进入 /user/hadoop/hadoop-3.3.1/etc/hadoop/目录

在这里插入图片描述

这样的文件修改不同于VI而类似于windows系统的记事本。

复制粘贴都用鼠标就可以了。保存是ctrl+s

8.5.1 hadoop-env.sh修改

打开hadoop-env.sh

在文件最后添加:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64
export HADOOP_HOME=/user/hadoop/hadoop-3.3.1
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"

其中JAVA_HOMEHADOOP_HOME请根据自己情况来写。

8.5.2 core-site.xml修改

在这里插入图片描述

打开core-site.xml

<configuration></configuration>之间输入下面的内容:

    <property>
        <name>hadoop.tmp.dir</name>
        <value>/user/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://192.168.64.60:9000/</value>
    </property>

在这里插入图片描述

根据自己情况修改value标签内的内容。

8.5.3 hdfs-site.xml修改

打开hdfs-site.xml

在最后加入以下内容:

<configuration>
<property>
      <name>yarn.resourcemanager.admin.address</name>
      <value>192.168.64.60:9001</value>
  </property>
  <property>
   <name>dfs.name.dir</name>
     <value>/user/hadoop/dfs/name</value>
     <description>Path on the local filesystem where theNameNode stores the namespace and transactions logs persistently.</description>
  </property>
  <property>
     <name>dfs.data.dir</name>
     <value>/user/hadoop/dfs/data</value>
   <description>Comma separated list of paths on the localfilesystem of a DataNode where it should store its blocks.</description>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
      <name>dfs.permissions</name>
      <value>false</value>
      <description>need not permissions</description>
  </property>
</configuration>

上面内容提供了<configuration></configuration>,把之前的删了就好了。

还是把value标签自己改了。

8.5.4 yarn-site.xml修改

打开yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
<property>
        <description>The address of the applications manager interface in the RM.</description>
        <name>yarn.resourcemanager.address</name>
        <value>192.168.64.60:8032</value>
   </property>
   <property>
        <description>The address of the scheduler interface.</description>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>192.168.64.60:8030</value>
   </property>
   <property>
        <description>The http address of the RM web application.</description>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>192.168.64.60:8088</value>
   </property>
   <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>192.168.64.60:8031</value>
   </property>
   <property>
        <description>The address of the RM admin interface.</description>
        <name>yarn.resourcemanager.admin.address</name>
        <value>192.168.64.60:8033</value>
   </property>
   <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
   </property>
   <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
   </property>
   <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>2048</value>
        <discription>every node memery size(MB) default is 8182MB</discription>
   </property>
   <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
   </property>
   <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
   </property>
</configuration>

修改value的IP地址。

8.5.5 mapred-site.xml修改

打开mapred-site.xml

<configuration>
   <property>
     <name>mapred.job.tracker</name>
     <value>192.168.64.60:49001</value>
  </property>
  <property>
     <name>mapred.local.dir</name>
     <value>/user/hadoop/var</value>
  </property>
  <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
  </property>
</configuration>

修改value中的ip及位置。

8.5.6 workers修改

打开workers

Slave1-60
Slave2-60

把两个从节点的主机名或者IP存进去。
最后输入hdfs如果没有ERROR就是成功;如果失败根据提示来看什么变量设置错误了,再改包括.bashrc在内的配置文件。注意hdfs指令可以使用只能代表你的Hadoop路径和JAVA_HOME设置成功,不代表一定能运行Hadoop,还得看配置文件是否正确。

8.6 分享主机配置文件

/user/hadoop/hadoop-3.3.1/etc/hadoop/目录下打开终端。

之前已经设置了SSH免密登录,现在就派到用场了(当然这不是主要的),我可以直接把主机的文件分享到从机上。

直接复制以下指令到终端(鼠标中键),其中需要修改的是Slave1-60(改为自己的从机主机名或ip),后面的是存放在从机的地址(必须先在从机上完成8.1-8.4保证从机有这个目录)。

scp hadoop-env.sh root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp core-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp hdfs-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp mapred-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp yarn-site.xml root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp workers root@Slave1-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/

如果配置错误了需要修改,直接重新键入指令就可以了,会自动覆盖。

然后再传递给从机2一份:

scp hadoop-env.sh root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp core-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp hdfs-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp mapred-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp yarn-site.xml root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/
scp workers root@Slave2-60:/user/hadoop/hadoop-3.3.1/etc/hadoop/

8.7 格式化Hadoop

该操作需要重复三次(实验需要一个Master两个Slave……)

在每台虚拟机上都使用终端输入指令hdfs namenode -format

如果失败请查看自己的配置文件是否全部修改正确!Hadoop地址、JAVA_HOME之类的请仔细对照自己的实际情况!

如果成功,会出现以下界面:

在这里插入图片描述

所有的机器都完成了初始化之后进行下一步。

8.8 启动Hadoop

进入/user/hadoop/hadoop-3.3.1/sbin目录(如果自己能搞明白自己在什么目录完全可以自己掌控,以下的操作完全可以 在~路径下./user/hadoop/hadoop-3.3.1/sbin/start-all.sh)

在sbin目录下右键进入终端,使用指令./start-all.sh启动Hadoop

8.9 验证是否完成

在终端使用输入jps,如果显示bash: jps: command not found...,就使用指令yum install -y java-1.8.0-openjdk-devel。如果仍然不成功,看一下配置文件的IP和路径是不是与自己的匹配。

如果在主机使用jps可以看到如下进程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-klChZqkf-1680265800510)(C:\Users\dell\Documents\ShareX\Screenshots\2023-03\PotPlayerMini64_xGY3fjBDpa.png)]

并且在两个从机使用jps可以看到如下进程:

在这里插入图片描述

就说明完成了任务。

8.10 浏览器查看集群

操作在主机上

此时通过浏览器访问192.168.64.60:9870来查看(主机的主机名或IP:9870)。

在这里插入图片描述

8.11 ★解决浏览器无法查看集群

可以尝试使用192.168.64.60:50070,Hadoop2.x使用的是50070端口。

如果还不行,看看防火墙是否关闭。一定是jps都显示上述的进程该网页才会生效。

8.12 ★虚拟机拖拽文件

需要安装VMware Tools,具体怎么做不多做说明,安装完成就能直接传输文件了。

往虚拟机中拖文件可能会报错,点一下重试就好了。

8.13 ★解决Hadoop集群部署不成功

一般来说就是没有datanode或者namenode之类的问题,常见于是复制别人的文件、重新装了一遍Hadoop。
有两种情况:
一种是你的配置文件有问题,IP或者自己的Hadoop路径没有写对(认真核查!一个字母错误都可能导致无法成功!),找到错误然后重新分享(参照8.6)

另外一种情况是有旧的信息还在虚拟机上,这种情况按照以下方法来解决:
之前我们创建了下面的几个目录

mkdir  /user/hadoop
mkdir  /user/hadoop/tmp
mkdir  /user/hadoop/var
mkdir  /user/hadoop/dfs
mkdir  /user/hadoop/dfs/name
mkdir  /user/hadoop/dfs/data

把三台虚拟机上/user/hadoop目录中的 tmpvardfs(不包括name和data)、dfs/namedfs/data里面的内容全部清除,也就是说保持最初的状态,这一步是为了清空之前初始化产生的一些信息数据。
再重新在三台虚拟机上格式化Hadoop(参照8.7)。

9. Eclipse访问Hadoop

9.1 下载Eclipse

在官网下载:Eclipse IDE for Java Developers,选择Linux x86_64。

在这里插入图片描述

这个只需要拖到主机Master上就可以了。

有了上面的经验,把这个压缩包拖到/opt目录下应该不成问题。

之后在/opt目录下打开终端,使用解压指令tar zxvf eclipse-java-2023-03-R-linux-gtk-x86_64.tar.gz,这时候会有一个eclipse文件被解压到/opt

点击(或者指令)进入/opt/eclipse,然后在该文件下打开终端,使用指令ln -s /opt/eclipse/eclipse /usr/bin/eclipse,此时再去/usr/bin目录下将eclipse拖到桌面即可。

在这里插入图片描述

现在直接点击eclipse就可以使用了,打开使用的时候什么都不要改!默认的工作空间也没有必要改,直接进入。

9.2 配置eclipse

下载hadoop-eclipse-plugin-3.3.1,不需要解压放在/opt/eclipse路径下的dropinsplugins中。

打开eclipse,在菜单栏选择Window->Preferences

在这里插入图片描述

然后在左侧选择Hadoop Map/Reduce,选择Hadoop的安装路径(按照自己的来)
在这里插入图片描述

最后Apply and Close

之后在菜单栏选择Window->Show View->Other

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJYF1arQ-1680265800512)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20230331150019504.png)]

选择MapReduce Tools->Map/Reduce Locations,点击Open

在这里插入图片描述

9.3 eclipse连接Hadoop

此时,会发现右上角出现大象(如果没有点击左侧第一个摁扭,里面可以打开),点击一下,下面会出现大象和+。

在这里插入图片描述

点击下面的大象和+

在这里插入图片描述

按照上图设置一下,点击Finish,下面会出现一条信息。这个大象双击以后会报错,不影响后面的操作,不需要理会配置好自己的ip即可。

在这里插入图片描述

以及左侧项目栏会出一个DFS Locations

在这里插入图片描述

如果这里的Hadoop(刚才起的名字),点击可以显示文件夹,就说明连接成功反之会有一段错误代码。

9.4 ★解决eclipse连接Hadoop失败

确认每一台虚拟机都能上网,并且主机启动了start-all.sh

不能上网请参考之前的内容。

9.5 ★解决没有Hadoop Map/Reduce选项

在9.2出现找不到这个选项的情况下,如果确定自己把hadoop-eclipse-plugin放进了文件中,并且没有解压这个文件,可以用低版本的hadoop-eclipse-plugin试一下,如hadoop-eclipse-plugin-2.xx,之类的。一般问题可以解决。

10. MapReduce模型

10.1 在Hadoop集群创建文件

直接在主机终端使用指令

hadoop fs -mkdir /tmp
hadoop fs -chmod -R 777 /tmp

可以在eclipse中看到多出来的tmp目录。

在这里插入图片描述
如果找不到项目栏可以参考10.8解决。

10.2 创建Map/Reduce项目

新建一个项目

在这里插入图片描述

然后选择Map/Reduce Project,点击Next

在这里插入图片描述

随便起名比如WORDCOUNT。

在src目录下直接创建一个Class类,类名是WordCount,弄个包也行无所谓。

在这里插入图片描述

然后把代码复制进去:

package wordcount;

import java.io.IOException;
import java.util.StringTokenizer;
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 WordCountMapper 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 {
			StringTokenizer itr = new StringTokenizer(value.toString());
			while (itr.hasMoreTokens()) {//
				word.set(itr.nextToken());
				context.write(word, one);
			}
		}
	}
	public static class WordCountReducer 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();
		if (args.length != 2) {
			System.err.println("Usage: <in> <out>");
			System.exit(2); 
		}
		Job job = Job.getInstance(conf, "word count");
		job.setJarByClass(WordCount.class);
		job.setMapperClass(WordCountMapper.class);
		job.setCombinerClass(WordCountReducer.class);
		job.setReducerClass(WordCountReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

如果连接成功了,那么上面的代码不会有错误,如果有错误一定是没有成功连接Hadoop。

下面是此时的状态

在这里插入图片描述

10.3 运行代码

这是一个命令行输入的代码,因此我们的先设置参数。

菜单上选择Run->Run Configurations...

在这里插入图片描述

然后选择程序,在Arguments中输入参数:

第一个是input01,同时在项目下创建一个input01.txt来存输入,与src同级!注意是同级不是在src里。

第二个是hdfs://192.168.64.60:9000/tmp/output_01,这个要按照自己的Master的ip来设置,输出在/tmp/output_02文件里,这个文件会自动生成,并且如果已经存在了,就不能成功运行。

在这里插入图片描述

10.4 ★解决不能运行(爆红的几种情况)

如果java代码爆红,先确定主机已经启动sbin目录下的start-all.sh了,并且可以在DFS Locations下找到tmp目录。此时如果org.apache.xxx一片红色,删了这个项目重新创建一个试一下。(还不行就把所有虚拟机重开,然后start-all然后再重新创建一个项目)
在这里插入图片描述

如果说output文件已经存在(already exists),在命令行中换一个名字,或者删掉之前的输出文件。如果在DFS Locations中的tmp下没有文件,就右键刷新(Refresh)一下。
请添加图片描述

如果是不影响运行的警告:

在这里插入图片描述
可以右键src,选择New->Other->General->File
在这里插入图片描述

文件名是:log4j.properties

文件内容是:

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

10.5 运行结果

我们的程序是计算单词出现了几次。

在input01文件中写入输入的内容。

在这里插入图片描述

然后运行代码,右键刷新一下tmp目录

在这里插入图片描述

然后就会神奇的发现结果已经在目录里了。没有问题!

在这里插入图片描述

10.6 ★解决Map+Reduce方法二次编程

单独写出来是因为报告中最后两条是要写这两个东西,实际上就是上述代码的两个函数:

Mapper

public static class WordCountMapper 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 {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            context.write(word, one);
        }
    }
}

Reducer

public static class WordCountReducer 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);
    }
}

10.7 ★解决运行后有目录但没有结果文件

一般是没有把从机打开,打开从机重新启动一下eclipse基本上就能解决问题,注意重新试验的时候把之前产生的目录(文件夹)删除,不然会报错的。

10.8 ★解决找不到项目栏的问题

首先可以继续向下,新建一个项目就会显示项目栏。
如果还是找不到,可以在上面菜单栏中选择window->Show View->Project Explorer,点击一下就会显示项目栏。

10.9 ★解决在网页查看output文件

确保已经成功运行程序,在tmp目录下生成了文件。
首先打开集群部署页面自己的ip:9870(或者50070),点击Utilities->Browse the file system
在这里插入图片描述
进去就可以发现之前已经创建的tmp文件,点击打开。
在这里插入图片描述
然后就可以看到生成时间如下,以及成功的记录文件,点击结果文件即可。
在这里插入图片描述
点击Head the file就可以查看内容。
在这里插入图片描述

后记

在同学对照博客做这一次实验的过程中,也遇到一些问题,我也把新的问题和解决的方法更新到了博客里,这篇博客不断地完善也算是能解决很大一部分问题了。
我在不断出错、解决错误中大概用了四天多的时间去完成了这个实验,又用了一天的时间把实验的内容记录下来做成博客——当然还是有瑕疵的,但相比于寥寥无几的材料已经很不错了。同学对照着博客基本上用了一天时间就完成了全部的内容,这也算是达成了目的吧(省点时间做想做的事情),希望大家也能贡献出自己的光和热。
很感谢我的同学对这篇博客提出的意见以及使用时帮我勘误,因为有了这些帮助使得这篇博客趋于完善,革命尚未成功,同志还需努力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/13647.html

如若内容造成侵权/违法违规/事实不符,请联系三亩地网进行投诉反馈,一经查实,立即删除!

相关文章

遇到Spring事务失效,你该怎么办?

Spring 事务场景失效是一个常见的问题。今天来分析这个问题。 1、事务方法被final、static关键字修饰&#xff0c;方法访问权限不是public Service public class UserService {Autowiredprivate UserDao userDao;// final修饰的事务方法Transactionalpublic final void addUse…

技术干货|直流电源自动测试系统功能介绍

直流电源是一种将交流电转换为恒定电压或电流输出的电子设备。在实际生产生活中&#xff0c;直流电源被广泛应用于各种场合。但由于各种原因&#xff0c;包括工艺、质量等因素&#xff0c;直流电源存在一定的出厂偏差。为了确保直流电源的精度和稳定性&#xff0c;在生产过程中…

如何将模块加载到linux内核

一 顺利的情况 假设存在一个文件叫mymq.c,下该文件相同目录下的makefile如下语句&#xff1a; obj-y mymq.o 然后编译&#xff1a;编译完成了以后&#xff0c;mymq.c文件中&#xff0c;有个函数叫mymq_open,搜索这个函数在不在System.map文件中&#xff0c;如果在&#xff…

开放式耳机真的比封闭式强很多吗?推荐几款主流的开放式耳机

​开放式耳机&#xff0c;顾名思义&#xff0c;就是通过骨头振动来传导声音的耳机。相比于传统耳机&#xff0c;它的声音传输更加开放&#xff0c;不会对耳膜造成压迫感&#xff0c;也不会对耳膜旁的内毛细胞造成损害。因此开放式耳机既是运动蓝牙耳机&#xff0c;又是音乐蓝牙…

Spring依赖注入的三种方式使用及优缺点

初学Spring的时候,我们从Spring容器中获取Bean对象都是通过bean标签先将Bean对象注册到Spring容器中&#xff0c;然后通过上下文对象congtext的getBean方法进行获取&#xff0c;显然这种方法较为麻烦&#xff0c;所以有了更简单的存方法&#xff1a;五大类注解&#xff1b;取方…

在Linux中进行Jenkins-2.190的安装及使用

Jenkins-2.190安装在公网IP为x.x.x.x的服务器上 环境准备 第一步&#xff0c;下载server-jre-8u202-linux-x64.tar.gz安装包。 登录地址&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html下载server-jre-8u202-linux-x64.tar.gz…

3自由度并联绘图机器人实现写字功能(一)

1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能。 2. 电子硬件 在这个示例中&#xff0c;采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板Bigfish2.1扩展板电池7.4V锂电池 3. 功能…

能量密度的必要性:城市比乡村具有更高的能量密度

文章目录 引言I 人口密度1.1 人口密度太低对于经济的发展的不利因素1.2 足够的人口密度带来的好处1.3 乌鲁克城II 农耕文明和商业文明2.1 农耕文明2.2 商业文明III 有效掌握动力的文明处于优势3.1 苏美尔人- 轮子&风能的利用3.2 英国人- 以蒸汽机为代表的工业革命引言 文明…

作业3综合练习

综合练习: 要求&#xff1a;请给openlab搭建web网站 网站需求: 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个子界面分别显示学生信息,教学资料和缴费网站,基于www.openlab.com/student #更改配置文件 &#xff08;虚拟主机标签…

2023好玩的解压游戏,压力大点开玩可以放松自己

你是不是经常感觉到压力大&#xff1f; 现代社会&#xff0c;竞争逐步激烈&#xff0c;不管是来自学习上&#xff0c;工作上&#xff0c;还是生活上的&#xff0c;压力都非常大&#xff01; 这时候&#xff0c;我们要学会自我减压&#xff0c;有效的放松是为了更好地前行。 …

新互联网人必学-产品经理课无密为伊消得人憔悴

新互联网人必学-产品经理课 download&#xff1a;https://www.666xit.com/3832/ 产品经理&#xff1a;连接用户需求和产品设计的重要角色 随着移动互联网的迅猛发展&#xff0c;产品经理已成为越来越多IT公司中不可或缺的职位。作为一名产品经理&#xff0c;他所扮演的角色是…

如何使用DNS实现融合CDN功能

将托管DNS解决方案与CDN配对可为您的网站提供额外的性能、可靠性和灵活性。 域名系统&#xff08;DNS&#xff09;是一种用于计算机、服务或连接到Internet或专用网络的任何资源的分层分布式命名系统&#xff0c;它将各种信息与分配给每个参与实体的域名相关联&#xff0c;它基…

【LeetCode】剑指 Offer 66. 构建乘积数组 p312 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/gou-jian-cheng-ji-shu-zu-lcof/ 1. 题目介绍&#xff08;66. 构建乘积数组&#xff09; 给定一个数组 A[0,1,…,n-1]&#xff0c;请构建一个数组 B[0,1,…,n-1]&#xff0c;其中 B[i] 的值是数组 A 中除了下标 i 以外的元素…

System V 共享内存

System V 共享内存 共享内存是什么如何使用共享内存ftokshmgetshmatshmdtshmctl 共享内存的原理共享内存实现两个进程间通信共享内存的特点共享内存与管道配合使用两个进程间通信多个进程间通信 共享内存是什么 &#x1f680;共享内存是最快的IPC形式。一旦这样的内存映射到共…

网络工程师的水平检测1

水平测试 文章目录 水平测试填空题&#xff08;11分&#xff09;判断题&#xff08;9分&#xff09;选择题&#xff08;8分&#xff09;简答题&#xff08;26分&#xff09;子网划分&#xff08;24分&#xff09;实验拓扑&#xff08;19分&#xff09;填空题&#xff08;5分&am…

【MySQL】数据库完整性和安全性

目录 一、完整性 1.概念 2.sql语言支持的两种约束 2.1静态约束 撤销追加约束 断言 2.3动态约束 触发器 二、安全性 用DBMS对数据库实现的两个特性 一、完整性 1.概念 指dbms保证的db的一种特性&#xff0c;在任何情况下的正确性、有效性、一致性 原理图 广义完整性&…

园区路线地图指引图怎么画?园区地图三维图怎么画?

目前在园区信息化应用形式中&#xff0c;广泛缺乏专业电子地图的使用&#xff0c;因此&#xff0c;使这种高效的信息化工具的应用受到了很大限制。有些仅以图片代替&#xff0c;但图片没有空间计算、检索、路径设计的能力&#xff0c;在地图应用形式中&#xff0c;使用价值很低…

Day953.以假设驱动为指引 -遗留系统现代化实战

以假设驱动为指引 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于以假设驱动为指引的内容。 很多人在做遗留系统现代化的时候呢&#xff0c;总觉得它是一个十分复杂的技术问题。 本来嘛&#xff0c;无论是代码的重构、架构的拆分&#xff0c;还是 DevOps 平台的搭…

除了学历,你更需要有能力

遥想当年&#xff0c;家里培养出一个大学生&#xff0c;是多荣耀的事&#xff01;可现今却处于一个比较尴尬的状态。 为什么大学生贬值得这么厉害&#xff1f;其实大学生之所以会不值钱不外乎三大原因&#xff1a;量大、与企业需求不匹配、质量差。 高校扩招下&#xff0c;大…

Python每日一练(20230423)

目录 1. 删除链表的倒数第 N 个结点 &#x1f31f;&#x1f31f; 2. 最小覆盖子串 &#x1f31f;&#x1f31f;&#x1f31f; 3. 二叉树的层序遍历 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏…
推荐文章