实验目的

(1)掌握Hadoop的伪分布式安装方法;

(2)理解HDFS在Hadoop体系结构中的角色;

(3)熟练使用HDFS操作常用的Shell命令;

(4)熟悉HDFS操作常用的Java API。

实验环境

操作系统:Linux(Ubuntu 18.04 LTS);

Hadoop版本:Hadoop 3.1.3;

JDK版本:1.8及11;

Java IDE:VSCode。

实验内容与完成情况

1、安装Linux系统(Ubuntu 18.04 LTS)

2、创建hadoop用户

执行

sudo useradd -m hadoop -s /bin/bash


执行

sudo passwd hadoop

 执行

sudo adduser hadoop sudo

3、切换到hadoop用户

执行

sudo su - hadoop

4、更新APT

执行

sudo apt-get update

5、安装SSH,并配置SSH无密码登录

执行

sudo apt-get install openssh-server

显示openssh-server已经是最新版(1:7.6p1-4ubuntu0.4)

执行

ssh localhost

可以看到通过密码认证后,本地SSH登录成功,接下来开始配置SSH免密登录

执行

exit

执行

cd ~/.ssh/

执行

ssh-keygen -t rsa

执行

cat ./id_rsa.pub >> ./authorized_keys

再次执行

ssh localhost

 可以看到,免密登录配置成功,没有出现输入密码的提示界面

6、安装Java环境

下载jdk-8u162-linux-x64.tar.gz

打开

https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html

选择文件并下载

 执行

sudo nautilus

以便以root权限打开文件浏览器

复制文件到/home/Downloads目录下

执行

cd /usr/lib

执行

sudo mkdir jvm

执行

cd ~/Downloads

执行

sudo tar -zxvf ./jdk-8u162-linux-x64.tar.gz -C /usr/lib/jvm

执行

cd /usr/lib/jvm


执行

ls

可以看到,在/usr/lib/jvm目录下存在jdk1.8.0_162目录

执行

cd ~

执行

sudo gedit ~/.bashrc

在文件头添加了hadoop用户的环境变量并保存

执行

source ~/.bashrc

执行

java -version

查看到了安装的Java版本,说明Java已经安装成功

7、安装Hadoop,并检测是否安装成功

打开如下Hadoop官网链接下载Hadoop3.1.3安装文件

https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz

复制文件到/home/Downloads目录下

执行

sudo tar -zxf ~/Downloads/hadoop-3.1.3.tar.gz -C /usr/local

执行

cd /usr/local/

执行

sudo mv ./hadoop-3.1.3/ ./hadoop

执行

sudo chown -R hadoop ./hadoop

执行

cd hadoop

执行

./bin/hadoop version

可以看到正确输出了安装的Hadoop版本信息,说明安装已经成功

8、搭建Hadoop伪分布式环境

编辑配置文件

执行

sudo gedit ./etc/hadoop/core-site.xml

添加配置后保存

执行

sudo gedit ./etc/hadoop/hdfs-site.xml

添加配置后保存

执行

cd /usr/local/hadoop

(由于已经处于该目录下,不重复执行了)

执行

./bin/hdfs namenode -format

输出提示“Storage directory /usr/local/hadoop/tmp/dfs/name has been successfully formatted”可以看到NameNode 的格式化已经成功完成

9、使用hadoop用户登录Linux系统,启动Hadoop,并使用Web界面查看HDFS信息

执行

./sbin/start-dfs.sh

执行

jps

可以看到,列出了“NameNode”、”DataNode” 和 “SecondaryNameNode”进程,说明Hadoop已经成功启动

在Ubuntu虚拟机中的Chromium浏览器中输入http://127.0.0.1:9870/查看WEB界面

可以看到WEB界面正常显示,Hadoop的安装配置到此结束

10、运行Hadoop伪分布式实例

创建用户目录

执行

./bin/hdfs dfs -mkdir -p /user/hadoop

本地新建myLocalFile.txt文件

执行

sudo gedit /home/hadoop/myLocalFile.txt

粘贴相关内容并保存

11、利用Java API与HDFS进行交互

为方便起见,本次实验不使用Eclipse,转而使用VSCode的Remote SSH插件进行远程Java调用和编程

首先,下载并解压JDK11,即

OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz文件

执行

sudo tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz -C /usr/local

 在VirtualBox中设置网络端口转发,将虚拟机的SSH(端口:22)转发到宿主计算机(端口:222)

在Windows系统中的PowerShell下进行测试

PowerShell中执行

ssh hadoop@127.0.0.1 -p 222

可以看到,连接成功,输入hadoop用户的密码后顺利连接到了虚拟机

为使连接过程更加顺畅,在Windows上配置对Linux虚拟机的SSH免密登录

首先,使用已有的公钥,将其添加到/home/Hadoop/.ssh/authorized_keys

保存后使用WinScp进行登录测试

可以看到,登录成功

在VSCode中安装remote SSH插件

添加主机

点击侧边栏,再点击“+”号,输入“ssh hadoop@127.0.0.1 -p 222”并回车确认

随后,选择第一个配置文件

 点击“在新窗口中打开”

出现错误,查看日志中出现提示“Bad owner or permissions”,猜测是如Linux下的.ssh文件夹权限问题,以管理员身份启动VSCode,问题依旧存在,没有得到解决

尝试对Windows用户目录下的.ssh文件夹执行“管理员取得所有权”

随后点击“Retry”

进入界面如下

点击“打开文件夹”,默认选择/home/hadoop,确认即可
随后弹出界面如下

点击“新建文件夹”,输入文件夹名称,此处设置为“HDFS”

随后点击右侧“Welcome”窗口,选择“create a New Project”

在弹出窗口中选择“No build tools”

选择刚刚创建的文件夹“HDFS”

输入项目名称,此处设置为“Hadoop”

弹出窗口如下

点击“Run”

可以看到下方的终端中显示了程序运行的结果,使用VSCode的Java远程开发环境配置完成

随后,改写App.java的内容为实验内容,如下

可以看到,文件中出现大量红色波浪线,点击“Run”后提示错误如下

原因为没有导入项目需要使用的JAR包

点击侧边栏,新建“.vscode”文件夹

在“.vscode”文件夹下继续新建文件“settings.json” 

 

写入如下配置并保存

 

随后,回到App.java文件,再次点击“Run”

可以看到,程序输出了“文件存在”的提示

若修改App.js的“filename”变量的值,如改为

String filename = "wangqiyuan1803/myLocalFile1.txt";

再次点击“Run”,则运行结果如下

说明成功实现了Java API与HDFS的交互,实验内容到此结束

出现的问题与解决方案

1、打开Ubuntu的SSH免密登录后仍需要输入密码

解决方案:为确保连接成功,需要给hadoop用户授予/.ssh文件夹及公钥文件权限,定位到~/.ssh文件夹下,执行chmod 600 authorized_keys和chmod 700 ~/.ssh即可。

2、双击打开的文件浏览器对/home目录没有修改的权限

解决方案:执行sudo nautilus即可以root权限打开文件浏览器,此时操作不再受限,但文件浏览器关闭后需要手动在终端结束进程。

3、Windows系统通过SSH连接Ubuntu时遇到“无法打开连接问题”

解决方案:查看C:\Users\“用户名”\.ssh文件夹的权限,对该文件夹执行“管理员取得所有权”的指令即可。

4、编译Java文件时遇到无法导入包的错误

解决方案:使用的IDE没有默认导入Hadoop的Java API接口所使用的jar包,需要手动在工程的设置中添加(本实验中通过在.vscode文件夹下新建settings.json文件来进行配置)。

5、VSCode编译时报错,找不到Java环境

解决方案:由于VSCode是通过远程连接的方式进行开发,因此需要手动指定Java环境,由于其已不再支持默认的JDK1.8,因此需要手动安装更高版本的JDK,实验中以JDK11为例,解压后再设置相应目录即可。

6、将虚拟机关机后再打开时HDFS不能使用

解决方案:由于HDFS不像OpenStack一样开机自启,因此开机后要手动执行./sbin/start-dfs.sh启动Hadoop。

实验总结

通过本次Hadoop的安装与HDFS基础实验,我进一步熟悉了Ubuntu的基本使用以及Linux系统的各种文件操作指令,对于分布式存储中的重要工具——Hadoop的使用及HDFS的基本操作有了更多的了解。

尽管我先前没有选修大数据课程,但通过详细的安装教程及同学之间的相互交流,我顺利地完成了Hadoop的安装和使用,并通过执行指令从HDFS上增删改查文件,实验达到了预期的效果。

实验中还对Hadoop的Java API进行了基础的操作,这也让我对于Linux的Java开发环境配置、借助Remote SSH的VSCode远程开发及SSH登录验证的相关配置和使用更加熟悉。

本内容为合法授权发布,文章内容为作者独立观点,不代表开发云立场,未经允许不得转载。

CSDN开发云