跳到主要内容

《Hadoop 权威指南》读书笔记第三篇带你一步一步安装 Hadoop

3 STEP BY STEP - Apache Hadoop 伪分布模式安装手册

全网最详细,最适合像我一样的初学者的 Hadoop 安装手册来啦(

安装环境

腾讯云服务器,Ubuntu 18.04 LTS

准备工作

Docker

为什么要用 Docker?

Docker 采用 Linux 的容器技术实现内外环境隔离。由于 Hadoop 安装复杂,为了避免出现问题,破坏主机环境,所以采用 Docker 来建立容器,在容器内进行 Hadoop 的安装实验。而且,DockerHub 上提供了 官方 OpenJDK 镜像,这样就不需要在主机上配置 Java 环境了。

如何安装 Docker?

参考 Docker 官网提供的教程 https://docs.docker.com/engine/install/ubuntu/ ,按照下列步骤云服务器上安装 Docker:

$ # 安装前置项
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ # 添加 Docker Repo
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt update
$ # 安装 Docker
$ sudo apt install docker-ce docker-ce-cli containerd.io
$ # 启动 Docker 服务
$ sudo systemctl start docker
$ # 将当前用户添加到 docker 用户组
$ usermod -aG docker $(whoami)

完成上述步骤后,为了让用户组生效,输入 exit 断开 SSH 连接并重连。

容器环境配置

下载 OpenJDK 镜像

Dockers 默认会从 DockerHub 官方地址 dockerhub.io 拉取镜像,该地址在国内访问非常慢。为了提高镜像拉取速度,先在主机上配置腾讯云 DockerHub 镜像(虽然找不到官方文档,但它能用。其他云服务商的用户烦请自行查找合适的镜像地址)。在 /etc/docker/daemon.json 中添加如下内容:

{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com" ] }

重启 Docker 服务:

$ sudo systemctl restart docker

此时 DockerHub 镜像应当已经生效,通过 docker info 验证

$ docker info
Registry Mirrors:
https://mirror.ccs.tencentyun.com/

然后使用 docker pull 拉取 Java 8 的 OpenJDK 镜像

$ docker pull openjdk:8
Status: Downloaded newer image for openjdk:8
docker.io/library/openjdk:8

运行 OpenJDK 容器

在服务器上执行命令:

$ mkdir -p ~/hadoop  # 建立 hadoop 目录,后续会把它作为工作目录
$ docker run \
-d --init \
-w /home/$(whoami)/hadoop \
-v /home/$(whoami)/hadoop:/home/$(whoami)/hadoop \
--name hadoop-test openjdk:8 \
tail -f /dev/null

其中:

  • -d --init:使容器在后台正常运行,退出的进程能被正确回收
  • -w /home/$(whoami)/hadoop:设置工作目录
  • -v /home/$(whoami)/hadoop:/home/$(whoami)/hadoop:在容器内外共享 ~/hadoop 目录
  • --name hadoop-test openjdk:8:容器名称 hadoop-test,镜像名称 openjdk:8
  • tail -f /dev/null:令保持容器运行不退出的命令

容器环境配置

需要进行以下操作:

  1. 配置容器内的用户,使其与外部用户一致

    原因为 Hadoop 不允许以 root 用户运行。

  2. 配置容器内的 Debian 源镜像

    原因为 OpenJDK 使用的是官方 Debian 源,国内访问速度缓慢。

  3. 配置 SSH 服务以及无密码认证

    原因为伪分布式服务需要 SSH 可以连通本机。对于 Docker 容器来说等价于容器可以使用 SSH 连通本容器。

首先配置用户:

$ # 使用 whoami 获取用户名,使用 id -u 获取用户 UID
$ docker exec hadoop-test \
useradd $(whoami) -u $(id -u) -s /bin/bash
$ # 修改 home 目录的权限为新创建的用户
$ docker exec hadoop-test \
chown $(whoami):$(whoami) /home/$(whoami)

随后在容器内配置腾讯云 Debian 镜像(其他云服务商用户请自行查找对应的源):

$ docker exec hadoop-test \
sed -i -r 's/[a-z]+.debian.org/mirrors.tencentyun.com/' /etc/apt/sources.list

然后安装并启动 SSH 服务:

$ docker exec hadoop-test \
bash -c 'apt update && apt install -y openssh-server && service ssh start'
[ ok ] Starting OpenBSD Secure Shell server: sshd.

一直到这里,我们终于完成了容器的环境配置,可以以普通用户身份进入 hadoop-test 容器了:

$ docker exec -it --user $(whoami) hadoop-test bash

进入后,应该会看到一个类似 username@abcd1234ef56:~/hadoop$ 的命令行,其中 username 是容器外的用户名,abcd1234ef56 是一串随机的容器 ID。

如果还是觉得难以区分不同的 Shell,这里提供一个小技巧,可以在命令行前显示一个标识字符串:

$ # 执行前先使用 exit 退出容器,回到服务器命令行
$ # 在容器内的 /etc/debian_chroot 中写入字符串 my_hadoop
$ echo my_hadoop | docker exec -i hadoop-test tee /etc/debian_chroot

执行完后,再次使用 docker exec -it --user $(whoami) hadoop-test bash 进入容器,可以得到一个类似 (my_hadoop)username@abcd1234ef56:~/hadoop$ 的命令行,这样就很方便区分了。

当然这个技巧只对 Debian 系统有效。

慢着,我们还要配置 SSH 访问,通过下列命令(下面会使用 (my_hadoop) 前缀来区分是服务器上还是容器内执行命令 ):

(my_hadoop) $ ssh-keygen
(my_hadoop) $ # 一路回车,会产生私钥 ~/.ssh/id_rsa 和公钥 ~/.ssh/id_rsa.pub
(my_hadoop) $ # 然后需要对新创建的公钥进行授权
(my_hadoop) $ cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
(my_hadoop) $ # 完成授权,进行测试
(my_hadoop) $ ssh localhost

若成功,应该会进入一个新的 Shell,命令行同样为 (my_hadoop)username@abcd1234ef56:~/hadoop$

至此,通过 OpenJDK 容器来运行 Hadoop 的前置项配置完毕。

安装 Hadoop

下载 Hadoop Release 压缩包

可以从 Apache 官网的 Release 页面下载,当然同样,速度会非常缓慢。这里可以使用 TUNA 镜像BIT 镜像阿里云镜像等。

截至本文发出,最新版本是 v3.3.0,使用 wget 命令下载,使用 tar 命令解压:

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

会在当前目录下产生一个名为 hadoop-3.3.0 的目录:

(my_hadoop) $ cd hadoop-3.3.0
(my_hadoop) $ ls
LICENSE-binary NOTICE-binary README.txt etc lib licenses-binary share
LICENSE.txt NOTICE.txt bin include libexec sbin

配置 Hadoop 运行环境与参数

Shell 环境变量

Hadoop 的正常运行需要环境变量 ${HADOOP_HOME}${JAVA_HOME},同时为了能方便地执行命令,也可以把 hadoop-3.3.0 目录下的 binsbin 目录加入环境变量 ${PATH}

(my_hadoop) $ # 假设现在处于 hadoop-3.3.0 目录下
(my_hadoop) $ export HADOOP_HOME="$(pwd)"
(my_hadoop) $ export PATH="${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${PATH}"

执行 hadoop version 验证 ${PATH} 已经生效:

(my_hadoop) $ hadoop version
Hadoop 3.3.0
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r aa96f1871bfd858f9bac59cf2a81ec470da649af
Compiled by brahma on 2020-07-06T18:44Z
Compiled with protoc 3.7.1
From source with checksum 5dc29b802d6ccd77b262ef9d04d19c4

为了在下次进入容器时可以直接使用上述 Hadoop 环境,可以把上边这两行添加到 ~/.bashrc

(my_hadoop) $ # 假设现在处于 hadoop-3.3.0 目录下
(my_hadoop) $ echo 'export HADOOP_HOME='"'$(pwd)'" >> ~/.bashrc
(my_hadoop) $ echo 'export PATH="${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${PATH}"' >> ~/.bashrc

退出容器并再次进入,直接执行 hadoop version 验证 ~/.bashrc 的改动已经生效:

(my_hadoop) $ exit
$ # 注意这里已经退出到主机环境
$ docker exec -it --user $(whoami) hadoop-test bash
(my_hadoop) $ hadoop version
Hadoop 3.3.0
Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r aa96f1871bfd858f9bac59cf2a81ec470da649af
Compiled by brahma on 2020-07-06T18:44Z
Compiled with protoc 3.7.1
From source with checksum 5dc29b802d6ccd77b262ef9d04d19c4

Hadoop 运行参数

可以根据自身需求在 ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh 中配置供 Hadoop 使用的环境变量。在这里我们暂时所有 HADOOP_ 开头的都使用默认值。

由于 Docker 和 SSH 的一个问题,使用 ssh localhost 命令连接到自身的时候会丢失 ${JAVA_HOME} 环境变量,因此在这里把 ${JAVA_HOME} 写到 hadoop-env.sh 中:

(my_hadoop) $ echo 'export JAVA_HOME='"'${JAVA_HOME}'" >> ${HADOOP_HOME}/etc/hadoop/hadoop-env.sh

Hadoop 配置文件

使用 WinSCP 将配置文件(core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml)上传至 etc/hadoop 目录下

尝试使用

  • 格式化文件系统
hdfs namenode -format
  • 启动和终止守护进程
start-dfs.sh
start-yarn.sh
mapred --daemon start historyserver
  • 创建用户目录
hadoop fs -mkdir -p user/$USER
  • 将本地文件复制到HDFS
hadoop fs -copyFromLocal hadoop-book/input/docs/quangle.txt \ hdfs://localhost/user/username/quangle.txt
  • 将文件复制回本地文件系统并检查是否一致
hadoop fs -copyToLocal quangle.txt quangle.copy.txt
md5sum hadoop-book/input/docs/quangle.txt quangle.copy.txt