@TOC
1.初识Hadoop
大数据时代已经到来,越来越多的行业面临着大量数据需要存储以及分析的挑战。Hadoop,作为一个开源的分布式并行处理平台,以其高扩展、高效率、高可靠等优点,得到越来越广泛的应用。本课旨在培养学员理解Hadoop的架构设计以及掌握Hadoop的运用能力。
1.1前言
1.1.1课程名称
Hadoop大数据平台架构与实践
1.1.2主要内容
- 1.大数据的相关概念
- 2.Hadoop的架构和运行机制
- 3.实战:Hadoop的安装和配置
- 4.实战:Hadoop开发
1.1.3学习目标
- 掌握大数据存储与处理技术的原理(理论知识)
- 掌握Hadoop的使用和开发能力(实践能力)
1.1.4 课程学习建议
- 1.结合书本,知识点更加系统全面
对应的书本:hadoop技术详解、hadoop权威指南 - 2.实践经验很重要,边听课边实践。
1.1.5课程预备知识:
- linux常用命令
- java编程基础
1.2Hadoop的前世今生
1.2.1Hadoop基本概念
Hadoop是解决大数据的分布式集成架构。
当数据达到一定规模时,单机的存储和分析就变得非常困难,存储量和效率都无法达到用户的需求。
所以,为了解决大数据的存储和处理,Google提出了三大技术:
-
MapReduce
- 概念:"Map(映射)"和"Reduce(归约)",它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
-
BigTable
- 是Google设计的分布式数据存储系统,用来处理海量的数据的一种非关系型的数据库
-
GFS
- 是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。
Hadoop是模仿Google三大技术的开源实现。相比于Google之前的解决方案,它有如下优势:
- (1)降低成本,能用PC机就不用大型机和高端存储;
- (2)因为用的是PC机,所以经常发生硬件错误,所以通过软件来保证高可靠性;
- (3)简化了并行分布式计算。
1.2.2为什么取名Hadoop
创作者以他儿子一个黄色的玩具小象命名
1.3Hadoop的功能与优势
1.3.1 Hadoop是什么
是一个开源的、分布式存储和分布式计算平台
1.3.2Hadoop的两个核心组件
- 1.HDFS,分布式文件系统,存储海量数据。
- 2.MapReduce,并行处理框架,实现任务分解和调度。
1.3.3Hadoopk可以做什么
搭建大型数据仓库,PB级数据的存储、处理、分析、统计等业务。
1.3.3Hadoopk的优势
- 1.高扩展,理论上无限扩展
- 2.低成本
-
3.成熟的生态圈
1.3.4Hadoopk的应用
1.4Hadoop的生态系统与版本
1.4.1hadoop生态系统
- 1.hdfs分布式存储系统
- 2.mapreduce 大数据编程模型
- 3.相关开源工具:
- (1)hive:将sql语句转化为hadoop任务,降低使用hadoop的门槛
- (2)HBASE:存储结构化数据的分布式数据库,放弃事务特性,追求更高的扩展,它提供数据的随机读写和实时访问,实现对表数据的读写功能
注:和传统的关系型数据库的区别是放弃事务特性,追求更高的扩展、和HDFS的区别就是habse提供数据的随机读写和实时访问,实现对表数据的读写功能
- (3)zookeeper:监控Hadoop集群里的每个节点的状态,管理整个集群的配置,维护数据节点之间的一致性
1.4.2hadoop版本
- 1.x:稳定
- 2.x:不稳定
2.Hadoop的安装
- Step1:准备liunx环境;
- Step1:安装JDK;
- Step1:配置hadoop;
2.1准备liunx环境
两种方式:
- 1.本机先安装虚拟机,再安装linux
- 2.租用云主机,申请公网IP
2.2安装JDK
Linux 下下载安装JDK (centos)
//1、下载 :
yum install java-1.7.0-openjdk
//查看可升级下载的软件包
yum search java|grep jdk
//2、配置环境变量:
vim /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
//3、让配置生效
source /etc/profile
//4、测试
java -version
注解:
1.Linux下用冒号 : 分割路径
2.$PATH / $JAVA_HOME / $JRE_HOME 是用来引用原来环境变量的值,在设置环境变量时不能把原来的值给覆盖掉
3.$CLASSPATH 中 当前目录 “.”不能丢
4.export 是把这4个变量导出为全局变量
2.3配置Hadoop
2.3.1安装总结
- 1.下载hdoop按照包并进行解压
- 2.配置hdoop-env.sh文件,目的是配置jdk,并在profile配置haddoop的安装位置
- 3.配置core-site.xml文件:hdoop的核心文件,里面有关于hdoop的节点端口与主机端口
- 4.配置hdfs-site.xml文件:hdoop的文件存储的基本信息与目录
- 5.配置mapred-site.xml文件:hadoop的计算节点的端口号
- 6.启动hadoop:start-all.sh
- 7.查看端口:jps,可以看到五大守护进程说明正确
- 8.停止hdoop:stop-all.sh
2.3.2安装细节
- 1、下载Hadoop安装包 ,两种方式
- 方式一:官网下载好后,通过Xftp上传到Linux上,下载地址http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
- 方式一:通过 wget命令直接下载到Linux服务器上
$ wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-1.2.1/hadoop-1.2.1.tar.gz
- 2、解压到指定目录下;
- 移动文件:
$ mv 文件 /opt - 解压:
$ tar -zxvf hadoop-1.2.1.tar.gz
- 移动文件:
- 3、配置hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml四个文件
//1、hadoop-env.sh
配置java 环境变量的地址
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
//2、 core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop</value>
</property>
</configuration>
<property>
<name>dfs.name.dir</name>
<value>/hadoop/name</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://imooc:9000</value>
</property>
//3、hdfs-site.xml配置
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data</value>
</property>
//4、mapred-site.xml配置
<property>
<name>mapred.job.tracker</name>
<value>imooc:9001</value>
</property>
- 4、编辑/etc/profile文件,配置hadoop相关的环境变量
vim /etc/profile
添加hadoop的HADOOP_PATH
export HADOOP_PATH="安装目录"
PATH里面添加$HADOOP_HOME/bin:$PATH
//让配置生效
source /etc/profile
//测试是否安装成功
hadoop
- 5、第一次使用hadoop先进行格式化
//对namenode 进行格式化
$ hadoop namenode -format;
- 6、启动hadoop
start-all.sh -
7、检查进程:jps
// 查看hadoop文件系统下下有哪些文件
hadoop fs -ls
3.Hadoop的核心-HDFS简介
3.1HDFS基本概念
- HDFS设计架构:
- 块:文件以“块”进行存储,HDFS默认块大小为64M
- namenode:是管理节点,存放文件元数据,包括文件与数据块的映射表、数据块与数据节点的映射表
- datenode:工作节点,真正存储数据块
最终体系结构:由block、namenode、datanode、secondarynamenode、client组成
HDFS的文件被分成块进行存储,HDFS块默认大小是64MB,块是整个文件存储处理的逻辑单元。
HDFS最终体系结构:由block、namenode、datanode、secondarynamenode、client组成。
3.2HDFS数据管理与容错
为保证硬件上的容错,数据块有多份冗余。
- 数据块副本:每个数据块3个副本,分布在2机架3节点上(容错性)
- 心跳检测:DataNode定期向NameNode发心跳消息。
- 二级NameNode:NameNdoe定期同步元数据映像文件到二级NameNode(secondryNameNode),一旦故障,备胎转正。
3.2HDFS读写文件的流程
- HDFS读取文件的流程:
- (1)客户端向namenode发起独立请求,把文件名,路径告诉namenode;
- (2)namenode查询元数据,并把数据库返回客户端;
-
(3)此时客户端就明白文件包含哪些块,这些块在哪些datanode中可以找到;
- HDFS写文件流程:
- (1)客户端把文件拆分成固定大小64M的块,并通知namenode;
- (2)namenode找到可用的datanode返回给客户端;
- (3)客户端根据返回的datanode,对块进行写入;
- (4)通过流水线管道流水线复制;
-
(5)更新元数据。告诉namenode已经完成了创建心的数据块,保证了namenode中的元数据都是最新的状态。
3.2HDFS的特点
- HDFS特点:
- 1、数据冗余,硬件容错(一式三份来保证)。
- 2、流式数据访问:写一次,读多次,一旦写入无法修改,只能通过写入到新的块删除旧文件。
- 3、存储大文件(特适合,因为小文件多,势必加重NameNode的负担)。
- HDFS适用性及局限性:
- 1、适合数据批量读写,吞吐量高;
- 2、不适合交互式应用、低延迟很难满足;
- 3、适合一次写入多次读取、顺序读写;
- 4、不支持多用户并发写相同文件。
- HDFS优缺点:
- 优点:存储块大,吞吐量高,为存储大文件设计;
- 缺点:延迟高,不适合交互式访问,不支持多用户同时操作一个块。
3.3HDFS的使用
- 提供了 shell 接口,可以进行命令行操作
hadoop namenode -format #格式化namenode
hadoop fs -ls / #打印 / 目录文件列表
hadoop fs -mkdir input #创建目录 input
hadoop fs -put hadoop-env.sh input/ #上传文件 hadoop-env.sh 到 input 目录下
hadoop fs -get input/abc.sh hadoop-envcomp.sh #从 input 目录中下载文件
hadoop fs -cat input/hadoop-env.sh #查看文件 input/hadoop-env.sh
hadoop dfsadmin -report #dfs报告
4.Hadoop的核心-MapReduce原理与实现
4.1MapReduce的原理
- MapReduce原理:分而治之,一个大任务分成多个子任务(map),并行执行之后,合并结果(reduce)。
eg:做统计的时候,把统计的文件拆分,然后分别统计每一个数据出现的次数,然后合并拆分项,就可以统计每一个数据出现的总次数。
MapReduce处理数据过程主要分成2个阶段:Map阶段和Reduce阶段。首先执行Map阶段,再执行Reduce阶段。Map和Reduce的处理逻辑由用户自定义实现,但要符合MapReduce框架的约定。
正式执行Map前,需要将输入数据进行”分片”。所谓分片,就是将输入数据切分为大小相等的数据块,每一块作为单个Map Worker的输入被处理,以便于多个Map Worker同时工作。分片完毕后,多个Map Worker就可以同时工作了。每个Map Worker在读入各自的数据后,进行计算处理,最终输出给Reduce。Map Worker在输出数据时,需要为每一条输出数据指定一个Key。这个Key值决定了这条数据将会被发送给哪一个Reduce Worker。Key值和Reduce Worker是多对一的关系,具有相同Key的数据会被发送给同一个Reduce Worker,单个Reduce Worker有可能会接收到多个Key值的数据。
-
在进入Reduce阶段之前,MapReduce框架会对数据按照Key值排序,使得具有相同Key的数据彼此相邻。如果用户指定了”合并操作”(Combiner),框架会调用Combiner,将具有相同Key的数据进行聚合。Combiner的逻辑可以由用户自定义实现。这部分的处理通常也叫做”洗牌”(Shuffle)。
接下来进入Reduce阶段。相同的Key的数据会到达同一个Reduce Worker。同一个Reduce Worker会接收来自多个Map Worker的数据。每个Reduce Worker会对Key相同的多个数据进行Reduce操作。最后,一个Key的多条数据经过Reduce的作用后,将变成了一个值。
4.2MapReduce的运行流程
4.2.1. 原理
- 分而治之 的思想,一个大任务分成多个小任务(map),并行执行后,合并结果(reduce).
4.2.2 运行流程
- 基本概念:
- Job & Task:
一个 Job(任务、作业) 被切分为多个 Task,Task 又分为 MapTask 和 ReduceTask - JobTracker
作业调度
分配任务、监控任务
监控 TaskTracker 的状态 - TaskTracker
执行任务
向 JobTracker 汇报任务状态
- Job & Task:
4.2.3 容错机制
- 重复执行:
默认重复执行 4 次,若还是失败,则放弃执行 - 推测执行:
可以保证任务不会因为某1-2个机器错误或故障而导致整体效率下降
5.开发Hadoop应用程序
5.1WordCount单词计数(上)
- 计算文件中出现每个单词的频数,输入结果按照字母顺序进行排序。利用mapReduce的思想,来计算输入的单词的个数。
- Map过程:分而治之
-
Reduce过程:合并
5.2WordCount单词计数(中)
- 分析源代码
- 代码其实在hadoop的安装目录下有example,一般的目录是/hadoop/src/examples/org/apache/hadoop/examples/WordCount.jar
- 源代码 http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html
5.3WordCount单词计数(下)
5.3.1整体流程
- 1.编写WordCount.java,包含Mapper类和Reducec类;
- 2.编译WordCount.java,java -classpath ;
- 3.打包 jar -cvf WordCount.jar classes/*;
- 4.作业提交 hadoop jar WordCount.jar WordCount input output;
- 提交到hadoop中运行,指定输入文件 ,指定输出文件。
5.3.2具体流程
//(1)启动hadoop
start -all.sh
//(2)rz把某某.java类放到根目录下/opt/根目录下边或者根目录下任意文件
cd /mkdir project_hadoop/
rz 类路径添加
//(3)cd 新创建的文件,创建file1和file2
mkdir input
vi file1
vi file2
ls project_hadoop
//(4)创建文件
hadoop fs -mkdir input_wordcount
//(5)创建目录:
hadoop fs -mkdir input
//查看文件:
hadoop fs -ls
hadoop fs -ls input_wordcount
//(6)把file1和file2文件放到input_wordcount
提交输入文件给hadoop
hadoop fs -put 文件路径 提交后的路径
//例:
hadoop fs -put input/input_wordcount/
//(7)查看文件
hadoop fs -ls input_wordcount
fs -cat input_wordcount/file1
fs -cat input_wordcount/file2
//(8)编译java文件
javac -classpath /opt/hadoop-1.2.1/hadoop-core-1.2.1.jar:/opt/hadoop-1.2.1/lib/commons-cli-1.2.jar -d 编译后地址 编译文件
//(9)打包指令
jar -cvf 打包后文件名.jar 某某.class
jar -cvf wordcount.jar *.class
//(10)提交jar给hadoop执行
hadoop jar jar包路径 执行的主函数名(主类名,main方法所在类名) 输入目录名 输出目录名
//例:
hadoop jar project_hadoop/wordcount.jar WordCount input_wordcount output_wordcount
//(11)查看通过算法计算出单词个数的结果
fs -cat output_wordcount/part-r-00000
5.4利用MapReduce进行排序(上)
-
先分片,再排序
5.5利用MapReduce进行排序(下)
- 分析代码
注:配合慕课网视频使用更佳
链接: 点击跳转.