Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
本指南将教您在云上搭建Hadoop集群。还没有云服务器的同学可以到腾讯云官网点击产品中的云服务器,进行购买。您也可以到这里免费领取一台腾讯云服务器。
Hadoop集群体系结构
在配置主节点和从节点之前,了解Hadoop集群的不同组件非常重要。
主节点保持对分布式文件系统的信息,就像inode
上表ext3
文件系统,调度资源分配。node-master将在本指南中担任此角色,并托管两个守护进程:
- NameNode:管理分布式文件系统,并且知道在集群内部存储的数据块。
- ResourceManager:管理YARN工作,发生在从节点保健调度和执行过程。
从节点存储实际数据并提供处理能力以运行作业。它们会是node1和node2,并将托管两个守护进程:
- DataNode管理物理存储节点上的实际数据。
- NodeManager管理节点上的任务执行。
配置系统
在每个节点上创建主机文件
要使每个节点与其名称进行通信,请编辑该/etc/hosts
文件以添加三个服务器的IP地址。不要忘记用您的IP替换样本IP:
- / etc / hosts
192.0.2.1 node-master
192.0.2.2 node1
192.0.2.3 node2
为Hadoop用户分发身份验证密钥对
主节点将使用ssh-connection通过密钥对身份验证连接到其他节点,以管理群集。
- 以用户身份登录node-master
hadoop
,并生成ssh-key:
ssh-keygen -b 4096
- 将密钥复制到其他节点。将密钥复制到node-master本身也是一种好习惯,这样您也可以根据需要将其用作DataNode。键入以下命令,并
hadoop
在询问时输入用户密码。如果系统提示您是否将密钥添加到已知主机,请输入yes
:
ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node-master
ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node1
ssh-copy-id -i $HOME/.ssh/id_rsa.pub hadoop@node2
下载并解压缩Hadoop二进制文件
以用户身份登录到node-masterhadoop
,从Hadoop项目页面下载Hadoop tarball ,然后解压缩:
cd
wget http://apache.mindstudios.com/hadoop/common/hadoop-2.8.1/hadoop-2.8.1.tar.gz
tar -xzf hadoop-2.8.1.tar.gz
mv hadoop-2.8.1 hadoop
设置环境变量
- 将Hadoop二进制文件添加到PATH中。编辑
/home/hadoop/.profile
并添加以下行:
/home/hadoop/.profile
代码语言:javascript复制PATH=/home/hadoop/hadoop/bin:/home/hadoop/hadoop/sbin:$PATH
配置主节点
配置将在node-master上完成并复制到其他节点。
设置JAVA_HOME
- 获取Java安装路径。如果您从软件包管理器安装了open-jdk,则可以使用以下命令获取路径:
update-alternatives --display java
获取当前链接的值并删除/bin/java
。例如在Debian上,链接是/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
,所以JAVA_HOME
应该是/usr/lib/jvm/java-8-openjdk-amd64/jre
。
如果从Oracle安装java,JAVA_HOME
则是解压缩java存档的路径。
- 编辑
~/hadoop/etc/hadoop/hadoop-env.sh
并替换此行:
export JAVA_HOME=${JAVA_HOME}
为您的实际Java安装路径。例如在带有open-jdk-8的Debian上:
~/hadoop/etc/hadoop/hadoop-env.sh
代码语言:javascript复制export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre
设置NameNode位置
在每个节点上更新~/hadoop/etc/hadoop/core-site.xml
您要在端口上将NameNode位置设置为node-master9000
:
~/hadoop/etc/hadoop/core-site.xml
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://node-master:9000</value>
</property>
</configuration>
设置HDFS路径
编辑hdfs-site.conf
:
~/hadoop/etc/hadoop/hdfs-site.xml
代码语言:javascript复制<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/data/nameNode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/data/dataNode</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
最后一个属性:dfs.replication
表示在群集中复制数据的次数。您可以设置为2
,代表在两个节点上复制所有数据。请勿输入高于实际从属节点数的值。
将YARN设置为Job Scheduler
- 在
~/hadoop/etc/hadoop/
,重命名mapred-site.xml.template
为mapred-site.xml
:
cd ~/hadoop/etc/hadoop
mv mapred-site.xml.template mapred-site.xml
- 编辑文件,将yarn设置为MapReduce操作的默认框架: ~/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
配置YARN
编辑yarn-site.xml
:
~/hadoop/etc/hadoop/yarn-site.xml
代码语言:javascript复制<configuration>
<property>
<name>yarn.acl.enable</name>
<value>0</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node-master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
配置从属
启动脚本使用slaves
文件在所有节点上启动所需的守护程序。编辑~/hadoop/etc/hadoop/slaves
为:
~/hadoop/etc/hadoop/slaves
代码语言:javascript复制node1
node2
配置内存分配
低RAM节点上的内存分配可能很麻烦,因为默认值不适合RAM少于8GB的节点。本节将重点介绍内存分配如何适用于MapReduce作业,并提供2GB RAM节点的示例配置。
内存分配属性
使用两种资源执行YARN作业:
- 应用主站(AM)是负责在集群中的监视应用程序和协调分布式执行者。
- 由AM创建的一些执行程序实际上运行该作业。对于MapReduce作业,它们将并行执行map或reduce操作。
两者都在从属节点上的容器中运行。每个从属节点都运行一个NodeManager守护程序,该守护程序负责在节点上创建容器。整个集群由ResourceManager管理,ResourceManager根据容量要求和当前费用调度所有从节点上的容器分配。
需要正确配置四种类型的资源分配才能使群集正常工作:
- 单个节点上的YARN容器的分配内存。这个限制应该高于所有其他限制; 否则,容器分配将被拒绝,应用程序将失败。但是,它不应该是节点上的全部RAM。
此值配置yarn-site.xml
为yarn.nodemanager.resource.memory-mb
。
- 单个容器可以消耗多少内存以及允许的最小内存分配。容器永远不会大于最大值,否则分配将失败并始终被分配为最小RAM量的倍数。
这些值yarn-site.xml
使用yarn.scheduler.maximum-allocation-mb
和yarn.scheduler.minimum-allocation-mb
。
- 将为ApplicationMaster分配多少内存。这是一个常量值,应该适合容器的最大大小。
此配置在mapred-site.xml
使用yarn.app.mapreduce.am.resource.mb
。
- 将为每个映射分配多少内存或减少操作。这应该小于最大尺寸。
这是mapred-site.xml
使用属性mapreduce.map.memory.mb
和配置mapreduce.reduce.memory.mb
。
所有这些属性之间的关系如下图所示:
2GB节点的示例配置
对于2GB节点,工作配置可能是:
属性 | 值 |
---|---|
yarn.nodemanager.resource.memory-MB | 1536 |
yarn.scheduler.maximum分配-MB | 1536 |
yarn.scheduler.minimum分配-MB | 128 |
yarn.app.mapreduce.am.resource.mb | 512 |
mapreduce.map.memory.mb | 256 |
mapreduce.reduce.memory.mb | 256 |
- 编辑
/home/hadoop/hadoop/etc/hadoop/yarn-site.xml
并添加以下行: ~/hadoop/etc/hadoop/yarn-site.xml
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>1536</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>128</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
最后一个属性禁用虚拟内存检查,可以防止在JDK8上正确分配容器。
- 编辑
/home/hadoop/hadoop/etc/hadoop/mapred-site.xml
并添加以下行: ~/hadoop/etc/hadoop/mapred-site.xml
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>512</value>
</property>
<property>
<name>mapreduce.map.memory.mb</name>
<value>256</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>256</value>
</property>
每个节点上的重复配置文件
- 将hadoop二进制文件复制到从属节点:
cd /home/hadoop/
scp hadoop-*.tar.gz node1:/home/hadoop
scp hadoop-*.tar.gz node2:/home/hadoop
- 通过ssh连接到node1。由于上面复制的ssh密钥,不需要密码:
ssh node1
- 解压缩二进制文件,重命名目录,然后退出node1以返回node-master:
tar -xzf hadoop-2.8.1.tar.gz
mv hadoop-2.8.1 hadoop
exit
- 对node2重复步骤2和3 。
- 将Hadoop配置文件复制到从属节点:
for node in node1 node2; do
scp ~/hadoop/etc/hadoop/* $node:/home/hadoop/hadoop/etc/hadoop/;
done
格式化HDFS
HDFS需要进行格式化。在node-master上,运行以下命令:
代码语言:javascript复制hdfs namenode -format
您的Hadoop安装现已配置并准备运行。
运行并监控HDFS
本节将介绍如何在NameNode和DataNodes上启动HDFS,并监控所有内容是否正常工作以及与HDFS数据交互。
启动和停止HDFS
- 通过从node-master运行以下脚本来启动HDFS :
start-dfs.sh
根据slaves
配置文件中的配置,它将在node-master上启动NameNode和SecondaryNameNode,在node1和node2上启动DataNode。
- 使用
jps
在每个节点上的命令检查每个进程是否正在运行。你应该使用node-master(PID会有所不同):
21922 Jps
21603 NameNode
21787 SecondaryNameNode
在node1和node2上:
代码语言:javascript复制 19728 DataNode
19819 Jps
- 要在主节点和从节点上停止HDFS,请从node-master运行以下命令:
stop-dfs.sh
监控您的HDFS集群
- 您可以使用该
hdfs dfsadmin
命令获取有关运行HDFS群集的有用信息:
hdfs dfsadmin -report
这将打印所有正在运行的DataNode的信息(例如,容量和使用情况)。要获取所有可用命令的描述,请键入:
代码语言:javascript复制 hdfs dfsadmin -help
- 您还可以自动使用更友好的Web用户界面。将浏览器指向http://node-master-IP:50070,您将获得一个用户友好的监控控制台。
将数据放入HDFS
使用命令完成HDFS的写入和读取hdfs dfs
。首先,手动创建主目录。所有其他命令将使用相对于此默认主目录的路径:
hdfs dfs -mkdir -p /user/hadoop
让我们以Gutenberg项目中的一些书为例。
- 在HDFS中创建books目录。以下命令将在主目录中创建
/user/hadoop/books
:
hdfs dfs -mkdir books
- 从Gutenberg项目中获取一些书籍:
cd /home/hadoop
wget -O alice.txt https://www.gutenberg.org/files/11/11-0.txt
wget -O holmes.txt https://www.gutenberg.org/ebooks/1661.txt.utf-8
wget -O frankenstein.txt https://www.gutenberg.org/ebooks/84.txt.utf-8
- 将三本书通过HDFS放在
books
目录中:
hdfs dfs -put alice.txt holmes.txt frankenstein.txt books
- 列出目录的内容
book
:
hdfs dfs -ls books
- 将其中一本书移到本地文件系统:
hdfs dfs -get books/alice.txt
- 您也可以直接从HDFS打印书籍:
hdfs dfs -cat books/alice.txt
有许多命令可以管理您的HDFS。有关完整列表,您可以查看Apache HDFS shell文档,或者打印以下帮助:
代码语言:javascript复制hdfs dfs -help
运行YARN
HDFS是一个分布式存储系统,它不为集群中的运行和调度任务提供任何服务。这是YARN框架的作用。以下部分介绍如何启动,监控和向YARN提交作业。
启动和停止YARN
- 使用脚本启动YARN:
start-yarn.sh
- 使用该
jps
命令检查一切是否正在运行。除了以前的HDFS守护程序,您应该在node-master上看到ResourceManager,在node1和node2上看到NodeManager。 - 要停止YARN,请在node-master上运行以下命令:
stop-yarn.sh
监控YARN
- 该
yarn
命令提供了用于管理YARN群集的实用程序。您还可以使用以下命令打印正在运行的节点的报告:
yarn node -list
同样,您可以使用以下命令获取正在运行的应用程序列表:
代码语言:javascript复制 yarn application -list
要获取该yarn
命令的所有可用参数,请参阅Apache YARN文档。
- 与HDFS一样,YARN提供了更友好的Web UI,默认情况下在
8088
资源管理器的端口上启动。将浏览器指向http://node-master-ip:8088/并浏览UI:
将MapReduce作业提交给YARN
将Yarn作业打包到jar
文件中并提交给YARN以使用yarn jar
命令执行。Hadoop安装包提供了可以运行以测试集群的示例应用程序。您将使用它们在之前上传到HDFS的三本书上运行字数统计。
- 将jar文件提交给YARN。并在node-master上运行:
yarn jar ~/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar wordcount "books/*" output
最后一个参数是保存作业的输出 - 在HDFS中。
- 作业完成后,您可以通过
hdfs dfs -ls output
查询HDFS获得结果。如果成功,输出将类似于:
Found 2 items
-rw-r--r-- 1 hadoop supergroup 0 2017-10-11 14:09 output/_SUCCESS
-rw-r--r-- 1 hadoop supergroup 269158 2017-10-11 14:09 output/part-r-00000
- 打印结果:
hdfs dfs -cat output/part-r-00000
结论
至此,您已经在云服务器创建了Hadoop集群。若您感到以上方法过于复杂,可以直接使用腾讯云弹性MapReduce,弹性MapReduce (EMR)结合云技术和 Hadoop、Hive、Spark、Hbase、Storm 等社区开源技术,提供安全、低成本、高可靠、可弹性伸缩的云端托管 Hadoop 服务。您可以在数分钟内创建安全可靠的专属 Hadoop 集群,以分析位于集群内数据节点或 COS 上的 PB 级海量数据。