搭建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
- VMware虚拟机
材料准备
- 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/
sudo cp -r ~/jdk1.8.0_151 /usr/lib/jvm
添加环境变量
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
输如命令使环境生效
source /etc/profile
输入命令查看环境是否配置成功
java –version
出现如上信息说明配置成功
SSH 安装以及配置
更新apt (由于是新系统可能会花一些时间)
sudo apt-get update
安装ssh
sudo apt-get install openssh-server
已有ssh或者安装成功了的输入命令
ps -e | grep ssh
验证SSH是否成功安装输入
ssh localhost
出现以下提示说明安装成功
生成**Pair
ssh-****** -t 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
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地址由上面给出,可根据自己的配置情况自行调整
为了方便,修改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
slave1
salve2
如上则说明启动成功
运行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 jar命令运行Hadoop自带的wordcount
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar wordcount /input /output
程序开始运行,成功后查看输出文件夹
bin/hadoop fs -ls /output
查看结果
bin/hadoop fs -cat /output/part-r-00000
每个单词出现的次数确实与输入一致
至此hadoop分布式集群配置完成!
Tips
- name node is in safe mode
解决办法
bin/hadoop dfsadmin -safemode leav
就可以把safemode解除
- 主从机的
/etc/hosts
要一致 - 为了避免每次输入密码,可以删除防火墙