1. HADOOP背景介绍

1.1 什么是HADOOP

  1. HADOOP是apache旗下的一套开源软件平台

  2. HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理

  3. HADOOP的核心组件有

    1. HDFS(分布式文件系统)

    2. YARN(运算资源调度系统)

    3. MAPREDUCE(分布式运算编程框架)

  4. 广义上来说,HADOOP通常是指一个更广泛的概念——HADOOP生态圈

HADOOP快速入门 - 图2

1.2 HADOOP产生背景

  1. HADOOP最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。

  2. 2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案

  1. --分布式文件系统(GFS),可用于处理海量网页的**存储**<br /> --分布式计算框架MAPREDUCE,可用于处理海量网页的**索引计算**问题。
  1. Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目,迎来了它的快速发展期。

HADOOP快速入门 - 图3

1.3HADOOP就业职位要求

  1. HADOOP分布式集群的平台搭建

  2. HADOOP分布式文件系统HDFS的原理理解及使用

  3. HADOOP分布式运算框架MAPREDUCE的原理理解及编程

  4. Hive数据仓库工具的熟练应用

  5. Flume、sqoop、oozie等辅助工具的熟练使用

  6. Shell/python等脚本语言的开发能力

1.4 HADOOP生态圈以及各组成部分的简介

HADOOP快速入门 - 图4

重点组件:
HDFS:分布式文件系统
MAPREDUCE:分布式运算程序开发框架
HIVE:基于大数据技术(文件系统+运算框架)的SQL数据仓库工具
HBASE:基于HADOOP的分布式海量数据库
ZOOKEEPER:分布式协调服务基础组件
Mahout:基于mapreduce/spark/flink等分布式运算框架的机器学习算法库
Oozie:工作流调度框架
Sqoop:数据导入导出工具
Flume:日志数据采集框架

2 分布式系统概述

注:由于大数据技术领域的各类技术框架基本上都是分布式系统,因此,理解hadoop、storm、spark等技术框架,都需要具备基本的分布式系统概念

2.1 分布式软件系统(Distributed Software Systems)

  • 该软件系统会划分成多个子系统或模块,各自运行在不同的机器上,子系统或模块之间通过网络通信进行协作,实现最终的整体功能

  • 比如分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。

2.2 分布式软件系统举例:solrcloud

  1. 一个solrcloud集群通常有多台solr服务器

  2. 每一个solr服务器节点负责存储整个索引库的若干个shard(数据分片)

  3. 每一个shard又有多台服务器存放若干个副本互为主备用

  4. 索引的建立和查询会在整个集群的各个节点上并发执行

  5. solrcloud集群作为整体对外服务,而其内部细节可对客户端透明

总结:利用多个节点共同协作完成一项或多项具体业务功能的系统就是分布式系统。

2.3 分布式应用系统模拟开发

需求:可以实现由主节点将运算任务发往从节点,并将各从节点上的任务启动;
程序清单:
AppMaster
AppSlave/APPSlaveThread
Task
程序运行逻辑流程:
HADOOP快速入门 - 图5

3. 离线数据分析流程介绍

注:本环节主要感受数据分析系统的宏观概念及处理流程,初步理解hadoop等框架在其中的应用环节,不用过于关注代码细节

一个应用广泛的数据分析系统:“web日志数据挖掘”
HADOOP快速入门 - 图6

3.1 需求分析

3.1.1 案例名称

“网站或APP点击流日志数据挖掘系统”。

3.1.2 案例需求描述

“Web点击流日志”包含着网站运营很重要的信息,通过日志分析,我们可以知道网站的访问量,哪个网页访问人数最多,哪个网页最有价值,广告转化率、访客的来源信息,访客的终端信息等。

3.1.3 数据来源

本案例的数据主要由用户的点击行为记录
获取方式:在页面预埋一段js程序,为页面上想要监听的标签绑定事件,只要用户点击或移动到标签,即可触发ajax请求到后台servlet程序,用log4j记录下事件信息,从而在web服务器(nginx、tomcat等)上形成不断增长的日志文件。
形如:

58.215.204.118 - - [18/Sep/2013:06:51:35 +0000] “GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1” 304 0 “http://blog.fens.me/nodejs-socketio-chat/“ “Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0”

3.2 数据处理流程

3.2.1 流程图解析

本案例跟典型的BI系统极其类似,整体流程如下:
HADOOP快速入门 - 图7
但是,由于本案例的前提是处理海量数据,因而,流程中各环节所使用的技术则跟传统BI完全不同,后续课程都会一一讲解:

  1. 数据采集:定制开发采集程序,或使用开源框架FLUME

  2. 数据预处理:定制开发mapreduce程序运行于hadoop集群

  3. 数据仓库技术:基于hadoop之上的Hive

  4. 数据导出:基于hadoop的sqoop数据导入导出工具

  5. 数据可视化:定制开发web程序或使用kettle等产品

  6. 整个过程的流程调度:hadoop生态圈中的oozie工具或其他类似开源产品

3.2.2 项目技术架构图HADOOP快速入门 - 图8

3.2.3 项目相关截图(感性认识,欣赏即可)

  1. Mapreudce程序运行

HADOOP快速入门 - 图9

  1. 在Hive中查询数据

HADOOP快速入门 - 图10

  1. 将统计结果导入mysql

./sqoop export —connect jdbc:mysql://localhost:3306/weblogdb —username root —password root —table t_display_xx —export-dir /user/hive/warehouse/uv/dt=2014-08-03

3.3 项目最终效果

经过完整的数据处理流程后,会周期性输出各类统计指标的报表,在生产实践中,最终需要将这些报表数据以可视化的形式展现出来,本案例采用web程序来实现数据可视化
效果如下所示:
HADOOP快速入门 - 图11

4. 集群搭建

4.1 HADOOP集群搭建

4.1.1集群简介

HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起

HDFS集群:

负责海量数据的存储,集群中的角色主要有 NameNode / DataNode

YARN集群:

负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager
(那mapreduce是什么呢?它其实是一个应用程序开发包)
HADOOP快速入门 - 图12
NameNode和JobTracker属于Master,DataNode和TaskTracker属于Slave.
通常Secondary NameNode(运行在单独的物理机器上)和NameNode运行在不同的机器上.
Hadoop是一个能够对大量数据进行分布式处理的软件框架,实现了Google的MapReduce编程模型和框架,能够把应用程序分割成许多的 小的工作单元,并把这些单元放到任何集群节点上执行。在MapReduce中,一个准备提交执行的应用程序称为“作业(job)”,而从一个作业划分出 得、运行于各个计算节点的工作单元称为“任务(task)”。此外,Hadoop提供的分布式文件系统(HDFS)主要负责各个节点的数据存储,并实现了 高吞吐率的数据读写。  在分布式存储和分布式计算方面,Hadoop都是用主/从(Master/Slave)架构。在一个配置完整的集群上,想让Hadoop这头大 象奔跑起来,需要在集群中运行一系列后台(deamon)程序。不同的后台程序扮演不用的角色,这些角色由NameNode、DataNode、 Secondary NameNode、JobTracker、TaskTracker组成。其中NameNode、Secondary NameNode、JobTracker运行在Master节点上,而在每个Slave节点上,部署一个DataNode和TaskTracker,以便 这个Slave服务器运行的数据处理程序能尽可能直接处理本机的数据。对Master节点需要特别说明的是,在小集群中,Secondary NameNode可以属于某个从节点;在大型集群中,NameNode和JobTracker被分别部署在两台服务器上
NameNode:hadoop主服务器
Namenode 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是Namespace 镜像文件(Namespace image)和操作日志文件(edit log),这些信息被Cache在RAM中,当然,这两个文件也会被持久化存储在本地硬盘。Namenode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建。

DataNode
Datanode是文件系统的工作节点,他们根据客户端或者NameNode实行调度存储检索数据,并且定期向namenode发送他们所存储的块(block)的列表。集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通 信,并且对相关的数据块进行读/写操作.

Secondary NameNode:
SecondaryNameNode是一个用来监控HDFS状态的辅助后台程序。就想NameNode一样,每个集群都有一个Secondary NameNode,并且部署在一个单独的服务器上。Secondary NameNode不同于NameNode,它不接受或者记录任何实时的数据变化,但是,它会与NameNode进行通信,以便定期地保存HDFS元数据的快照。由于NameNode是单点的,通过SecondaryNameNode的快照功能,可以将NameNode的宕机时间和数据损失降低到最小。同时,如果NameNode发生问题,Secondary NameNode可以及时地作为备用NameNode使用。
JobTracker:
JobTracker后台程序用来连接应用程序与Hadoop。用户代码提交到集群以后,由JobTracker决定哪个文件将被处理,并且为 不同的task分配节点。同时,它还监控所有的task,一旦某个task失败了,JobTracker就会自动重新开启这个task,在大多数情况下这 个task会被放在不用的节点上。每个Hadoop集群只有一个JobTracker,一般运行在集群的Master节点上。
TaskTracker:
TaskTracker与负责存储数据的DataNode相结合,其处理结构上也遵循主/从架构。JobTracker位于主节点,统领 MapReduce工作;而TaskTrackers位于从节点,独立管理各自的task。每个TaskTracker负责独立执行具体的task,而 JobTracker负责分配task。虽然每个从节点仅有一个唯一的一个TaskTracker,但是每个TaskTracker可以产生多个java 虚拟机(JVM),用于并行处理多个map以及reduce任务。TaskTracker的一个重要职责就是与JobTracker交互。如果 JobTracker无法准时地获取TaskTracker提交的信息,JobTracker就判定TaskTracker已经崩溃,并将任务分配给其他节点处理。

ResourceManager:
负责集群上所有资源的统一管理和分配,处理来自客户端的请求,监控NodeManager并接收来自他的汇报,启动监控 ApplicationMaster并派送资源
ResourceManager是YARN分层结构的本质,承担了JobTracker的角色,这个实体控制整个集群并管理应用程序向基础计算资源的分配。将各个资源部分(计算、内存、带宽等)精心安排给基础NodeManager(YARN 的每节点代理),与ApplicationMaster一起分配资源,与NodeManager一起启动和监视它们的基础应用程序 .

NodeManager
1.跟踪节点健康状况和资源使用情况 (CPU,内存,硬盘,网络) ,与RM交换信息以确保整个集群平稳运行.
2.接收ResourceManager的资源分配请求,分配具体的Container给应用.
3.负责各个Container的终生管理,接收并处理来自ApplicationMaster的Container启动/停止等各种请求.
4.管理每个节点上的日志.
5.执行Yarn上面应用的一些额外的服务,比如MapReduce的shuffle过程.

4.1.2服务器准备

本案例使用虚拟机服务器来搭建HADOOP集群,所用软件及版本:

  • Vmware 11.0

  • Centos 6.5 64bit

4.1.3网络环境准备

  • 采用NAT方式联网

  • 网关地址:192.168.33.1

  • 3个服务器节点IP地址:192.168.33.101、192.168.33.102、192.168.33.103

  • 子网掩码:255.255.255.0

4.1.4服务器系统设置

  • 添加HADOOP用户

  • 同步时间

1.安装ntpdate工具 yum -y install ntp ntpdate
2.设置系统时间与网络时间同步 ntpdate cn.pool.ntp.org

  • 设置主机名

    • cdh1

    • Mini1

    • Mini2

  • 配置内网域名映射:

    • 192.168.133.11 cdh1

    • 192.168.133.22 Mini1

    • 192.168.133.33 Mini2

  • 配置ssh免密登陆

  • 配置防火墙

4.1.5 Jdk环境安装

  • 上传jdk安装包

  • 规划安装目录 /home/hadoop/apps/jdk_1.7.65

  • 解压安装包

  • 配置环境变量 /etc/profile

4.1.6 HADOOP安装部署

  • 上传HADOOP安装包

  • 规划安装目录 /home/hadoop/apps/hadoop-2.6.1

  • 解压安装包 tar -zxvf cenos-6.5-hadoop-2.6.4.tar.gz -C /root/apps

  • 修改配置文件 $HADOOP_HOME/etc/hadoop/

最简化配置如下:3
vi hadoop-env.sh

# The java implementation to use.
export JAVA_HOME=/root/apps/jdk1.7.0_51

vi core-site.xml



fs.defaultFS
hdfs://cdh1:9000


hadoop.tmp.dir
自己创建一个
/root/apps/hddata

vi hdfs-site.xml



dfs.namenode.name.dir
/home/hadoop/data/name


dfs.datanode.data.dir
/home/hadoop/data/data


dfs.replication
3


dfs.secondary.http.address
hdp-node-01:50090

vi mapred-site.xml



mapreduce.framework.name
yarn

vi yarn-site.xml



yarn.resourcemanager.hostname
cdh1


yarn.nodemanager.aux-services
mapreduce_shuffle

vi slaves

cdh1
Mini1
Mini2

4.1.7 启动集群

初始化HDFS

|
- bin/hadoop namenode -format
| | —- |

启动HDFS

|
- sbin/start-dfs.sh
| | —- |

启动YARN

sbin/start-yarn.sh

4.1.8 测试

1、上传文件到HDFS

从本地上传一个文本文件到hdfs的/wordcount/input目录下

[HADOOP@hdp-node-01 ~]$ HADOOP fs -mkdir -p /wordcount/input
[HADOOP@hdp-node-01~]$HADOOPfs -put /home/HADOOP/somewords.txt /wordcount/input

2、运行一个mapreduce程序

在HADOOP安装目录下,运行一个示例mr程序

hadoop jar mapredcue-example-2.6.1.jar wordcount /wordcount/input /wordcount/output

5 集群使用初步

5.1 HDFS使用

1、查看集群状态
命令: hdfs dfsadmin –report
HADOOP快速入门 - 图13
可以看出,集群共有3个datanode可用
也可打开web控制台查看HDFS集群信息,在浏览器打开http://hdp-node-01:50070/
HADOOP快速入门 - 图14
2、上传文件到HDFS

  • 查看HDFS中的目录信息

命令: hadoop fs –ls /
HADOOP快速入门 - 图15

  • 上传文件

命令: hadoop fs -put ./ scala-2.10.6.tgz to /
HADOOP快速入门 - 图16

  • 从HDFS下载文件

  • 命令: hadoop fs -get /yarn-site.xml

HADOOP快速入门 - 图17

5.2 MAPREDUCE使用

mapreduce是hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序

5.2.1 Demo开发——wordcount

1、需求
从大量(比如T级别)文本文件中,统计出每一个单词出现的总次数

2、mapreduce实现思路
Map阶段:

  1. 从HDFS的源数据文件中逐行读取数据

  2. 将每一行数据切分出单词

  3. 为每一个单词构造一个键值对(单词,1)

  4. 将键值对发送给reduce

Reduce阶段:

  1. 接收map阶段输出的单词键值对

  2. 将相同单词的键值对汇聚成一组

  3. 对每一组,遍历组中的所有“值”,累加求和,即得到每一个单词的总次数

  4. 将(单词,总次数)输出到HDFS的文件中

  5. 具体编码实现

(1)定义一个mapper类

//首先要定义四个泛型的类型
//keyin: LongWritable valuein: Text
//keyout: Text valueout:IntWritable

public class WordCountMapper extends Mapper{
//map方法的生命周期: 框架每传一行数据就被调用一次
//key : 这一行的起始点在文件中的偏移量
//value: 这一行的内容
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//拿到一行数据转换为string
String line = value.toString();
//将这一行切分出各个单词
String[] words = line.split(“ “);
//遍历数组,输出<单词,1>
for(String word:words){
context.write(new Text(word), new IntWritable(1));
}
}
}

(2)定义一个reducer类

//生命周期:框架每传递进来一个kv 组,reduce方法被调用一次
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
//定义一个计数器
int count = 0;
//遍历这一组kv的所有v,累加到count中
for(IntWritable value:values){
count += value.get();
}
context.write(key, new IntWritable(count));
}
}

(3)定义一个主类,用来描述job并提交job

public class WordCountRunner {
//把业务逻辑相关的信息(哪个是mapper,哪个是reducer,要处理的数据在哪里,输出的结果放哪里。。。。。。)描述成一个job对象
//把这个描述好的job提交给集群去运行
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job wcjob = Job.getInstance(conf);
//指定我这个job所在的jar包
// wcjob.setJar(“/home/hadoop/wordcount.jar”);
wcjob.setJarByClass(WordCountRunner.class);

wcjob.setMapperClass(WordCountMapper.class);
wcjob.setReducerClass(WordCountReducer.class);
//设置我们的业务逻辑Mapper类的输出key和value的数据类型
wcjob.setMapOutputKeyClass(Text.class);
wcjob.setMapOutputValueClass(IntWritable.class);
//设置我们的业务逻辑Reducer类的输出key和value的数据类型
wcjob.setOutputKeyClass(Text.class);
wcjob.setOutputValueClass(IntWritable.class);

//指定要处理的数据所在的位置
FileInputFormat.setInputPaths(wcjob, “hdfs://hdp-server01:9000/wordcount/data/big.txt”);
//指定处理完成之后的结果所保存的位置
FileOutputFormat.setOutputPath(wcjob, new Path(“hdfs://hdp-server01:9000/wordcount/output/“));

//向yarn集群提交这个job
boolean res = wcjob.waitForCompletion(true);
System.exit(res?0:1);
}

5.2.2 程序打包运行

  1. 将程序打包

  2. 准备输入数据

vi /home/hadoop/test.txt

Hello tom
Hello jim
Hello ketty
Hello world
Ketty tom

在hdfs上创建输入数据文件夹:
hadoop fs mkdir -p /wordcount/input
将words.txt上传到hdfs上
hadoop fs –put /home/hadoop/words.txt /wordcount/input
HADOOP快速入门 - 图18

  1. 将程序jar包上传到集群的任意一台服务器上

  2. 使用命令启动执行wordcount程序jar包

    • $ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

HADOOP快速入门 - 图19

  1. 查看执行结果

    • $ hadoop fs –cat /wordcount/out/part-r-00000

HADOOP快速入门 - 图20