Hadoop实战实例

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

Hadoop实战实例

Hadoop是Google MapReduce的一个Java实现。MapReduce是一种简化的分布式编程模式,让程序自动分布到一个由普通机器组成的超大集群上并发执行。就如同java程序员可以不考虑内存泄露一样,MapReduce的run-time系统会解决输入数据的分布细节,跨越机器集群的程序执行调度,处理机器的失效,并且管理机器之间的通讯请求。这样的模式允许程序员可以不需要有什么并发处理或者分布式系统的经验,就可以处理超大的分布式系统得资源。

一、概论

作为Hadoop程序员,他要做的事情就是:
1、定义Mapper,处理输入的Key-Value对,输出中间结果。
2、定义Reducer,可选,对中间结果进行规约,输出最终结果。
3、定义InputFormat和OutputFormat,可选,InputFormat将每行输入文件的内容转换为Java类供Mapper函数使用,不定义时默认为String。
4、定义main函数,在里面定义一个Job并运行它。

然后的事情就交给系统了。
1.基本概念:Hadoop的HDFS实现了google的GFS文件系统,NameNode作为文件系统的负责调度运行在master,DataNode运行在每个机器上。同时Hadoop实现了Google的MapReduce,JobTracker作为MapReduce的总调度运行在master,TaskTracker则运行在每个机器上执行Task。

2.main()函数,创建JobConf,定义Mapper,Reducer,Input/OutputFormat和输入输出文件目录,最后把Job提交給JobTracker,等待Job结束。

3.JobTracker,创建一个InputFormat的实例,调用它的getSplits()方法,把输入目录的文件拆分成FileSplist作为Mappertask的输入,生成Mappertask加入Queue。

4.TaskTracker向JobTracker索求下一个Map/Reduce。

MapperTask先从InputFormat创建RecordReader,循环读入FileSplits的内容生成Key与Value,传给Mapper函数,处理完后中间结果写成SequenceFile.
ReducerTask从运行Mapper的TaskTracker的Jetty上使用http协议获取所需的中间内容(33%),Sort/Merge后(66%),执行Reducer函数,最后按照OutputFormat写入结果目录。

TaskTracker每10秒向JobTracker报告一次运行情况,每完成一个Task10秒后,就会向JobTracker索求下一个Task。

Nutch项目的全部数据处理都构建在Hadoop之上,详见Scalable?Computing?with?Hadoop

二、程序员编写的代码

(可以查看hadoop-examples-0.20.203.0.jar,里面也有一个类grep)

我们做一个简单的分布式的Grep,简单对输入文件进行逐行的正则匹配,如果符合就将该行打印到输出文件。因为是简单的全部输出,所以我们只要写Mapper函数,不用写Reducer函数,也不用定义Input/OutputFormat。

package? demo.hadooppublic?? class? HadoopGrep {???? public?? static?? class? RegMapper? extends? MapReduceBase? implements? Mapper {?????????????? private? Pattern pattern;?????????????? public?? void? configure(JobConf job) {???????????????????????? pattern? =? Pattern.compile(job.get( " mapred.mapper.regex " ));????????????? }????????????? public?? void? map(WritableComparable key, Writable value, OutputCollector output, Reporter reporter)???????????????????? throws? IOException {???????????????????????? String text? =? ((Text) value).toString();???????????????????????? Matcher matcher? =? pattern.matcher(text);?????????????????????? if? (matcher.find()) {??????????????????????? output.collect(key, value);???????????? }??? }?}? private? HadoopGrep () {?}? //? singleton public?? static?? void? main(String[] args)? throws? Exception {? JobConf grepJob? =?? new? JobConf(HadoopGrep. class );? grepJob.setJobName( " grep-search " );? grepJob.set( " mapred.mapper.regex " , args[ 2 ]);? grepJob.setInputPath( new? Path(args[ 0 ]));? grepJob.setOutputPath( new? Path(args[ 1 ]));? grepJob.setMapperClass(RegMapper. class );? grepJob.setReducerClass(IdentityReducer. class );? JobClient.runJob(grepJob);?}}

RegMapper类的configure()函数接受由main函数传入的查找字符串,map()函数进行正则匹配,key是行数,value是文件行的内容,符合的文件行放入中间结果。
main()函数定义由命令行参数传入的输入输出目录和匹配字符串,Mapper函数为RegMapper类,Reduce函数是什么都不做,直接把中间结果输出到最终结果的的IdentityReducer类,运行Job。

整个代码非常简单,丝毫没有分布式编程的任何细节。

三.运行Hadoop程序

Hadoop这方面的文档写得不全面,综合参考GettingStartedWithHadoop与NutchHadoopTutorial两篇后,再碰了很多钉子才终于完整的跑起来了,记录如下:
3.1local运行模式
完全不进行任何分布式计算,不动用任何namenode,datanode的做法,适合一开始做调试代码。
解压hadoop,其中conf目录是配置目录,hadoop的配置文件在hadoop-default.xml,如果要修改配置,不是直接修改该文件,而是修改hadoop-site.xml,将该属性在hadoop-site.xml里重新赋值。
hadoop-default.xml的默认配置已经是local运行,不用任何修改,配置目录里唯一必须修改的是hadoop-env.sh里JAVA_HOME的位置。
将编译好的HadoopGrep与RegMapper.class放入hadoop/build/classes/demo/hadoop/目录

或者编译成jar包HadoopGrep.jar放入hadoop/build/classes/demo/hadoop/目录

找一个比较大的xx.log文件放,然后运行

bin/hadoopdemo.hadoop.HadoopGrep input /tmp/out “[a-b]”
(jar包运行:bin/hadoop jar HadoopGrep.jar HadoopGrep input /tmp/output “[a-b]” )
说明:
input 为xx.log文件所在目录
/tmp/output为输出目录
“[a-b]” grep的字符串

查看输出目录的结果,查看hadoop/logs/里的运行日志。
在重新运行前,先删掉输出目录。

3.2 集群运行模式

(查看集群配置:http://blog.csdn.net/hguisu/article/details/7237395)

1 )执行bin/hadoopdfs可以看到它所支持的文件操作指令。

2) 创建目录输入inpu:
$ bin/hadoopdfs -mkdir input

3)上传文件xx.log到指定目录 input :
$ bin/hadoopdfs -put xx.log input

4 ) 执行 bin/hadoop demo.hadoop.HadoopGrep input output
(jar包运行:bin/hadoop jar HadoopGrep.jar HadoopGrep input /tmp/output “[a-b]” )

5 ) 查看输出文件:

将输出文件从分布式文件系统拷贝到本地文件系统查看:
$ bin/hadoop fs -get output output
$ cat output/*

或者
在分布式文件系统上查看输出文件:
$ bin/hadoop fs -cat output/*

重新执行前,运行hadoop/bin/hadoopdfs -rm output删除output目录

7.运行hadoop/bin/stop-all.sh结束。

四、效率

经测试,Hadoop并不是万用灵丹,很取决于文件的大小和数量,处理的复杂度以及群集机器的数量,相连的带宽,当以上四者并不大时,hadoop优势并不明显。
比如,不用hadoop用java写的简单grep函数处理100M的log文件只要4秒,用了hadooplocal的方式运行是14秒,用了hadoop单机集群的方式是30秒,用双机集群10M网口的话更慢,慢到不好意思说出来的地步。

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、背景 随着互联网、移动互联网、物联网等技术的不断发展,以及社交、电商、在线视频、游戏等应用的飞速发展,数据量呈现爆炸式增长,数据处理和数据分析成为了当前互联网产业的热点和难点。在这种背景下,Hadoop作为一种分布式计算框架,得到了越来越广泛的应用。 二、案例介绍 本案例以一家电商公司为例,介绍如何利用Hadoop对大数据进行处理和分析,以提高企业的竞争力和盈利能力。 1. 数据收集 该电商公司的业务范围非常广泛,包括服装、家居、数码、食品等多个品类,每个品类下又包含大量的商品。因此,需要收集大量的数据,包括用户行为数据、商品数据、订单数据等。这些数据主要来源于网站、移动应用、第三方平台等。为了方便数据的处理和分析,需要将这些数据进行清洗和格式化处理,并存储到Hadoop集群中。 2. 数据处理 在数据收集之后,需要对数据进行处理,包括数据清洗、数据转化、数据聚合等。具体来说,需要对用户行为数据进行分析,包括用户访问行为、用户购买行为、用户评价行为等。对于用户访问行为,可以分析用户的访问路径、停留时间、访问频率等;对于用户购买行为,可以分析用户的购买时间、购买频次、购买金额等;对于用户评价行为,可以分析用户的评价内容、评价时间、评价分数等。通过这些数据的分析,可以了解用户的兴趣爱好、需求等,从而为企业的营销和产品策略提供参考。 3. 数据挖掘 在数据处理之后,需要对数据进行挖掘和分析,以发现潜在的规律和趋势。具体来说,可以利用Hadoop中的机器学习算法、数据挖掘算法等,对用户行为数据、商品数据、订单数据等进行分析和建模。通过这些模型的分析和预测,可以为企业的营销和产品策略提供参考。 4. 数据可视化 在数据挖掘之后,需要将分析结果进行可视化展示,以便企业管理层、营销团队等快速了解业务情况。具体来说,可以利用Hadoop中的可视化工具,如Hue、Zeppelin等,将分析结果以图表、表格等形式进行展示。通过数据可视化,可以帮助企业快速了解业务情况,及时调整营销策略、产品策略等,提高企业的竞争力和盈利能力。 三、总结 本案例以电商企业为例,介绍了如何利用Hadoop对大数据进行处理和分析,以提高企业的竞争力和盈利能力。通过数据收集、数据处理、数据挖掘和数据可视化等环节的综合应用,可以为企业提供全方位的数据支持,促进企业的发展和创新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值