hadoop学习一之概述


大数据应用发展前景

现在大家都在讨论大数据、云计算、人工智能等,我虽然只是一个屌丝程序员,做网站后台的,我也准备学习大数据框架。从今天开始,开始第二轮学习,准备吧学习到的东西记录下来。OK,废话不多说了,Hadoop现在就业前景还比较好,工资也还OK,学习一下吧!

当然在学习这个之前、应该具备英语、liunx、shell等技能、当然能用Python更好

1. HADOOP背景介绍

1.1 什么是hadoop?

Apache Hadoop是一款支持数据密集型分布式应用并以Apache 2.0许可协议发布的开源软件框架

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

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

3.    HADOOP的核心组件有
    A.    HDFS(分布式文件系统)
    B.    YARN(运算资源调度系统)
    C.    MAPREDUCE(分布式运算编程框架)

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

1.2 HADOOP产生背景

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

  2. 2003年、2004年谷歌发表的两篇论文为该问题提供了可行的解决方案。
    ——分布式文件系统(GFS),可用于处理海量网页的存储
    ——分布式计算框架MAPREDUCE,可用于处理海量网页的索引计算问题。

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

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

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

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

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

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

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

1.5、Hadoop项目主要包含一下几个模块

  • hadoop common :为其他Hadoop模块提供基础设施或者说组件
  • hadoop HDFS:一个分布式、高性能、 高可靠的文件存储系统
  • hadoop MapReduce: 分布式的离线的计算框架
  • haoop YARN: 一个新的mapreduce框架、任务调度与资源管理
  • Apache HBase:分布式NoSQL列数据库,类似谷歌公司BigTable
  • Apache Hive:构建于hadoop之上的数据仓库,通过一种类SQL语言HiveQL为用户提供数据的归纳、查询和分析等功能。Hive最初由Facebook贡献
  • Apache Mahout:机器学习算法软件包
  • Apache Sqoop:结构化数据(如关系数据库)与Apache Hadoop之间的数据转换工具
  • Apache ZooKeeper:分布式锁设施,提供类似Google Chubby的功能,由Facebook贡献
  • Apache Avro:新的数据序列化格式与传输工具,将逐步取代Hadoop原有的IPC机制

1.6、HDFS系统架构图

他的意思是说: HDFS仍然采用master/slave模式。主控节点仍然是NameNode,从节点仍然是多个DataNode,NameNode记录数据集的元数据。由于每个大文件load到HDFS时,都会被分割成默认64MB的数据块(Block),且这些数据块被分散到多个DataNode中做并行处理,因此NameNode需要管理一个文件分成了哪些Block,这些Block又分散在哪些DataNode上。这些映射关系就是元数据。当DataNode上的Block发生变化时,需向NameNode报告更新元数据。客户端操作数据时,需向NameNode查询元数据,在查询到数据所在的DataNode后,直接与DataNode交互,执行读/写操作。不同的数据块Block会有多个副本(主要是为了数据安全)。Rack是机架,一份数据的多个副本可能存在不同机架的服务器上

2.分布式系统概述

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

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

  • 该软件系统会划分成多个子系统或模块,各自运行在不同的机器上,子系统或模块之间通过网络通信进行协作,实现最终的整体功能
  • 比如分布式操作系统、分布式程序设计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等

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

A. 一个solrcloud集群通常有多台solr服务器
B. 每一个solr服务器节点负责存储整个索引库的若干个shard(数据分片)
C. 每一个shard又有多台服务器存放若干个副本互为主备用
D. 索引的建立和查询会在整个集群的各个节点上并发执行
E. solrcloud集群作为整体对外服务,而其内部细节可对客户端透明
总结:利用多个节点共同协作完成一项或多项具体业务功能的系统就是分布式系统。

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

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

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完全不同,后续课程都会一一讲解:
1)    数据采集:定制开发采集程序,或使用开源框架FLUME
2)    数据预处理:定制开发mapreduce程序运行于hadoop集群
3)    数据仓库技术:基于hadoop之上的Hive
4)    数据导出:基于hadoop的sqoop数据导入导出工具
5)    数据可视化:定制开发web程序或使用kettle等产品
6)    整个过程的流程调度:hadoop生态圈中的oozie工具或其他类似开源产品

4.hadoop的搭建 参考我Hadoop安装文档

测试:

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 

HDFS使用
1、查看集群状态
命令:   hdfs  dfsadmin  –report 

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


查看HDFS中的目录信息
命令:   hadoop  fs  –ls  /

上传文件
命令:   hadoop  fs  -put  ./ scala-2.10.6.tgz  to  /

从HDFS下载文件
命令:  hadoop  fs  -get  /yarn-site.xml

5.MAPREDUCE使用

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

  • Demo开发——wordcount
    <!–hexoPostRenderEscape:
    1、需求
    从大量(比如T级别)文本文件中,统计出每一个单词出现的总次数

2、mapreduce实现思路
Map阶段:
a) 从HDFS的源数据文件中逐行读取数据
b) 将每一行数据切分出单词
c) 为每一个单词构造一个键值对(单词,1)
d) 将键值对发送给reduce

Reduce阶段:
a) 接收map阶段输出的单词键值对
b) 将相同单词的键值对汇聚成一组
c) 对每一组,遍历组中的所有“值”,累加求和,即得到每一个单词的总次数
d) 将(单词,总次数)输出到HDFS的文件中
:hexoPostRenderEscape–>

  • 具体编码实现
    <!–hexoPostRenderEscape:
    (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);
    &#x2F;&#x2F;设置我们的业务逻辑Mapper类的输出key和value的数据类型
    wcjob.setMapOutputKeyClass(Text.class);
    wcjob.setMapOutputValueClass(IntWritable.class);
    &#x2F;&#x2F;设置我们的业务逻辑Reducer类的输出key和value的数据类型
    wcjob.setOutputKeyClass(Text.class);
    wcjob.setOutputValueClass(IntWritable.class);

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

    &#x2F;&#x2F;向yarn集群提交这个job
    boolean res &#x3D; wcjob.waitForCompletion(true);
    System.exit(res?0:1);
&#125;

:hexoPostRenderEscape–>

6.程序打包运行

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

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

4.    使用命令启动执行wordcount程序jar包
    $ hadoop jar wordcount.jar cn.itcast.bigdata.mrsimple.WordCountDriver /wordcount/input /wordcount/out

5.    查看执行结果
$ hadoop fs –cat /wordcount/out/part-r-00000

文章作者: 邓滔
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 邓滔 !
评论
  目录