HADOOP入门

1. HADOOP****背景介绍

** 1.1 ****什么是HADOOP**

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

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

  3. HADOOP的核心组件有

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

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

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

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

1.2 ****HADOOP产生背景

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

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

——分布式文件系统(GFS),可用于处理海量网页的存储

——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。

  1. Nutch的开发人员完成了相应的开源实现HDFS和MAPREDUCE,并从Nutch中剥离成为独立项目HADOOP,到2008年1月,HADOOP成为Apache顶级项目,迎来了它的快速发展期。

1.3 ****HADOOP在大数据、云计算中的位置和关系

  1. 云计算是分布式计算、并行计算、网格计算、多核计算、网络存储、虚拟化、负载均衡等传统计算机技术和互联网技术融合发展的产物。借助IaaS(基础设施即服务)、PaaS(平台即服务)、SaaS(软件即服务)等业务模式,把强大的计算能力提供给终端用户。

  2. 现阶段,云计算的两大底层支撑技术为“虚拟化”和“大数据技术

  3. 而HADOOP则是云计算的PaaS层的解决方案之一,并不等同于PaaS,更不等同于云计算本身。

1.4 ****国内外HADOOP应用案例介绍

1、HADOOP应用于数据服务基础平台建设

2/HADOOP用于用户画像

3、HADOOP用于网站点击流日志****数据****挖掘

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

各组件简介

HADOOP(hdfs、MAPREDUCE、yarn) 元老级大数据处理技术框架,擅长离线数据分析

Zookeeper 分布式协调服务基础组件

Hbase 分布式海量数据库,离线分析和在线业务通吃

Hive sql 数据仓库工具,使用方便,功能丰富,基于MR延迟大

Sqoop数据导入导出工具

Flume数据采集框架

重点组件:

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 比如分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。

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

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

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

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

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

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

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

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

需求:可以实现由主节点将运算任务发往从节点,并将各从节点上的任务启动;

程序清单:

AppMaster

AppSlave/APPSlaveThread

Task

程序运行逻辑流程:

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

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

一个应用广泛的数据分析系统:“web日志数据挖掘”

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系统极其类似,整体流程如下:

但是,由于本案例的前提是处理海量数据,因而,流程中各环节所使用的技术则跟传统BI完全不同,后续课程都会一一讲解:

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

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

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

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

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

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

3.2.2 项目技术架构图

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

a) Mapreudce程序运行

b) 在Hive中查询数据

c) 将统计结果导入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程序来实现数据可视化

效果如下所示:

4. 集群搭建

4.1 HADOOP集群搭建

4.1.1集群简介

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

HDFS集群:

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

YARN集群:

负责海量数据运算时的资源调度,集群中的角色主要有 ResourceManager /NodeManager

(那mapreduce是什么呢?它其实是一个应用程序开发包)

本集群搭建案例,以5节点为例进行搭建,角色分配如下:

|

hdp-node-01 NameNode SecondaryNameNode

hdp-node-02 ResourceManager

hdp-node-03DataNode NodeManager

hdp-node-04DataNode NodeManager

hdp-node-05DataNode NodeManager

|

部署图如下:

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用户

ü 为HADOOP用户分配sudoer权限

ü 同步时间

ü 设置主机名

n hdp-node-01

n hdp-node-02

n hdp-node-03

ü 配置内网域名映射:

n 192.168.33.101 hdp-node-01

n 192.168.33.102 hdp-node-02

n 192.168.33.103 hdp-node-03

ü 配置ssh免密登陆

ü 配置防火墙

4.1.5 ****J****dk环境安装

ü 上传jdk安装包

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

ü 解压安装包

ü 配置环境变量 /etc/profile

4.1.6 ****HADOOP****安装部署

ü 上传HADOOP安装包

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

ü 解压安装包

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

最简化配置如下:

vi hadoop-env.sh

|

The java implementation to use.

export JAVA_HOME=/home/hadoop/apps/jdk1.7.0_51

|

vi core-site.xml

|

<configuration>

<property>

<name>fs.defaultFS</name>

<value>hdfs://hdp-node-01:9000</value>

</property>

<property>

<name>hadoop.tmp.dir</name>

<value>/home/HADOOP/apps/hadoop-2.6.1/tmp</value>

</property>

</configuration>

|

vi hdfs-site.xml

|

<configuration>

<property>

<name>dfs.namenode.name.dir</name>

<value>/home/hadoop/data/name</value>

</property>

<property>

<name>dfs.datanode.data.dir</name>

<value>/home/hadoop/data/data</value>

</property>

<property>

<name>dfs.replication</name>

<value>3</value>

</property>

<property>

<name>dfs.secondary.http.address</name>

<value>hdp-node-01:50090</value>

</property>

</configuration>

|

vi mapred-site.xml

|

<configuration>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

</configuration>

|

vi yarn-site.xml

|

<configuration>

<property>

<name>yarn.resourcemanager.hostname</name>

<value>hadoop01</value>

</property>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

</configuration>

|

vi salves

|

hdp-node-01

hdp-node-02

hdp-node-03

|

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 ~]$ HADOOP fs -put /home/HADOOP/somewords.txt /wordcount/input

|

2、运行一个mapreduce程序

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

|

cd $HADOOP_HOME/share/hadoop/mapreduce/

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

|

5 集群使用初步

5.1 HDFS使用

1、查看集群状态

命令: hdfs dfsadmin –report

可以看出,集群共有3个datanode可用

也可打开web控制台查看HDFS集群信息,在浏览器打开http://hdp-node-01:50070/

2、上传文件到HDFS

2 查看HDFS中的目录信息

命令: hadoop fs –ls /

2 上传文件

命令: hadoop fs -put ./ scala-2.10.6.tgz to /

2 从HDFS下载文件

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

5.2 MAPREDUCE使用

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

5.2.1 Demo开发——wordcount

1、需求

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

2、mapreduce实现思路

Map阶段:

a) 从HDFS的源数据文件中逐行读取数据

b) 将每一行数据切分出单词

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

d) 将键值对发送给reduce

Reduce阶段:

a) 接收map阶段输出的单词键值对

b) 将相同单词的键值对汇聚成一组

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

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

4、 具体编码实现

(1)定义一个mapper类

|

//首先要定义四个泛型的类型

//keyin: LongWritable valuein: Text

//keyout: Text valueout:IntWritable

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

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

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

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

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

  1. 查看执行结果

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容