打造自己的MapReduce[一]:Hadoop集群搭建

我觉得我,以及我的BLOG陷入了一个怪圈。

那就是我在这里的每一篇文开头都必然是:最近工作好忙,又断更很久了……Anyway,这也不能成为偷懒的理由。我可能对记录技术有些固执的误解,总认为是要待到整理出一个专题一样自成体系的技术点才来更新,然大多数情况下,工作之余不会有太多时间来干这些耗时耗力的玩意。于是我尝试做一些改变,只要产生了想法抑或有些许收获,就或多或少地记录下来。但愿这能奏效。

做推荐系统有一段时日了,从一无所有到搭出一套可以基本运转的推荐系统,说难不难,但个中滋味也需体味过才知不易。嗯,关于从头搭建推荐系统我也有计划后续整理一篇出来。从最初的小水管单机离线接口,到现在全网接入,亿级用户画像,每天数十G的行为数据,光凭初期的Python并发脚本已经完全无法应付了,用户画像每天增量更新时动辄五六个小时,连拖延症如我也看不下去了。可是处在郊区小部门,没有现成的集群可以给我用,只有手头寥寥数台机器,还能怎么办呢?自己搭个Hadoop集群吧!

1. 何谓Hadoop

Hadoop这个东西网上资料太多,就不详细介绍它的背景原理啥的了。简单说来它就是Apache基金会的一个分布式计算项目,核心由分布式文件系统HDFS和分布式计算编程框架MapReduce两部分组成。

1.1. HDFS

Hadoop的分布式文件系统,全称Hadoop Distributed File System。它最大的贡献就是为TB级别的大文件存储提供了分布式方案,它的出现让我们的计算框架至少可以不用考虑以下问题:海量数据存储的单机磁盘容量限制问题、分布式作业时文件的传输问题、数据的容错和备份等等。HDFS的结构如图1所示:

图1 HDFS结构图

HDFS系统中每一台机器是一个Node。其中一台机器作为Namenode,系统会将所有存储文件按大小(如每份64M)切分为Block,分散存储在不同的Datanode上,由Namenode记录文件、目录、分块信息等;其他机器作为Datanode,用以存储各个Block。

1.2. MapReduce

MapReduce是一种编程模型,在Hadoop中,它把HDFS的文件作为输入源,主要思路就是通过将计算任务切分成片,并行计算,最后再将分片结果合并后拼到一起。系统中有两个角色:负责调度任务的JobTracker,与负责执行任务的TaskTracker。整个MapReduce的过程大致为:input->split->map->combine->shuffle->reduce->output,有张图对这个过程解释得一目了然,在此就不多做赘述:

图2 MapReduce过程

2. 组建集群

此时我们有3台机器(我的机器系统是SuSE,CentOS等大同小异),假设IP为10.1.1.1,10.1.1.2,10.1.1.3,其中一台作为Master(运行Namenode和JobTracker),其他两台作为Slaves(运行Datanode和TaskTracker),要把Hadoop集群运行起来,接下来我们至少要完成这些事:

  1. 配置三台机器的hostname
  2. 设置Master到Slaves的SSH免密登录
  3. 配置三台机器的Java和Hadoop环境
  4. 修改Hadoop配置文件并复制到各节点
  5. 格式化namenode
  6. 启动hadoop进程

让我们一步步来。当然,是用最简单的语言描述(……呼)。

2.1. 配置hostname

我们需要为三台机器分别配置hostname,让彼此互相认识。首先,把自己的hostname持久化。如在slave-1机器上输入如下命令:

hostname slave-1  

大坑预警1:hostname不能包含下划线(_)、冒号(:)等特殊符号,不然只会配置hdfs路径时会出错

然后修改/etc/hosts文件,绑定hostname解析:

10.1.1.2 slave-1 localhost localhost.localdomain

10.1.1.1 master  
10.1.1.3 slave-2  

大坑预警2:localhost、localhost.localdomain等hostname最好不要绑定到127.0.0.1/127.0.1.1一类本地IP地址。Hadoop启动时会首先连接localhost,而此时很多策略下本地IP地址不允许监听,容易出错。具体要求参见https://wiki.apache.org/hadoop/ConnectionRefused

配置完后可ping一下hostname验证。

2.2. 配置Master到Slaves的SSH免密登录

由于在Master启动的Namenode进程需要SSH到Slaves上进行操作,因此配置他们之间的SSH免密登录是必要的。

首先,我们在三台机器上都创建一个账号,用户名、密码需要保持一致,用以在Hadoop集群间传输文件。

useradd -m hadoop -d /home/hadoop  
passwd hadoop  

然后登入到Master,这里根据机器的SSH版本分两种方式:

2.2.1. SSH1

如果是SSH1,则先生成密钥和公钥对:

ssh-keygen -t rsa -P ''  

接着将公钥追加到授权的keys里:

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys  

记得检查/etc/ssh/sshd_config文件的以下属性是否配置正确:

RSAAuthentication yes # 启用 RSA 认证  
PubkeyAuthentication yes # 启用公钥私钥配对认证方式  
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径  

若不一致,修改后重启服务service sshd restart即可。然后将公钥文件id_rsa.pub scp到两台Slave机器上。再分别登录两台机器,重复如下操作:

mkdir ~/.ssh  
cat id_rsa.pub >> ~/.ssh/authorized_keys  

配置完成。在Master上分别ssh到两台Slave机器上,即可验证无密码登录。

2.2.2. SSH2

如果是SSH2,则改为如下步骤。首先生成密钥对:

ssh-keygen2 -t rsa -P ''  

然后在~/.ssh2目录下建立文件identification,通过它来指定私钥。

echo 'IdKey id_rsa' > ~/.ssh2/identification  

将公钥文件id_rsa.pub scp到两台Slave机器上。再分别登录两台机器,重复如下操作:

cat 'Key id_rsa.pub' > ~/.ssh2/authorization  

配置完成。

2.3. 配置Java和Hadoop环境

这个……实在懒得说了,网上教程一大把,没什么好说的。注意配好环境变量即可,最好三台机器保证目录一致,便于管理。

2.4. 修改Hadoop配置文件

我们把Hadoop安装在了/data/hadoop目录下,这时我们进入/data/hadoop/etc/hadoop目录下,需要修改如下几个配置文件:core-site.xmlhdfs-site.xmlmapred-site.xml、'yarn-site.xml'。

2.4.1. core-site.xml

配置一些Hadoop系统的核心参数。必须配置Master的地址作为HDFS的默认目录,其他参数的意义和默认值详见http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-common/core-default.xml

<configuration>  
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master:9000</value> # master
        </property>
</configuration>  

大坑预警3:在复写hadoop.tmp.dir的路径时注意,这个配置项的值表示HDFS上的路径,而不是本地文件系统。之前不知看来哪里的配置设了一个file://tmpdir,造成之后配置mongodb连接时临时文件写入出错。注意。

2.4.2. hdfs-site.xml

这里注意rpc-address和secondary.http-address的hostname保持与defaultFS一致。

<configuration>  
        <property>
                <name>dfs.namenode.rpc-address</name>
                <value>master:9000</value>
        </property>
        <property>
                <name>dfs.namenode.secondary.http-address</name>
                <value>master:50090</value>
        </property>
        <property>
                <name>dfs.replication</name> # 副本数
                <value>2</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/data/hadoop/dfs/name</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/data/hadoop/dfs/data</value>
        </property>
         <property>
                <name>dfs.permissions</name>
                <value>false</value>
        </property>
        <property>
                <name>dfs.hosts.exclude</name> # 指定节点黑名单便于之后不重启动态下线节点
                <value>/data/hadoop/etc/hadoop/excludes</value>
        </property>
</configuration>  

2.4.3. mapred-site.xml

<configuration>  
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>master:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>master:19888</value>
        </property>
        <property>
                <name>mapred.hosts.exclude</name> # 节点黑名单同上设置
                <value>/data/hadoop/etc/hadoop/excludes</value>
                <final>true</final>
        </property>
</configuration>  

2.4.4. yarn-site.xml

<configuration>  
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>master</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
</configuration>  

最后在slaves文件中输入所有Datenode的hostname(Master也可以作为一个Datanode):

vim slaves

master  
slave-1  
slave-2  

所有配置完成后,可直接把/etc/hadoop目录打包传输到所有Slave节点,解压覆盖相同目录文件即可。

2.5. 格式化Namenode

在Master机器上输入命令:

hadoop namenode -format  

Format动作只需初始化时执行一次,之后增删节点或是Hadoop重启都无需再执行。注意:如果在Hadoop运行之后又重新执行了format,则需要在Slave节点上清空所有dfs.name文件夹下的内容,否则会出错。

2.6. 启动Hadoop

在Master机器上输入如下命令:

/data/hadoop/sbin/start-dfs.sh
/data/hadoop/sbin/start-yarn.sh
/data/hadoop/sbin/mr-jobhistory-daemon.sh start historyserver

然后输入jps查看进程启动情况,正常状态下需看到下列所有进程(如果Master没有作为Datanode,则可以没有Datenode和NodeManager进程):

NameNode  
JobHistoryServer  
SecondaryNameNode  
ResourceManager  
DataNode  
NodeManager  

然后我们登录到Slave机器上输入jps,如果出现下列进程,则该节点运行正常。

DataNode  
NodeManager  

我们可以调用hdfs dfsadmin -report命令来查看当前活跃节点,若数量一致则启动成功。命令运行部分结果如下所示:

Configured Capacity: 3355338473472 (3.05 TB)  
Present Capacity: 2413589479424 (2.20 TB)  
DFS Remaining: 2340718829568 (2.13 TB)  
DFS Used: 72870649856 (67.87 GB)  
DFS Used%: 3.02%  
Under replicated blocks: 6  
Blocks with corrupt replicas: 0  
Missing blocks: 0  
Missing blocks (with replication factor 1): 0

-------------------------------------------------
Live datanodes (3):  

如果你看到这个,那么,Congratulations! 可以开始愉快地玩耍Hadoop啦!

具体的MapReduce示例什么的,推荐去官网教程学习,并且一定要确认与自己的Hadoop版本一致。现在的MapReduce编程接口有v1和v2两版,虽然有的废弃属性还会兼容,但难以保证以后的支持。详见:http://hadoop.apache.org/docs

3. 后记

搭建起了Hadoop集群只是个开始,计划之后对于一些扩展,参数的调优甚至是基于HDFS的Spark应用也会做一些随笔记录。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏美图数据技术团队

快速、安全、可靠!Yarn!| MTdata小讲堂

Yarn 的全称是 Yet Anther Resource Negotiator(另一种资源协商者)。它作为 Hadoop 的一个组件,官方对它的定义是一个工作...

14720
来自专栏蒋专的专栏

Spark 以及 spark streaming 核心原理及实践

作者在接触spark以及spark streaming之后,对spark技术的使用的经验积累以及心得体会,在此分享给大家。本文依次从spark生态,原理,基本概...

2.5K40
来自专栏闵开慧

hadoop源码解析1 - hadoop中各工程包依赖关系

1 hadoop中各工程包依赖简述     Google的核心竞争技术是它的计算平台。Google的大牛们用了下面5篇文章,介绍了它们的计算设施。     G...

34050
来自专栏LuckQI

惊心动魄的Hadoop-6小时350T数据恢复

13740
来自专栏数据和云

Hadoop 面试,来看这篇就够了

原文链接 | http://www.jianshu.com/p/c97ff0ab5f49

12720
来自专栏用户画像

Hadoop的前世今生

HADOOP DISTRIBUTED FILE SYSTEM,简称HDFS,是一个分布式文件系统。它是谷歌的GFS提出之后出现的另外一种文件系统。它有一定高度的...

11330
来自专栏大数据

如何给Hadoop集群划分角色

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproje...

696100
来自专栏猿人谷

HDFS详解

【一】HDFS简介 HDFS的基本概念1.1、数据块(block) HDFS(Hadoop Distributed File System)默认的最基本的存储...

349100
来自专栏美图数据技术团队

Spark Streaming VS Flink

本文从编程模型、任务调度、时间机制、Kafka 动态分区的感知、容错及处理语义、背压等几个方面对比 Spark Stream 与 Flink,希望对有实时处理...

17310
来自专栏分布式系统和大数据处理

安装和配置Spark(单节点)

Apache Spark被称为第三代大数据处理平台,也当前应用最广泛的大数据处理方案,这篇文章将介绍如何在Linux系统(Cent OS7)上以单机模式(Sta...

88150

扫码关注云+社区

领取腾讯云代金券