搭建Hadoop集群

分布式和集群

分布式系统和集群的关系

分布式系统和集群从表面上看是很类似的,都是将几台机器通过网络连接,解决某个问题或提供某个服务。

从狭义上说还是可以做一些区分:

集群:所有节点一起工作,实现同一服务。一个节点挂掉,不会对集群有任何影响。

分布式系统:系统每一个节点,都实现不同的服务,如果一个节点挂了,这个服务就不可访问了。在实际部署中,分布式系统中的每个节点都可以是一个集群,这样可以提高服务的可用性,性能等。

知乎上看到一个比较容易理解的说法:

分布式和集群:小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群。一个配菜师因故请假了,但是其余的配菜师还是该啥就干啥,可能没请假的配菜师任务会被均匀的加量了,但是他们的任务和职责是不变的。
所以可以理解为,一起干同样的事叫集群,分工合作的叫分布式。

Hadoop

  • Hadoop是一个由Apache基金会所开发的分布式系统基础架构。

  • Hadoop是一个能够对大量数据进行分布式处理的软件框架。

    Hadoop 以一种可靠、高效、可伸缩的方式进行数据处理。

  • Hadoop 是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理。

  • Hadoop 是高效的,因为它以并行的方式工作,通过并行处理加快处理速度。

  • Hadoop 是可伸缩的,能够处理PB (1PB=1024TB)级数据。

MapReduce

MapReduce是一个编程模型,也是一个处理和生成超大数据集的算法模型的相关实现。用户首先创建一个Map函数处理一个基于key/value pair的数据集合,输出中间的基于key/value pair的数据集合;然后再创建一个Reduce函数用来合并所有的具有相同中间key值的中间value值

同样地,用一个浅显的例子来表述:

假设我们手上有很多复杂数据,那么怎样来处理呢?

第一步就是分类,把数据分类。 分类后的数据就不复杂了,这就是异而化同。 分类之后数据还是很多,怎么办呢?

第二步,分割。 分割就是把数据切分成小块, 这样就可以并发或者批量处理了, 这就是大而化小。

回到 map-reduce概念上, map的工作就是切分数据,然后给他们分类,分类的方式就是输出key,value对,key就是对应“类别”了。 分类之后,reducer拿到的都是同类数据,这样处理就很容易了。

Hadoop集群搭建

笔者是参考这篇博客完成的Hadoop集群搭建,文章介绍的比较详细,但还是有一些地方让新手无从下手,特此补充说明一下。

操作环境说明

  • 操作系统 Windows 7

sys

  • VMware虚拟机

vm

材料准备

  • VMware 12

下载链接:http://pan.baidu.com/s/1jHHQrIY 密码:j2an

  • Ubuntu14.04镜像64位

下载链接:http://pan.baidu.com/s/1o8sVU2Y 密码:v68e

  • JDK(Hadoop带有用Java语言编写的框架,因此需要JAVA环境)

下载链接:jdk-8u151-linux-x64.tar.gz

  • Hadoop环境包

下载链接:hadoop-2.7.4.tar.gz

读者自行学习VMware的基本操作以及Ubuntu虚拟机的安装。

搭建步骤

配置JAVA

将jdk-8u151-linux-x64.gz拷贝到Ubuntu虚拟机的一个文件夹中。这里笔者直接将压缩包放在home目录下,然后解压,生成文件夹jdk 1.8.0_151。

打开终端输入命令:

sudo mkdir /usr/lib/jvm/

mkdir

sudo cp -r ~/jdk1.8.0_151 /usr/lib/jvm

cp

添加环境变量

sudo gedit /etc/profile

在末尾加上四行:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_151
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

profile

输如命令使环境生效

source /etc/profile

输入命令查看环境是否配置成功

java –version

java

出现如上信息说明配置成功

SSH 安装以及配置

更新apt (由于是新系统可能会花一些时间)

sudo apt-get update

安装ssh

sudo apt-get install openssh-server

已有ssh或者安装成功了的输入命令

ps -e | grep ssh

grep

验证SSH是否成功安装输入

ssh localhost

出现以下提示说明安装成功

ssh

生成密钥Pair
ssh-keygen -t rsa

输入后一直回车选择默认即可

rsa

mater主机中输入命令复制一份公钥到home中

cp .ssh/id_rsa.pub ~/id_rsa_master.pub

ATTENTION PLEASE

到这一步后,一台虚拟机的基本环境已经配置完成了,根据Hadoop的调度规则,我们需要三个Ubuntu 虚拟机。没有必要单独重新制作其他的虚拟机,直接复制刚刚配置好的虚拟机的源文件再用Vmware打开即可,这样我们就得到了三个虚拟机:1台作为master,另外两台作为slave。

虚拟机1:Master Ubuntu 14.04 64bit 
虚拟机2:Slave1 Ubuntu 14.04 64bit 
虚拟机3:Slave2 Ubuntu 14.04 64bit

把master的home目录下的id_rsa_master.pub拷到slave1,slave2的home下。

然后在slave1和 slave2的home目录下分别输入命令

cat id_rsa_master.pub >> .ssh/authorized_keys

至此实现了mater对slave1, slave2的无密码登陆

以下配置将仅仅在master主机上进行

配置 Hadoop

为了配置方便,将hadoop-2.7.4.tar.gz压缩包也复制到home目录下,在此目录下解压得到hadoop-2.7.4文件夹。

在hadoop-2.7.4文件夹下创建文件,输入

cd hadoop-2.7.4
mkdir tmp
mkdir hdfs
cd hdfs
mkdir name
mkdir data

输入命令查看ip地址

ifconfig -a

ifconfig

eg. 笔者所使用的IP地址

虚拟机1:Master   222.28.46.123
虚拟机2:Slave1   222.28.46.63
虚拟机3:Slave2   222.28.46.205

修改hosts

sudo gedit /etc/hosts

具体IP地址由上面给出,可根据自己的配置情况自行调整

hosts

为了方便,修改hostname

sudo gedit /etc/hostname

master 的改为 master
slave1 的改为 slave1
slave2 的改为 slave2

修改环境变量
cd ~/hadoop-2.7.4/

(1)hadoop-env.sh

gedit etc/hadoop/hadoop-env.sh

找到JAVA_HOME=… 一行修改为JAVA HOME的路径

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_151

(2)core-site.xml

gedit etc/hadoop/core-site.xml

在configuration标签中添加

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

    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/fantasy/hadoop-2.7.4/tmp</value>
    </property>

(3)mapred-site.xml

创建并编辑

cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml
gedit etc/hadoop/mapred-site.xml

在configuration标签中添加

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

    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/fantasy/hadoop-2.7.4/tmp</value>
    </property>

(4)hdfs-site.xml

gedit etc/hadoop/hdfs-site.xml

在configuration标签中添加

    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/fantasy/hadoop-2.7.4/hdfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/fantasy/hadoop-2.7.4/hdfs/data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master:9001</value>
    </property>

(5)yarn-site.xml

gedit etc/hadoop/yarn-site.xml

在configuration标签中添加

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>master:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>master:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>master:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>master:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>master:8088</value>
    </property>

(6)master文件

gedit etc/hadoop/master

新建master文件,并加入master字段

(7)slaves文件

gedit etc/hadoop/slaves

删除原有内容,根据配置修改,此处为

slave1
slave2

分发配置好的hadoop文件夹到slave1, slave2

前提是设置好ssh

scp -r hadoop-2.7.4 fantasy@slave1:~/ 
scp -r hadoop-2.7.4 fantasy@slave2:~/ 

格式化hdfs
进入hadoop home目录

bin/hdfs namenode -format

启动集群

sbin/start-all.sh

启动后分别在master, slave下输入jps查看进程

master

master

slave1

slave1

salve2

slave2

如上则说明启动成功

运行wordcount测试集群

进入hadoop home目录

cd ~/hadooop-2.7.4

在hdfs(分布式文件系统)中创建一个名为input的文件夹

bin/hadoop fs –mkdir /input

查看文件是否被创建

bin/hadoop fs –ls /

hadoop home 下创建一个inputfile 文件夹,并在inputfile里创建两个文件

in1.txt

Hello world hello hadoop

in2.txt

Hello Hadoop hello whatever

上传两个文件进input

bin/hadoop fs -put inputfiles/*.txt /input

查看输入文件是否传入

bin/hadoop fs -ls /input

inp

用hadoop jar命令运行Hadoop自带的wordcount

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /input /output

part1

part2

程序开始运行,成功后查看输出文件夹

bin/hadoop fs -ls /output

output

查看结果

bin/hadoop fs -cat /output/part-r-00000

result

每个单词出现的次数确实与输入一致

至此hadoop分布式集群配置完成!

Tips

  • name node is in safe mode
    解决办法
bin/hadoop dfsadmin -safemode leav

就可以把safemode解除

  • 主从机的/etc/hosts要一致
  • 为了避免每次输入密码,可以删除防火墙
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值