欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

搭建Hadoop集群

程序员文章站 2022-05-07 18:57:15
...

分布式和集群

分布式系统和集群的关系

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

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

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

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

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

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

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

搭建Hadoop集群

  • VMware虚拟机

搭建Hadoop集群

材料准备

  • 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/

搭建Hadoop集群

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

搭建Hadoop集群

添加环境变量

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

搭建Hadoop集群

输如命令使环境生效

source /etc/profile

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

java –version

搭建Hadoop集群

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

SSH 安装以及配置

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

sudo apt-get update

安装ssh

sudo apt-get install openssh-server

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

ps -e | grep ssh

搭建Hadoop集群

验证SSH是否成功安装输入

ssh localhost

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

搭建Hadoop集群

生成**Pair

ssh-****** -t rsa

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

搭建Hadoop集群

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

搭建Hadoop集群

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地址由上面给出,可根据自己的配置情况自行调整

搭建Hadoop集群

为了方便,修改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

搭建Hadoop集群

slave1

搭建Hadoop集群

salve2

搭建Hadoop集群

如上则说明启动成功

运行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

搭建Hadoop集群

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

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

搭建Hadoop集群

搭建Hadoop集群

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

bin/hadoop fs -ls /output

搭建Hadoop集群

查看结果

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

搭建Hadoop集群

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

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

Tips

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

就可以把safemode解除

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