本教程将介绍如何在腾讯云CVM上搭建Hadoop集群。Hadoop中是一个Apache的框架,可以让你通过基本的编程处理跨服务器集群的分布式方式的大型数据集。Hadoop提供的可扩展性允许你从单个服务器扩展到数千台计算机。它还在应用层提供故障检测,因此它可以检测和处理故障,作为高可用性服务。
我们将在本教程中使用4个重要模块:
在本教程中,我们将在四台腾讯云CVM上搭建Hadoop集群
本教程需要以下内容:
sudo
命令的非root账户。根据Hadoop的语言,我们给4台服务器分别命名如下:
hadoop-master
hadoop-worker-01
hadoop-worker-02
hadoop-worker-03
没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。因为最开始搭建环境都是一样的步骤,步骤1和步骤2是需要我们为4台服务器都执行的操作,为此我们不必一样的步骤操作4次,我们可以利用腾讯云的快照服务。
我们要安装Java和Hadoop
首先,更新一下Ubuntu 系统,确保本地的软件包都是最新的:
sudo apt-get update && sudo apt-get -y dist-upgrade
接下来,安装Java开发包。
sudo apt-get -y install openjdk-8-jdk-headless
创建安装Hadoop的目录my-hadoop-install
,然后进入该目录。
mkdir my-hadoop-install && cd my-hadoop-install
一旦我们创建了目录,我们会从Hadoop发布列表中安装最新的二进制文件。在本教程的时候,最新的是Hadoop 3.0.1
。
注意:请记住,这些下载是通过镜像站点分发的,建议使用GPG或SHA-256检查它是否被篡改。
确定你要下载的版本,复制下载链接,然后用wget
命令下载,例如:
wget http://mirror.cc.columbia.edu/pub/software/apache/hadoop/common/hadoop-3.0.1/hadoop-3.0.1.tar.gz
下载完成后,使用tar
命令解压缩:
tar xvzf hadoop-3.0.1.tar.gz
我们现在准备开始我们的初始配置了。
对于每个CVM节点,我们都需要进行设置JAVA_HOME
。使用nano或其他你喜欢的文本编辑器打开以下文件:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hadoop-env.sh
找到示例的这部分内容,包含JAVA_HOME
:
...
###
# Generic settings for HADOOP
###
# Technically, the only required environment variable is JAVA_HOME.
# All others are optional. However, the defaults are probably not
# preferred. Many sites configure these options outside of Hadoop,
# such as in /etc/profile.d
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
# export JAVA_HOME=
# Location of Hadoop. By default, Hadoop will attempt to determine
# this location based upon its execution path.
# export HADOOP_HOME=
...
改完后看起来像这样:
...
###
# Generic settings for HADOOP
###
# Technically, the only required environment variable is JAVA_HOME.
# All others are optional. However, the defaults are probably not
# preferred. Many sites configure these options outside of Hadoop,
# such as in /etc/profile.d
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
# Location of Hadoop. By default, Hadoop will attempt to determine
# this location based upon its execution path.
# export HADOOP_HOME=
...
我们还需要添加一些环境变量来运行Hadoop及模块。它们添加到文件的底部,所以它看起来如下所示,把sammy替换成你登陆系统所用的账户,也就是设置好的可以使用sudo
命令的非root的账户名。
注意:建议使用腾讯云快照,这样的话每台CVM的账户都是统一的名字,就会方便很多。当然你想要每台CVM的账户都不一样,也是可以的,但是要注意修改正确。
...
#
# To prevent accidents, shell commands be (superficially) locked
# to only allow certain users to execute certain subcommands.
# It uses the format of (command)_(subcommand)_USER.
#
# For example, to limit who can execute the namenode command,
export HDFS_NAMENODE_USER="sammy"
export HDFS_DATANODE_USER="sammy"
export HDFS_SECONDARYNAMENODE_USER="sammy"
export YARN_RESOURCEMANAGER_USER="sammy"
export YARN_NODEMANAGER_USER="sammy"
保存并退出。接下来,运行以下命令应用:
source ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hadoop-env.sh
随着hadoop-env.sh
脚本源代码的更新,我们需要为Hadoop分布式文件系统(HDFS)创建一个数据目录来存储有关的HDFS
文件。
sudo mkdir -p /usr/local/hadoop/hdfs/data
使用你的相应用户设置此文件的权限。请记住,如果每个CVM上有不同的账户名,请确保允许相应的账户拥有这些权限:
sudo chown -R sammy:sammy /usr/local/hadoop/hdfs/data
到此,4台CVM公共基础环境的部署差不多了,因为考虑到4台CVM使用4个不同命的账户名称,会很不方便,建议到这个步骤只要配置一台CVM,然后再使用腾讯云的快照服务。这样每一台CVM都会有统一的基础环境。
此时,我们需要更新4个CVM节点的core_site.xml
文件。在每个CVM中,打开以下文件:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/core-site.xml
可以看到以下行:
...
<configuration>
</configuration>
添加以下内容,将server-ip
替换成每个CVM的相应的IP。如果你开启了防火墙,则需要打开9000端口。
...
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://server-ip:9000</value>
</property>
</configuration>
现在为每个服务器节点更新所有常规Hadoop设置,我们可以继续通过SSH密钥连接我们的节点。
为了让Hadoop的正常工作,我们需要设置主节点和从节点之间的无密码SSH连接(命名为hadoop-master
的是主服务器(主节点),命名为hadoop-worker-xx
的是从服务器(从节点))。
我们首先需要在主节点上创建一对公钥 - 私钥,该节点将是IP地址所属的节点hadoop-master
。
在hadoop-master
CVM上,运行以下命令。你将按下enter
以使用键位置的默认值,然后按enter
两次以使用空密码:
ssh-keygen
对于每个从节点,我们需要将主节点的公钥其复制到每个从节点的authorized_keys
文件中。
使用cat
命令将.ssh
文件夹中的id_rsa.pub
文件存储的公钥打印到控制台:
cat ~/.ssh/id_rsa.pub
现在登录每个从节点CVM,然后打开authorized_keys
文件:
nano ~/.ssh/authorized_keys
然后将主节点的公钥(就是运行cat ~/.ssh/id_rsa.pub
命令后生成的输出)复制到每个CVM的~/.ssh/authorized_keys
文件中。请务必在关闭前保存每个文件。
完成后,还可以使用相同的命令将主节点的公钥复制到它自己的authorized_keys
文件中:
nano ~/.ssh/authorized_keys
在hadoop-master
,配置ssh
,添加每个节点的主机名:
nano ~/.ssh/config
将文件修改为如下所示,并修改成相关的IP和账户名(统一的账户名,会方便一点)。
Host hadoop-master-server-ip
HostName hadoop-example-node-server-ip
User sammy
IdentityFile ~/.ssh/id_rsa
Host hadoop-worker-01-server-ip
HostName hadoop-worker-01-server-ip
User sammy
IdentityFile ~/.ssh/id_rsa
Host hadoop-worker-02-server-ip
HostName hadoop-worker-02-server-ip
User sammy
IdentityFile ~/.ssh/id_rsa
Host hadoop-worker-03-server-ip
HostName hadoop-worker-03-server-ip
User sammy
IdentityFile ~/.ssh/id_rsa
保存并关闭文件。
在hadoop-master
,用SSH
进入每个节点:
ssh sammy@hadoop-worker-01-server-ip
由于你是第一次使用当前系统设置登录每个节点,因此会询问以下内容:
are you sure you want to continue connecting (yes/no)?
输入yes
。每个从节点都需要初始SSH连接。最后,使用logout
注销登录,就可以返回hadoop-master
:
logout
现在我们已经为每个从节点成功设置了无密码SSH,现在我们可以继续配置主节点。
对于我们的Hadoop集群,我们需要在主节点CVM上配置HDFS。
在主节点上,编辑以下文件:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hdfs-site.xml
编辑configuration
部分如下:
...
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///usr/local/hadoop/hdfs/data</value>
</property>
</configuration>
保存并关闭文件。
接下来,我们将在主节点上配置MapReduce
属性。使用nano或其他文本编辑器打开mapred.site.xml
:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/mapred-site.xml
然后更新文件,将hadoop-master-server-ip
替换成主节点的的IP地址:
...
<configuration>
<property>
<name>mapreduce.jobtracker.address</name>
<value>hadoop-master-server-ip:54311</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
保存并退出。如果你开启了防火墙,请务必打开端口54311。
接下来,在主节点上设置YARN。打开yarn-site.xml
文件:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/yarn-site.xml
更新文件,确保输入当前服务器的IP地址:
...
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-master-server-ip</value>
</property>
</configuration>
最后,要让Hadoop知道哪个是主节点,哪个是从节点。首先,打开masters
文件:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/masters
在此文件中,你将添加当前服务器的IP地址:
hadoop-master-server-ip
现在,打开并编辑workers
文件:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/workers
然后在localhost
下面添加每个从节点的IP地址,。
localhost
hadoop-worker-01-server-ip
hadoop-worker-02-server-ip
hadoop-worker-03-server-ip
完成MapReduce
和YARN
配置后,我们现在可以完成配置从节点。
我们现在将配置从节点,以便它们每个都具有对HDFS的数据目录的正确引用。
在每个从节点上,编辑hdfs-site.xml
文件:
nano ~/my-hadoop-install/hadoop-3.0.1/etc/hadoop/hdfs-site.xml
用以下内容替换配置部分:
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///usr/local/hadoop/hdfs/data</value>
</property>
</configuration>
保存并关闭文件。确保在三个从节点上都执行此步骤。
此时,我们的从节点CVMs指向HDFS的数据目录,这将允许我们运行我们的Hadoop集群。
我们已经到了可以启动Hadoop集群的程度。在我们启动它之前,我们需要在主节点上格式化HDFS。在主节点CVM上,将目录更改为安装Hadoop的位置:
cd ~/my-hadoop-install/hadoop-3.0.1/
然后运行以下命令格式化HDFS:
sudo ./bin/hdfs namenode -format
成功格式化namenode将会有大量的输出,主要由INFO
语句组成。在底部,你将看到以下内容,确认你已成功格式化存储目录。
Output...
2018-01-28 17:58:08,323 INFO common.Storage: Storage directory /usr/local/hadoop/hdfs/data has been successfully formatted.
2018-01-28 17:58:08,346 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/hdfs/data/current/fsimage.ckpt_0000000000000000000 using no compression
2018-01-28 17:58:08,490 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/hdfs/data/current/fsimage.ckpt_0000000000000000000 of size 389 bytes saved in 0 seconds.
2018-01-28 17:58:08,505 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2018-01-28 17:58:08,519 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop-example-node/127.0.1.1
************************************************************/
现在,通过运行以下脚本来启动Hadoop集群(在使用less
命令运行之前检查脚本):
sudo ./sbin/start-dfs.sh
然后,你将看到包含以下内容的输出:
Starting namenodes on [hadoop-master-server-ip]
Starting datanodes
Starting secondary namenodes [hadoop-master]
然后使用以下命令运行YARN:
./sbin/start-yarn.sh
会有以下输出:
Starting resourcemanager
Starting nodemanagers
运行这些命令后,应该在主节点上和每个从节点上都运行守护程序。
我们可以通过运行jps
命令来检查守护进程以检查Java进程:
jps
运行后jps
命令,你会看到NodeManager
,SecondaryNameNode
,Jps
,NameNode
,ResourceManager
,和DataNode
正在运行。将出现类似于以下输出的内容:
9810 NodeManager
9252 SecondaryNameNode
10164 Jps
8920 NameNode
9674 ResourceManager
9051 DataNode
这将验证我们是否已成功创建群集并验证Hadoop守护程序是否正在运行。
在你选择的Web浏览器中,输入下内容来全面了解群集的运行状况:
http://hadoop-master-server-ip:9870
如果你有开启防火墙,请务必打开9870端口。你将看到类似于以下内容:
从这里,你可以导航到Datanodes
菜单栏中的项目以查看节点活动。
在本教程中,我们讨论了如何使用DigitalOcean Ubuntu 16.04 CVM设置和配置Hadoop多节点集群。你现在还可以使用Hadoop的DFS Health Web界面监视和检查群集的运行状况。要了解可以使用新配置的集群的可能项目,请查看Apache 由Hadoop提供支持的长项目列表。创建Hadoop教程就到这里,我们发现配置非常繁琐,这里我推荐你使用腾讯云弹性MapReduce服务,弹性MapReduce (EMR)结合云技术和 Hadoop、Hive、Spark、Hbase、Storm 等社区开源技术,提供安全、低成本、高可靠、可弹性伸缩的云端托管 Hadoop 服务。您可以在数分钟内创建安全可靠的专属 Hadoop 集群,以分析位于集群内数据节点或 COS 上的 PB 级海量数据。 更多Hadoop教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Spin Up a Hadoop Cluster with DigitalOcean Droplets》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。