在Hyper-V中运行Ubuntu以及安装Hadoop(下)

Author Avatar
EmptinessBoy 10月 09, 2020
  • 在其它设备中阅读本文章

安装并运行 Hadoop

继上一篇,我们已经完成了在 Hyper-V 下的 Ubuntu 部署,接下来就可以准备安装 Hadoop 啦。为了防止出错以及意外导致之前的数据丢失,我在本次操作前特地为虚拟机创建了一个还原点,使用其他虚拟机软件的宝贝们可以点击里面的创建快照选项。其原理不同,但起到的效果是差不多的。

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

使用 useradd 命令添加一个名为 hadoop 的用户以方便我们的后续操作。这里先使用有密码的用户来测试。

useradd hadoop

-2020-10-09-145530.png

测试密码可以正常登录后,我们生成 ssh_key 使用密钥来进行登录。

加入 sudoers

为了方便操作,我们赋予 hadoop 用户 sudo 权限。

第一步:修改/etc/sudoers文件权限为读写权限 chmod +x /etc/sudoers

第二步:修改/etc/sudoers文件内容,执行 visudo 或者 vim /etc/sudoers

-2020-10-09-182208.png

在文件中加入下列代码:

hadoop  ALL=(ALL)   NOPASSWD:ALL

这时,当我们使用 hadoop 用户登录服务器的时候,执行 sudo 命令,就不需要在输入 root 密码了!

生成 ssh 私钥

# 这一步是生成RSA私钥
$ cd .ssh
$ ssh-keygen -t ras

-2020-10-09-150048.png

生成公钥并保存

authorized_keys 是linux 操作系统下,专门用来存放公钥的地方,只要公钥放到了服务器的正确位置,并且拥有正确的权限,你才可以通过你的私钥,免密登录linux服务器

这一步执行生成公钥的命令

$ cat ./id_rsa.pub >> ./authorized_keys

-2020-10-09-150228.png

到这一步,Hadoop 用户登陆时执行 ssh localhost 已经不需要输入密码了。

安装 openJDK 8

Hadoop 是基于 Java 语言开发的,所以需要安装 JDK 环境,首先需要根据官方的说明安装适合 Hadoop 使用的 JDK。

官网对于 JDK 版本的说明:https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions

-2020-10-10-092045.png

可以看到 Hadoop 2.x 的版本是使用 java7 开发的,但可以运行在 java7 和 java8 上,而 hadoop 3.x 是使用 Java8 开发的,可以运行在 Java8 和 Java11 上,但若要编译,只能使用 Java8

所以,安装 jdk8 是最稳妥的方案啦!

# apt-get install openjdk-8-jdk openjdk-8-jre

2020-10-09-152706-1.png

配置 JAVA_HOME 环境变量

到此为止 apt 包管理器已经帮我们一键安装 java8 了。但是想要运行 hadoop 的话,还需要配置 $JAVA_HOME 环境变量。

dpkg -l 命令会列出系统中所有已安装的软件包信息。结合grep,可以过滤出自己想要的内容。

# 先找到java8的安装路径

root@huxiaofan-ubuntu:~# dpkg -L openjdk-8-jdk | grep 'bin'
/usr/lib/jvm/java-8-openjdk-amd64/bin
/usr/lib/jvm/java-8-openjdk-amd64/bin/appletviewer
/usr/lib/jvm/java-8-openjdk-amd64/bin/jconsole

root@huxiaofan-ubuntu:~# /usr/lib/jvm/java-8-openjdk-amd64/bin/java -version
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-8u265-b01-0ubuntu2~20.04-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)

这一步可以看到在我虚拟机上 Java8 的 bin 路径在 /usr/lib/jvm/java-8-openjdk-amd64/bin

-2020-10-09-153615.png

配置环境变量我们有三种方法:

方法一:export PATH

root@huxiaofan-ubuntu:~# export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

root@huxiaofan-ubuntu:~# echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64/

由于这是一种临时的变量导入方法,重启就失效,所以这里不采取这种方式。

方法二:修改 .bashrc 或 .bash_profile

通过修改用户目录下的~/.bashrc文件进行配置:

hadoop@huxiaofan-ubuntu:~$ vim .bash_profile

# 然后在后面追加一行
# export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

hadoop@huxiaofan-ubuntu:~$ source .bash_profile 
hadoop@huxiaofan-ubuntu:~$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64/

这种方法永久有效且仅对当前用户有效。

方法三:修改 /etc/profile

这种方法永久有效,且对所有用户有效,这里我最终采用的是这个方式

vim  /etc/profile

-2020-10-09-162242.png

保存后重启虚拟机,然后输入命令 export 来查看现有的环境变量:

-2020-10-09-162505.png

这里已经可以看到 JAVA_HOME 了。而且重启和更换用户登录都会有效。至此,Hadoop 运行所需的 Java 环境已经搭建完成。

下载安装 Hadoop

下载镜像

由于直接下载原始仓库较慢,在 Hadoop 官网,可以看到有三个国内的镜像站可以为我们提供快速的下载。分别是北京外国语大学,清华大学和北京理工的镜像站。

-2020-10-10-131714.png

因为 Hadoop 是开箱即用的,我们只要从中下载 hadoop 的压缩包,在有 Java 运行环境的平台上就可以直接运行了。

我使用了 wget 工具进行安装包的下载。如果没有 wget,可以使用 apt-get install wget -y 先安装 wget

# 我下载的是3.3.0版本

$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz

-2020-10-09-160040.png

解压安装

下载完成后,使用 tar 命令进行解压缩。并将解压得到的 hadoop3.3.0 文件夹移动到 Linux 默认的软件安装位置 /usr/local/ 目录下。

$ tar -zxf hadoop-3.3.0.tar.gz

root@huxiaofan-ubuntu:/home/hadoop# mv hadoop-3.3.0 /usr/local/hadoop
root@huxiaofan-ubuntu:/home/hadoop# ls /usr/local
bin  etc  games  hadoop  include  lib  man  sbin  share  src
root@huxiaofan-ubuntu:/home/hadoop# ls /usr/local -lah
总用量 44K
drwxr-xr-x 11 root   root   4.0K 十月    9 16:07 .
drwxr-xr-x 14 root   root   4.0K 八月    1 00:28 ..
drwxr-xr-x 10 hadoop hadoop 4.0K 七月    7 03:50 hadoop

-2020-10-09-160802.png

到这里,单机模式的 hadoop 已经可以开箱即用啦!

我们运行下 hadoop version 查看下当前 hadoop 的版本信息:

-2020-10-09-162712.png

伪分布式模式配置

准备工作:

因为在集群环境下,即使系统已经正确地配置了JAVA_HOME,也可能会出现找不到 JAVA_HOME 的错误,所以这里为防止出错,先在 hadoop-env.sh 中,再显示地重新声明一遍 JAVA_HOME

cd /usr/local/hadoop/etc/hadoop/
vim hadoop-env.sh

hadoop@huxiaofan-ubuntu:/usr/local/hadoop$ ls
bin  include  libexec          licenses-binary  NOTICE-binary  README.txt  share
etc  lib      LICENSE-binary  LICENSE.txt      NOTICE.txt     sbin
hadoop@huxiaofan-ubuntu:/usr/local/hadoop$ find . -name "hadoop-env.sh"
./etc/hadoop/hadoop-env.sh
hadoop@huxiaofan-ubuntu:/usr/local/hadoop$ vim ./etc/hadoop/hadoop-env.sh

在配置文件中加入 export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

-2020-10-09-163425.png

配置 core-site.xml

core-site.xml 位于 /usr/local/hadoop/etc/hadoop

初始内容:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

</configuration>

这里使用 vim 命令直接编辑:

-2020-10-09-180837.png

完整配置:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <!-- 用于保存临时文件 -->
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <!-- 指定 HDFS 的访问地址 -->
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

配置 hdfs-site.xml

hdfs-site.xml 位于 /usr/local/hadoop/etc/hadoop

初始内容:

默认的初始内容和 core-site.xml 是一样的,默认为空白。这里使用 vim 命令直接编辑:

-2020-10-09-181724.png

完整配置:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <!--指定HDFS副本数量-->
        <!-- 伪分布式只有一个节点,所以只有一个副本 -->
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <!-- 设定 DFS 名称节点的元数据保存目录 -->
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <!-- 设定数据节点的数据保存目录 -->
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

Tips

Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。

此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(官方教程如此),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。

执行名称节点格式化

cd /usr/local/hadoop/
./bin/hdfs namenode -format 

成功的话,会看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若为 “Exitting with status 1” 则是出错。

-2020-10-09-182439.png

试启动 Hadoop

Hadoop 的启动脚本位于 /usr/local/hadoop/sbin 下,启动只需要 ```bash /sbin/start-dfs.sh`` 即可

同理要停止 hadoop 的话,只需要执行 bash /sbin/stop-dfs.sh 或者 bash /sbin/stop-all.sh

hadoop@huxiaofan-ubuntu:/usr/local/hadoop$ bash /sbin/start-dfs.sh

脚本执行完成后,可以输入命令 jps 来查看 DataNode,NameNode,SecondaryNameNode 有没有正常启动。

-2020-10-09-182724.png

如图没有任何错误输出,说明启动成功。

查看 HDFS WEB 界面

hadoop3.3 之巨坑

在做完这一切后,按照教科书的说明,我尝试着用 curl 命令访问内网的 50070 端口

root@huxiaofan-ubuntu:/home/hadoop# curl -v 127.0.0.1:50070
* About to connect() to 127.0.0.1 port 50070 (#0)
*   Trying 127.0.0.1...
* Connection refused
* Failed connect to 127.0.0.1:50070; Connection refused
* Closing connection 0
curl: (7) Failed connect to 127.0.0.1:50070; Connection refused

使用 lsof -i:50070 查看端口监听情况,发现没有任何进程使用 50070 端口,可是此时 hadoop 应该已经启动了来着。

于是乎

一通百度。。

按照百度尝试编辑配置文件 hdfs-site.xml 增加这一段内容:

<property>
    <name>dfs.namenode.http.address</name>
    <value>0.0.0.0:50070</value>
</property>

结果没有任何作用。

直到我 Google 一下发现:

hadoopprot.png

原来是 Hadoop 3.x 版本把 NameNode 原先的50070端口 变成 9870了!!!

赶紧在防火墙放行 9870

iptables -I INPUT -p tcp --dport 9870 -j ACCEPT
service iptables restart

现在,使用物理机的浏览器访问虚拟机的 IP 地址 http://192.168.137.100:9870 果然看到 HDFS 的 web 界面了。

-2020-10-09-190839.png

至此 Hadoop 学习的环境搭建完毕。

完整配置文件

hadoop-env.sh

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

# HADOOP
export  HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export  HADOOP_HOME=/usr/local/hadoop
export  HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"

core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

/etc/profile

# JAVA_HOME
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/

# HADOOP BIN
export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hbase/bin

# HADOOP
export  HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export  HADOOP_HOME=/usr/local/hadoop
export  HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_COMMON_LIB_NATIVE_DIR"
尾图4

This blog is under a CC BY-NC-ND 4.0 Unported License
本文链接:https://coding.emptinessboy.com/2020/10/%E5%9C%A8Hyper-V%E4%B8%AD%E8%BF%90%E8%A1%8CUbuntu%E4%BB%A5%E5%8F%8A%E5%AE%89%E8%A3%85Hadoop%EF%BC%88%E4%B8%8B%EF%BC%89/