0%

基于阿里云 ECS 搭建大数据集群(一)

学习基于阿里云 ECS 云服务器搭建大数据集群的笔记。笔记将搭建步骤和遇到的问题一一记录,用于自己查阅复习,也为小伙伴们提供一定参考帮助。

本篇是笔记的第一部分,从服务器相关的准备工作开始,到 HDFS 伪分布式集群搭建完成为止。

HDFS 伪分布式集群搭建


准备工作

购买阿里云 ECS 服务器

基于阿里云搭建集群,首先自然要购买云服务器。购买过程中有大量可配置的选项,按照提示选择即可。我选择了 4 台双核 4GB 服务器,预装阿里云定制版 Linux 系统。网络部分选择按流量计费。可以在这一步配置好实例和主机名称,后续的管理会更加方便。

好记的主机名称有 master、worker01、worker02,或者 node0、node1、node2 等

选购过程中系统会建议生成并使用 ssh 密钥对。按照提示新建密钥对并妥善下载保存系统提供的 .pem 文件。.pem 文件可以自己命名,我将它命名为 hadoop.pem。我所购买的四台服务器主机名分别为 node00、node01、node02 和 node03。请小伙伴们务必区分笔记和实践中所使用的主机名配置。

也请小伙伴们务必区分所使用的路径

准备软件

Hadoop 基于 Java 语言开发,所以我们需要同时准备 JDK 和 Hadoop 软件包。我使用的版本是 JDK7 和 Hadoop 2.6.5。从 Oracle 和 Hadoop 官网下载软件包。国内的小伙伴可能会遇到下载缓慢的问题。可以尝试翻墙,或连接手机热点下载(有时有奇效!)。下载时须注意软件版本是否与服务器操作系统兼容。将软件包下载到你自己的计算机待用即可。

配置服务器之间的免密码互联

集群运行的过程中不同节点之间需要互相传递数据和指令,因此我们要配置节点之间的免密码互连。

本地连接到 node00

从本地连接到服务器进行远程管理。将上文阿里云提供的 .pem 文件拷贝到本地 ~/.ssh目录下。使用命令chmod 400 hadoop.pem将 .pem 文件设置为只读以防止文件的意外修改。在终端输入ssh -i ~/.ssh/hadoop.pem root@[node00 的公网 IP 地址]即可远程登陆到云服务器。

服务器的公网和内网 IP 地址可以在阿里云控制台找到

分发 .pem 文件

使用命令scp -i ~/.ssh/hadoop.pem ~/.ssh/hadoop.pem root@[公网 IP 地址]:/root/.ssh/将 .pem 文件上传到各个节点。之后就可以从任意节点通过与上一小节类似的方法登陆到其它节点。

修改 hosts 文件

在所有节点上打开/etc/hosts文件,将各个节点的内网 IP 信息添加到文件末尾:

1
2
3
4
172.***.***.*** node00 node00
172.***.***.*** node01 node01
172.***.***.*** node02 node02
172.***.***.*** node03 node03

完成这一步后的各种命令中都可以使用 node0x 代替对应的内网 IP 地址了。

配置 ssh_config

现在服务器之间的远程登陆还需要使用ssh -i指定密钥位置。通过配置 ssh_config 可以免去这一麻烦。打开各个节点上/etc/ssh/目录下的ssh_config文件,按照如下格式在文件末尾添加:

1
2
3
4
5
Host node00  # 实例的名字
HostName 172.*.*.* # 实例的内网 IP 地址
Port 22 # 端口号,默认为 22
User root # 登录账号
IdentityFile /root/.ssh/... # 公钥的地址

ssh_config文件中的配置是以Host为标记区分段落的。你可以根据需要添加多个不同的以Host为开头的段落,来配置不同的服务器。将全部四台节点的信息写入ssh_config文件中后,就可以直接通过ssh node0x命令来远程登陆各个节点了。

一鼓作气,将全部节点的ssh_config文件配置完成吧!

从各个节点手动登陆到其它节点(包括自身)可以同时起到测试配置以及添加 known_hosts 的作用


伪分布式安装

我们首先在 node00 上进行伪分布式安装。接下来所有内容中的本地都指代我所使用的 Mac 系统。如果你使用的是 Windows 系统,还烦请自行查找对应的操作方法(并不难找!)。

将软件包上传到服务器

我首先在 node00 家目录下创建了 softwares 文件夹用于软件包的存放。回到本地,使用命令scp -i ~/.ssh/hadoop.pem [要上传的文件路径] root@[node00 的公网 IP 地址]:~/softwares/将先前准备的软件包上传到 node00 的 softwares 文件夹下。

如果提示 perimission denied,那可能是由于用户对于 softwares 文件夹没有修改权限。用 chmod 命令赋予 777 权限即可

安装 JDK

从 Oracle 官网下载的 JDK 一般有两种格式。如果你下载的是 rpm 格式,那么使用 rpm -i [JDK 文件名]安装即可。rpm 会依据 Linux 标准文件架构进行安装。

如果你下载的是压缩包格式,首先使用命令tar -xzvf [JDK 文件名]解包。使用mkdir /usr/java新建一个用于存放 JDK 的文件夹,并将解包得到的文件夹拷贝到/usr/java/下。

使用任何一种方式安装后都需要配置环境变量。使用vi /etc/profile打开配置文件,将下方的代码加入文件末尾:

1
2
export JAVA_HOME=/usr/java/jdk[一串版本号]
PATH=$PATH:$JAVA_HOME/bin

保存退出并执行. /etc/profile重新加载配置文件。执行命令java -version检查安装配置情况。如果终端中出现了 java 版本信息,那么祝贺你,JDK 的安装成功了!

安装 Hadoop

新建目录/opt/hadoop/。来到 softwares 目录,使用命令tar -zxvf hadoop-2.6.5.tar.gz -C /opt/hadoop/命令解压 Hadoop 软件包。

现在适合配置环境变量!打开/etc/profile,将文件末尾修改为:

1
2
export HADOOP_HOME=/opt/hadoop/hadoop-2.6.5
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

PATH 一行在前文 JDK 环境变量配置的基础上修改

执行. /etc/profile加载配置文件。输入hadoop version检查环境变量的配置。如果出现了版本信息,那么环境变量的配置便成功了!

配置 Hadoop

在启动集群前,我们要对集群的节点个数、位置、Block 大小等参数进行配置才能正常使用。Hadoop 的配置文件在安装路径之下的/etc/hadoop目录下。

JAVA_HOME 二次配置

分别打开hadoop-env.shmapred-env.shyarn-env.sh,找到export JAVA_HOME那一行,将JAVA_HOME设定为服务器上 JDK 的绝对路径/usr/java/jdk[一串版本号]

JAVA_HOME 环境变量可能在不止一个地方进行了定义。指定绝对路径可以保证 Hadoop 能找到且使用我们想要的 JDK

配置 NameNode

打开core-site.xml文件,按照如下内容进行配置:

1
2
3
4
5
6
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://node00:9000</value>
</property>
</configuration>

我们将 NameNode 指定为 node00,并且配置了端口号为 9000

配置副本数

打开hdfs-site.xml,按照如下内容进行配置:

1
2
3
4
5
6
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>

伪分布式只有一台服务器,因此副本数为 1

配置 DataNode

打开slaves,将 localhost 改为 node00。

伪分布式安装中 NameNode 和 DataNode 都是 node00

配置 Secondary NameNode

官网文档中并没有提到 SNN 的配置。在文档左侧导航栏中可以找到名为hdfs-default.xml的配置文件链接,里面是一些默认的配置参数。从中搜索 secondary 即可找到我们需要的配置项。找到的配置项为dfs.namenode.secondary.http-address,默认值为0.0.0.0:50090

自行翻阅查找官方文档是一项很重要的能力!

仍然打开hdfs-site.xml,增加一个 property,name 为 dfs.namenode.secondary.http-address,value 为node00:50090

配置临时文件目录

Hadoop 2.x 默认将元数据和 Block 数据保存在$hadoop.tmp.dir变量对应的路径下。这个路径默认是一个临时路径,非常容易导致节点数据的丢失。因此我们需要重新配置这个参数。打开core-site.xml,增加一个 property,name 为hadoop.tmp.dir,value 为/var/aliyun-study/hadoop/pseudo/

你可以选择其它的目录


测试 HDFS

格式化

Hadoop 启动前要首先进行格式化,生成或者读取 fsimage 和 edits 文件。使用命令hdfs namenode -format格式化 Hadoop。

格式化之前路径/var/aliyun-study/hadoop/pseudo/是不存在的。格式化过程中会创建该目录

启动

使用命令start-dfs.sh启动集群。使用jps命令可以查看到 NN、DN 和 SNN 对应的进程。

测试文件

接下来我们通过文件上传和操作来测试伪分布式 HDFS 集群的基本功能。使用命令hdfs dfs -mkdir -p /user/root创建目录,使用hdfs dfs -ls /user检查是否创建成功。

/user/root/ 是 hdfs 的默认上传目录

接着测试文件上传。来到/root/softwares/目录下,使用命令hdfs dfs -put hadoop-2.6.5.tar.gz /user/root/将 Hadoop 安装包上传到 hdfs 中。在浏览器中输入[node00 公网 IP]:50070可以打开可视化管理界面,其中包含浏览 HDFS 文件目录的功能。如果不能正常访问,记得先检查阿里云 ECS 的网络安全策略。默认 50070 端口是不开放的,需要你手动设定规则将其开放。在公网上暴露过多的端口会带来安全隐患。我的解决办法是,在学习实践的时候打开所有端口,而在学习结束后将它们全部关闭。

实际生产环境中应当将集群设置在内网