在Hyper-V中运行Ubuntu以及安装Hadoop(下)
安装并运行 Hadoop
继上一篇,我们已经完成了在 Hyper-V 下的 Ubuntu 部署,接下来就可以准备安装 Hadoop 啦。为了防止出错以及意外导致之前的数据丢失,我在本次操作前特地为虚拟机创建了一个还原点,使用其他虚拟机软件的宝贝们可以点击里面的创建快照选项。其原理不同,但起到的效果是差不多的。
创建 hadoop 用户,并配置免密登录
使用 useradd 命令添加一个名为 hadoop 的用户以方便我们的后续操作。这里先使用有密码的用户来测试。
useradd hadoop
测试密码可以正常登录后,我们生成 ssh_key 使用密钥来进行登录。
加入 sudoers
为了方便操作,我们赋予 hadoop 用户 sudo 权限。
第一步:修改/etc/sudoers文件权限为读写权限 chmod +x /etc/sudoers
第二步:修改/etc/sudoers文件内容,执行 visudo 或者 vim /etc/sudoers
在文件中加入下列代码:
hadoop ALL=(ALL) NOPASSWD:ALL
这时,当我们使用 hadoop 用户登录服务器的时候,执行 sudo 命令,就不需要在输入 root 密码了!
生成 ssh 私钥
# 这一步是生成RSA私钥
$ cd .ssh
$ ssh-keygen -t ras
生成公钥并保存
authorized_keys 是linux 操作系统下,专门用来存放公钥的地方,只要公钥放到了服务器的正确位置,并且拥有正确的权限,你才可以通过你的私钥,免密登录linux服务器
这一步执行生成公钥的命令
$ cat ./id_rsa.pub >> ./authorized_keys
到这一步,Hadoop 用户登陆时执行 ssh localhost
已经不需要输入密码了。
安装 openJDK 8
Hadoop 是基于 Java 语言开发的,所以需要安装 JDK 环境,首先需要根据官方的说明安装适合 Hadoop 使用的 JDK。
官网对于 JDK 版本的说明:https://cwiki.apache.org/confluence/display/HADOOP/Hadoop+Java+Versions
可以看到 Hadoop 2.x 的版本是使用 java7 开发的,但可以运行在 java7 和 java8 上,而 hadoop 3.x 是使用 Java8 开发的,可以运行在 Java8 和 Java11 上,但若要编译,只能使用 Java8
所以,安装 jdk8 是最稳妥的方案啦!
# apt-get install openjdk-8-jdk openjdk-8-jre
配置 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
配置环境变量我们有三种方法:
方法一: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
保存后重启虚拟机,然后输入命令 export
来查看现有的环境变量:
这里已经可以看到 JAVA_HOME 了。而且重启和更换用户登录都会有效。至此,Hadoop 运行所需的 Java 环境已经搭建完成。
下载安装 Hadoop
下载镜像
由于直接下载原始仓库较慢,在 Hadoop 官网,可以看到有三个国内的镜像站可以为我们提供快速的下载。分别是北京外国语大学,清华大学和北京理工的镜像站。
因为 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
解压安装
下载完成后,使用 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
到这里,单机模式的 hadoop 已经可以开箱即用啦!
我们运行下 hadoop version 查看下当前 hadoop 的版本信息:
伪分布式模式配置
准备工作:
因为在集群环境下,即使系统已经正确地配置了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/
配置 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 命令直接编辑:
完整配置:
<?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 命令直接编辑:
完整配置:
<?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” 则是出错。
试启动 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 有没有正常启动。
如图没有任何错误输出,说明启动成功。
查看 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 一下发现:
原来是 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 界面了。
至此 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"

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/