当前位置: 首页 > news >正文

Java+大数据开发——Hadoop集群环境搭建(二)

1. MAPREDUCE使用

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

 

2. Demo开发——wordcount

2.1需求

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

 

2.2mapreduce 实现思路

Map阶段:

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

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

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

d) 将键值对发送给reduce

 

Reduce阶段

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

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

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

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

 

2.3具体编码实现

(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);
    }

 

3.程序打包运行

 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

 

作者:杰瑞教育
出处: http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归 杰瑞教育 技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:JRedu技术交流

 

转载于:https://www.cnblogs.com/jerehedu/p/7508751.html

相关文章:

  • python 循环列表的同时做删除操作
  • Mysql中数据类型括号中的数字代表的含义
  • python 正则匹配字母数字中的任意数字,字母
  • 大保健就是做公益?马云的一招让这个特殊群体赞不绝口
  • 儿童做家务年龄对照表,80%的父母都后悔看晚了…
  • Windows Embedded Standard CTP发布!
  • 阿布扎比有一个“智慧港口”
  • 4000余台ElasticSearch服务器遭PoS恶意软件感染
  • Docker for Mac配置Sock5代理
  • Vue.js 上传文件(后台使用.net)
  • 微商新手如何选产品?史上最详细操作指南!
  • 深入理解javascript原型和闭包(4)——隐式原型
  • Android Studio 插件简单介绍
  • MySQL安装操作指引
  • ASP.NET中ListBox控件的使用
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • CentOS 7 修改主机名
  • HashMap剖析之内部结构
  • Java|序列化异常StreamCorruptedException的解决方法
  • Meteor的表单提交:Form
  • MySQL主从复制读写分离及奇怪的问题
  • Redis字符串类型内部编码剖析
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue2 SSR 的优化之旅
  • vue-router的history模式发布配置
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Web设计流程优化:网页效果图设计新思路
  • 编写符合Python风格的对象
  • 回流、重绘及其优化
  • 解析带emoji和链接的聊天系统消息
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 配置 PM2 实现代码自动发布
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端临床手札——文件上传
  • 前嗅ForeSpider采集配置界面介绍
  • 思考 CSS 架构
  • 阿里云服务器如何修改远程端口?
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • (16)Reactor的测试——响应式Spring的道法术器
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C语言)fread与fwrite详解
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)理解angular中的module和injector,即依赖注入
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)基于IDEA的JAVA基础12
  • (转) Face-Resources
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET6 命令行启动及发布单个Exe文件
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net和jar包windows服务部署
  • .net快速开发框架源码分享
  • .NET微信公众号开发-2.0创建自定义菜单