大数据经典实验案例-WordCount原理详解和代码书写
本次实验基于hadoop框架和linux环境,所以,请保证您的电脑拥有hadoop环境(hdfs和mapreduce)
实验目的:掌握hadoop的一些基本命令操作和使用JavaAPI进行实验开发。
实验步骤:

  1. 启动hdfs

    2.通过idea创建一个Java项目,并导入Hadoop相关的依赖包:创建项目通过普通的new一个Javaproject 即可,然后在src下新建一个mapreduce包:如下:

    3.导入依赖包:file->rpoject structure,然后点击右边的+,加入hadoop的依赖包,包的位置在你安装的hadoop文件夹下,建议将包都导入,比较方便。

    4.环境和项目配置准备完毕,就可以开始进行代码的编写了,首先需要缕清和知道mapreduce 的底层原理,这部分可以参考一些书本,这里不再赘述,在新建的mapreduce目录下建立map类和reduce类,以及用于项目启动的main方法:

    5.WordCountMapper的编写:
package mapreduce;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class WordCountMapper extends Mapper<LongWritable, Text,Text,LongWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//参数:k1,v1    k2 v2//比如:0 hello world   ->   hello:1   world:1//String -> Text//Long -> LongWritableText text = new Text();LongWritable longWritable = new LongWritable();//第一步:将 v1按照空格进行拆分成单词String[] split = value.toString().split(" ");//第二部,便利数组,组装k2和v2for (String word:split){//讲k2,v2写入上下文text.set(word);longWritable.set(1);context.write(text,longWritable);}}
}

6.WordCOuntReducer的书写

package mapreduce;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class WordCountReducer extends Reducer<Text, LongWritable,Text,LongWritable> {//讲k2,v2   ->  vk3,v3//Text  LongWritable//k2,v2//hello 1, world 1, hello 1//k3,v3//hello 2,world 1@Overrideprotected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {//重写reduce 方法//作用:将新的k2,v2转为k3,v3//讲k3,v3写入上下文中//参数:key:新的k2,每个单词//values:新的v2,代表<1,1,1>  ,相当于map进行shufler之后的结果//1:生成新的k2,v2,遍历集合,讲集合中的数字想加,得到v3long count = 0;for (LongWritable value:values){count += value.get();   //讲LongWritable 变为long}//写入上下文对象context.write(key, new LongWritable(count));}//编写完map和reduce之后,需要通过job来进行调用
}

7.JobMain的书写:

package mapreduce;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;public class JobMain extends Configured implements Tool {//该方法用于制定一个job任务@Overridepublic int run(String[] strings) throws Exception {//穿件job人物对象//参数,获取configuration对象,Job job = Job.getInstance(super.getConf(), "wordCount");//alt  回车,生成对象//配置job任务对象//制定读取的输入类//第一步,指定文件的读取方法和读取路劲job.setInputFormatClass(TextInputFormat.class);//从哪里读取源文件,指定目录名,会自动扫描目录地下的所有文件
//        TextInputFormat.addInputPath(job,new Path("hdfs://localhost:9000/wordcount"));TextInputFormat.addInputPath(job,new Path("/home/hadoop/Desktop/develop/input"));//第二步:指定map阶段的处理方式job.setMapperClass(WordCountMapper.class);//设置map阶段的k2,v2类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(LongWritable.class);//shuffle 阶段//第3,4,5,6,阶段 :采用默认方式,暂时不做处理//第7步:进入reduce阶段job.setReducerClass(WordCountReducer.class);//设置k3,v3类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(LongWritable.class);//第8步:设置输出类型job.setOutputFormatClass(TextOutputFormat.class);//设置输出路径,如果目录不存在,将会自动创建
//        TextOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/wordcount_out"));//目标文件夹不可以提前存在TextOutputFormat.setOutputPath(job, new Path("/home/hadoop/Desktop/develop/output"));//等待任务结束boolean res = job.waitForCompletion(true);return res?0:1;     //这个返回值最后给了main方法中的run 变量}//主函数,启动job任务public static void main(String[] args){Configuration configuration = new Configuration();try {//toolRunner 的run 方法 就是调用上面的那个run方法//传递的configuration会保存在configured这个类中int run = ToolRunner.run(configuration,new JobMain(),args);//run 记录返回状态,0->成功,否则,失败System.exit(run);}catch (Exception e){e.printStackTrace();}/*如何运行mapreduce程序1:集群样式:讲mapreduce程序提交给yarn集群,分发到很多的节点熵并发执行处理的数据和输出结果应该位于HDFS文件系统提交集群的实现步骤:讲程序达成jar包,并上传,然后在集群上用hadoop命令启动。2:本地运行模式mapreduce程序实在本地以单进程的形式运行处理的数据及输出结果在本地文件系统*/}
}

8.运行,因为这里采用的是单机模式,所以输入输出的path都是本地地址,如果是进行分布式运行,地址和注释里面的一致即可,需要提交到yarn进行运行。需要先创建input文件夹,并在里面编写几个txt文件,里面写上几个单词句子,注意不要简历output文件夹,他会自动创建。运行结果如下:

里面的part文件就是结果文件。

大数据经典实验案例-WordCount原理详解和代码书写相关推荐

  1. AI 以 5:0 比分击败美顶级飞行员;经典对抗攻击 Deepfool 原理详解

    开发者社区技术周刊又和大家见面了,快来看看这周有哪些值得我们开发者关注的重要新闻吧. 2019 年全球公共云服务市场总额达 2334 亿美元 新里程碑!IBM 宣布最高量子体积 64 马斯克将通过实时 ...

  2. 图解大数据 | 分布式平台Hadoop与Map-Reduce详解

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/84 本文地址:https://www.showmeai.tech/article-d ...

  3. python处理excel大数据-Python实现大数据收集至excel的思路详解

    一.在工程目录中新建一个excel文件 二.使用python脚本程序将目标excel文件中的列头写入,本文省略该部分的code展示,可自行网上查询 三.以下code内容为:实现从接口获取到的数据值写入 ...

  4. 大数据时代 | 数据分析方法及理论详解

    大数据时代 | 数据分析方法及理论详解 1 数据分析前,我们需要思考 像一场战役的总指挥影响着整个战役的胜败一样,数据分析师的思想对于整体分析思路,甚至分析结果都有着关键性的作用. 2 分析问题和解决 ...

  5. 生命大数据(22页PPT图文详解版 华大基因董事长汪建)

    2015年3月22日,新智能时代论坛在北京举行,华大基因董事长汪建作开场演讲. 近几十年来基因生命科学飞速发展,汪建董事长在演讲中对未来生命大数据治疗.防控疾病的前景作了展望,并强调了生命大数据的重要 ...

  6. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  7. TOPSIS(逼近理想解)算法原理详解与代码实现

    写在前面: 个人理解:针对存在多项指标,多个方案的方案评价分析方法,也就是根据已存在的一份数据,判断数据中各个方案的优劣.中心思想是首先确定各项指标的最优理想值(正理想值)和最劣理想值(负理想解),所 ...

  8. 算法 经典的八大排序算法详解和代码实现

    算法 经典的八大排序算法详解和代码实现 排序算法的介绍 排序的分类 算法的时间复杂度 时间频度 示例 图表理解时间复杂度的特点 时间复杂度 常见的时间复杂度 空间复杂度 排序算法的时间复杂度 冒泡排序 ...

  9. 开发步骤_大数据开发必备的通用步骤详解

    大数据的开发过程,如图1-1所示. 图 1-1大数据开发通用步骤图 上图只是一个简化后的步骤和流程,实际开发中,有的步骤可能不需要,有的还需要增加步骤,有的流程可能更复杂,因具体情况而定. 下面以Go ...

  10. mysql悲观锁会有脏数据吗_mysql悲观锁原理详解

    mysql中的锁概念 mysql已经成为大家日常数据存储的最常用平台,但随着业务量和访问量的上涨,会出现并发访问等场景,如果处理不好并发问题的话会带来严重困扰.下面介绍一下如何通过mysql的悲观锁来 ...

最新文章

  1. 首例利用智能路由网关犯罪嫌疑人被捕:罪名流量劫持
  2. mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖
  3. 【Android Gradle 插件】工程根目录下 build.gradle 配置文件 ( 远程仓库配置 | 依赖配置 | 所有子模块配置 | task clean 任务 )
  4. Linux Container 研究报告
  5. okHttp源码解析------待续
  6. android 手势类的封装,Android手势识别简单封装类
  7. html字体外颜色轮廓,HTML5 文本特效 - 轮廓提取
  8. web报表工具FineReport使用中遇到的常见报错及解决办法(一)
  9. sqlserver垮库查询_sql跨库查询(sqlserver跨库查询)
  10. 日志的打印 —— Java 支持
  11. .net winform 里控件的Dock属性(Dock的Z 顺序停靠)
  12. 用例设计-常用正交表9个
  13. 方舟生存进化服务器怎么开?方舟生存进化架设服务器教程
  14. 计算机 本科专业 课程
  15. 解读Android12 CDD中针对隔离环境(TEE)的要求
  16. 《西部世界》会成真吗? 人类如何避免被机器人干掉的未来?
  17. 微信撤回服务器有没有,无需任何软件, 告诉你如何查看微信撤回的图片!
  18. 高翔视觉slam十四讲习题(1)
  19. java通过调用鼠标模拟自动添加微信好友
  20. LifecycleScope

热门文章

  1. 月薪过万的java程序员需要什么能力_什么样能力的Java程序员月薪过万
  2. 如何运用SWOT分析法
  3. 分销系统之项目架构(第一篇)
  4. 邮箱发送html邮件,遇到的问题(如阿里邮箱如何发送html邮件、qq向阿里发送邮件样式丢失等)解决方法
  5. 华为鸿蒙系统支持什么手机_华为手机鸿蒙系统支持所有华为手机吗
  6. matlab 计算峰均比,峰均比计算公式
  7. 吐槽国内各大公司的漏洞报告平台
  8. data.unity3d 文件过大解决方法
  9. 解决新版 Edge 浏览器无法使用 IDM 的问题
  10. 计算机逻辑判断函数函数知识点,逻辑判断函数