一、Hadoop概述
1.简介
hadoop是一个开源分布式计算平台框架基于apache协议发布由java语言开发。http://hadoop.apache.org/
2.hadoop组件介绍
HDFS分布式文件系统为分布式计算提供了数据存储
Mapreduce应用程序被分区成许多小部分而每个部分都能在集群中的任意节点上运行一句话就是任务的分解和结果的汇总
Common为其他组件提供常用工具支持
YARN 作业调度和集群管理的框架
Ambari 就是创建、管理、监视 Hadoop 的集群
Avro基于二进制数据传输高性能的中间件
Cassandra可扩展的多主数据库不存在单点故障。
Chukwa是数据收集系统用于监控和分析大型分布式系统的数据。
HBase是一个分布式面向列的数据库。
Hive最早由facebook设计是建立在hadoop基础之上的数据仓库它提供了一些用于数据整理、特殊查询和分析在hadoop文件中数据集工具。
Mahout可扩展的机器学习和数据挖掘库。
Pig是一种高级语言和并行计算可执行框架它是一个对大型数据集分析和评估的平台。
Spark一个快速和通用计算的Hadoop数据引擎。和mapreduce类似但是要比mapreduce快。它提供了一个简单而丰富的编程模型支持多种应用包括ETL、机器学习、数据流处理、图形计算
Tez是Apache最新的支持DAG作业的开源计算框架它可以将多个有依赖的作业转换为一个作业从而大幅提升DAG作业的性能。
ZooKeeperZooKeeper是一组工具用来配置和支持分布式调度。一个重要功能就是对所有节点进行配置的同步。
二、HDFS
1.概述
HDFS设计思想来源于Google的GFS是GFS的开源实现。
HDFS要解决的问题存储超大文件比如TB级别 防止文件丢失
HDFS的优点
(1) 可以存储超大文件
(2) 只允许对一个已经打开的文件顺序写入还可以在现有文件的末尾追加。要想修改一个文件追加内容除外只能删除后再重写
(3) 可以使用廉价的硬件平台搭建通过容错策略来保证数据的高可用默认存储3份数据任何一份丢失可以自动恢复
HDFS的缺点
(1) 数据访问延迟比较高因为它的设计场景是用于大吞吐量数据HDFS是单master所有文件都要经过它当请求数据量很大时延迟就增加了
(2)文件数受限和NameNode有关系
(3) 不支持多用户写入也不支持文件任意修改
2.架构
3.核心概念
数据块block大文件会被分割成多个block进行存储block大小默认为64MB。每一个block会在多个datanode上存储多份副本默认是3份。
namenodenamenode负责管理文件目录、文件和block的对应关系以及block和datanode的对应关系。
SecondaryNameNode分担namenode的工作量是NameNode的冷备份它的主要工作是合并fsp_w_picpath元数据镜像文件和fsedits元数据操作日志然后再发给namenode。
datanodedatanode就负责存储了当然大部分容错机制都是在datanode上实现的。
rack 是指机柜的意思一个block的三个副本通常会保存到两个或者两个以上的机柜中当然是机柜中的服务器这样做的目的是做防灾容错因为发生一个机柜掉电或者一个机柜的交换机挂了的概率还是蛮高的。
4.HDFS写流程
HDFS写文件流程
Client向远程的Namenode发起RPC请求
Namenode会检查要创建的文件是否已经存在创建者是否有权限进行操作成功则会为文件 创建一个记录否则会让客户端抛出异常
当客户端开始写入文件的时候会将文件切分成多个packets并向Namenode申请blocks获取用来存储replicas的合适的datanodes列表列表的大小根据在Namenode中对replication的设置而定。
此时会形成一个pipline用来传输packet。
packet以流的方式写入第一个datanode该datanode把packet存储之后再将其传递给下一个datanode直到最后一个datanode。
最后一个datanode成功存储之后会返回一个ack 传递至客户端在客户端客户端确认ack后继续写入下一个packet。
如果传输过程中有某个datanode出现了故障那么当前的pipeline会被关闭出现故障的datanode会从当前的pipeline中移除剩余的block会继续剩下的datanode中继续以pipeline的形式传输同时Namenode
5.HDFS读流程
HDFS读文件流程
Client向远程的Namenode发起RPC请求
Namenode会视情况返回文件的部分或者全部block列表对于每个blockNamenode都会返回有该block拷贝的DataNode地址
Client会选取离自己最接近的DataNode来读取block
读取完当前block的数据后关闭与当前的DataNode连接并为读取下一个block寻找最佳的DataNode
当读完列表的block后且文件读取还没有结束client会继续向Namenode获取下一批的block列表
读取完block会进行checksum验证如果读取datanode时出现错误客户端会通知Namenode然后再从下一个拥有该block拷贝的datanode继续读
6.MapReduce模型
MapReduce 是大规模数据TB 级计算的利器Map 和Reduce 是它的主要思想来源于函数式编程语言。
Map负责将数据打散Reduce负责对数据进行聚集用户只需要实现map 和reduce 两个接口即可完成TB级数据的计算。
常见的应用包括日志分析和数据挖掘等数据分析应用。另外还可用于科学数据计算如圆周率PI 的计算等。
当我们提交一个计算作业时MapReduce会首先把计算作业拆分成若干个Map 任务然后分配到不同的节点上去执行每一个Map 任务处理输入数据中的一部分当Map 任务完成后它会生成一些中间文件这些中间文件将会作为Reduce 任务的输入数据。Reduce 任务的主要目标就是把前面若干个Map 的输出汇总到一起并输出。
7.MapReduce 执行过程
Mapper 任务的执行过程
每个 Mapper 任务是一个 java 进程它会读取 HDFS 中的文件解析成很多的键值对经过我们 map 方法处理后 转换为很多的键值对再输出
把 Mapper 任务的运行过程分为六个阶段
第一阶段是把输入文件按照一定的标准分片(InputSplit)每个输入片的大小是固定的。
第二阶段是对输入片中的记录按照一定的规则解析成键值对。
第三阶段是调用 Mapper 类中的 map 方法。
第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。
第五阶段是对每个分区中的键值对进行排序。
第六阶段是对数据进行归纳处理也就是 reduce 处理。键相等的键值对会调用一次reduce 方法。
Reducer任务的执行过程
每个 Reducer 任务是一个 java 进程。Reducer 任务接收 Mapper 任务的输出归约处理后写入到 HDFS 中。
可以分为3个阶段
第一阶段是 Reducer 任务会主动从 Mapper 任务复制其输出的键值对。 Mapper 任务可能会有很多因此 Reducer 会复制多个 Mapper 的输出。
第二阶段是把复制到 Reducer 本地数据全部进行合并即把分散的数据合并成一个大的数据。再对合并后的数据排序。
第三阶段是对排序后的键值对调用 reduce 方法。 键相等的键值对调用一次 reduce 方法每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到 HDFS 文件中。
三、Hadoop安装
1.准备工作
三台机器内存大于2G分别写hosts、设定hostname
192.168.1.211 master
192.168.1.212 slave1
192.168.1.213 slave2
关闭selinux和iptables
2.软件信息
hadoop2.6下载地址http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.6.4/hadoop-2.6.4.tar.gz
JDK1.8下载地址http://pan.baidu.com/s/1nvhbWGL
3.配置SSH密钥登录本机和两台slave
yum install -y openssh-clients
master上生成密钥对
ssh-keygen 一直回车
复制~/.ssh/id_rsa.pub 内容到本机和两台slave的 ~/.ssh/authorized_keys
设置本机和两台slave机器上的~/.ssh/authorized_keys文件权限为600
chmod 600 ~/.ssh/authorized_keys
效果
在master可以直接 ssh slave1和slave2
4.安装jdk(所有机器
cd /usr/local/src/ tar xf jdk-8u71-linux-x64.tar.gz mv jdk1.8.0_71/ /usr/local/
=============================
vim /etc/profile.d/java.sh #编写环境变量配置 export JAVA_HOME=/usr/local/jdk1.8.0_71 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin
===========================
source /etc/profile.d/java.sh java -version
5.安装Hadoop
在master上执行:
tar xf hadoop-2.6.4.tar.gz mv hadoop-2.6.4 /usr/local/hadoop cd /usr/local/hadoop/ mkdir tmp dfs dfs/data dfs/name rsync -av /usr/local/hadoop slave1:/usr/local/ rsync -av /usr/local/hadoop slave2:/usr/local/
6.master上配置
vim /usr/local/hadoop/etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://192.168.1.231:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> </property> <property> <name>io.file.buffer.size</name> <value>131702</value> </property> </configuration>
------------------------------
vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>192.168.1.231:9001</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> </configuration>
-----------------------------
cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml vim /usr/local/hadoop/etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>192.168.1.231:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>192.168.1.231:19888</value> </property> </configuration>
------------------------------
vim /usr/local/hadoop/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>192.168.1.231:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>192.168.1.231:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>192.168.1.231:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>192.168.1.231:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>192.168.1.231:8088</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>768</value> </property> </configuration>
===================================================
#配置JDK目录
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh export JAVA_HOME=/usr/local/jdk1.8.0_71 vim /usr/local/hadoop/etc/hadoop/yarn-env.sh export JAVA_HOME=/usr/local/jdk1.8.0_71
===================================================
#指定slave主机
vim /usr/local/hadoop/etc/hadoop/slaves 192.168.1.232 192.168.1.233
===================================================
#将master上的etc目录同步至两个slave
rsync -av /usr/local/hadoop/etc/ slave1:/usr/local/hadoop/etc/ rsync -av /usr/local/hadoop/etc/ slave2:/usr/local/hadoop/etc/
7.启动服务
在master上操作即可两个slave会自动启动
/usr/local/hadoop/bin/hdfs namenode -format #初始化 /usr/local/hadoop/sbin/start-all.sh #启动服务 /usr/local/hadoop/sbin/stop-all.sh #停止服务
#访问:
浏览器打开http://ip:8088/
浏览器打开http://ip:50070/
=================================================
#至此分布式集群搭建成功
[root@master hadoop]# jps
2144 ResourceManager
1845 NameNode
3142 Jps
2010 SecondaryNameNode