【大数据】MapReduce JAVA API编程实践及适用场景介绍

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 【大数据】MapReduce JAVA API编程实践及适用场景介绍

1.前言

本文是作者大数据系列专栏的其中一篇,前文我们依次聊了大数据的概论、分布式文件系统、分布式数据库、以及计算引擎mapreduce核心概念以及工作原理。

书接上文,本文将会继续聊一下mapreduce的编程实践以及mapreduce的适用场景。基于的Hadoop版本依然是前文的hadoop3.1.3。

2.mapreduce编程示例

本文依然以最经典的单词分词,即统计各个单词数量的业务场景为例。mapreduce其实就是编写map函数和reduce函数。map reduce的Java API中提供了map和reduce的标准接口,实现接口,编写自己的业务逻辑即可。

依赖:

<dependency>
   <groupId>org.apache.hadoop</groupId>
   <artifactId>hadoop-mapreduce-client-core</artifactId>
   <version>3.1.3</version>
</dependency>

map函数:

map阶段会从分布式文件系统HDFS中去读数据,读入的数据先进行分词,然后进行初步的统计。所以编写map函数要写的就是分词和统计:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
import java.util.StringTokenizer;
import org.apache.hadoop.io.Text;
 
public class MyMapper extends Mapper<Object, Text, Text, IntWritable> {
    private Text word = new Text();
 
    @Override
    protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            context.write(word, new IntWritable(1));
        }
    }
}

key,是每条输入的键,默认情况下处理文本文件时通常是记录的偏移量,类型为Object(实践中常为LongWritable)。


context是输出。


在new StringTokenizer这一步,文本就会进行分词。


IntWritable是int的包装类,主要是为了赋予int类型可序列化的能力,毕竟要在网络中进行传输。


reduce函数:


reduce的shuffle是底层自动执行的,所以我们只需要编写好reduce函数即可:


reduce函数的输入就是shuffle后的<key,Iterable>,context是输出。

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
 
public class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        int sum=0;
        for(IntWritable val:values){
            sum+=val.get();
        }
        context.write(key,new IntWritable(sum));
    }
}

main函数:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 
public class MapReduceTest {
    public static void main(String[] args)throws Exception {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://192.168.31.10:9000");
        conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(MapReduceTest.class); // 使用当前类的类加载器
        job.setMapperClass(MyMapper.class);
        job.setCombinerClass(MyReducer.class);
        job.setReducerClass(MyReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path("/user/hadoop/input/input1.txt"));
        FileOutputFormat.setOutputPath(job, new Path("/user/hadoop/output"));
        job.waitForCompletion(true);
    }
}

3.MapReduce适用场景

mapreduce适用于哪些场景?之前聊了那么多,似乎MapReduce也就只能统计一下数量?其实不是这样的,MapReduce能用来实现一切代数关系运算,即:选择、投影、并、交、差、连接,也就是对应关系型数据库的全部操作。

以连接为例:

在存数据的时候通过一个外键来预留好关联点。map和reduce函数都是我们手动定义的,map阶段我们完全可以把外键作为key,这样在reduce的shuffle阶段数据自然就会通过外键这个key聚合在一起。


ok,我们知道了MapReduce能将数据关联在一起,那么MapReduce能做的事情可就太多了。回想一下类比我们在用关系型数据库时,想对数据进行统计分析,是不是其实就是将数据连接聚合在一起。所以我们说MapReduce可以完成一切对于数据的关系运算,也就是完成一切对于数据的计算任务。


下面举几个具体在行业内落地的应用场景:


1.搜索引擎的网页索引:


网页爬虫抓取大量网页内容。

Map阶段:解析每个网页,提取关键词,生成键值对(关键词, 网页URL)。

Reduce阶段:对关键词进行聚合,生成倒排索引,即每个关键词对应一组包含该关键词的网页列表。



2.用户行为分析:


收集用户在网站上的浏览、点击、购买等行为数据。

Map阶段:将每个事件转化为键值对(用户ID, 行为详情)。

Reduce阶段:按用户ID聚合,统计用户的总访问次数、购买行为、最常访问的页面等。



3.广告效果评估:


分析广告展示、点击和转化数据。

Map阶段:处理广告日志,产生(广告ID, 展示次数/点击次数/转化次数)键值对。

Reduce阶段:计算每个广告的CTR(点击率)和ROI(投资回报率)。



4.社交网络分析:


计算用户之间的关系,如好友数、影响力等。

Map阶段:遍历用户关系数据,输出(用户A, 用户B)键值对表示A关注B。

Reduce阶段:对每个用户进行聚合,计算其关注者和被关注者的数量。



5.新闻热点检测:


分析新闻标题和内容,找出热门话题。

Map阶段:将每条新闻转化为(关键词, 新闻ID)键值对。

Reduce阶段:对关键词进行聚合,统计出现频率,找出出现最多的关键词。



6.图像处理:


大规模图像分类或标签生成。

Map阶段:对每张图片进行预处理,生成特征向量和对应的图像ID。

Reduce阶段:使用机器学习模型对特征向量进行分类或聚类。



7.金融领域:


信用评分模型的训练。

Map阶段:处理个人信用记录,形成(用户ID, 信用特征)键值对。

Reduce阶段:用这些特征训练模型,预测用户违约概率。



8.基因组学研究:


对大规模基因序列进行比对和变异检测。

Map阶段:将基因序列片段与参考基因组进行比对,输出匹配位置。

Reduce阶段:整合比对结果,确定变异位点。

 

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
2月前
|
存储 SQL 运维
中国联通网络资源湖仓一体应用实践
本文分享了中国联通技术专家李晓昱在Flink Forward Asia 2024上的演讲,介绍如何借助Flink+Paimon湖仓一体架构解决传统数仓处理百亿级数据的瓶颈。内容涵盖网络资源中心概况、现有挑战、新架构设计及实施效果。新方案实现了数据一致性100%,同步延迟从3小时降至3分钟,存储成本降低50%,为通信行业提供了高效的数据管理范例。未来将深化流式数仓与智能运维融合,推动数字化升级。
131 0
中国联通网络资源湖仓一体应用实践
|
1月前
|
Cloud Native 大数据 Java
大数据新视界--大数据大厂之大数据时代的璀璨导航星:Eureka 原理与实践深度探秘
本文深入剖析 Eureka 在大数据时代分布式系统中的关键作用。涵盖其原理,包括服务注册、续约、发现及自我保护机制;详述搭建步骤、两面性;展示在大数据等多领域的应用场景、实战案例及代码演示。Eureka 如璀璨导航星,为分布式系统高效协作指引方向。
|
3月前
|
SQL 分布式计算 数据挖掘
从湖仓分离到湖仓一体,四川航空基于 SelectDB 的多源数据联邦分析实践
川航选择引入 SelectDB 建设湖仓一体大数据分析引擎,取得了数据导入效率提升 3-6 倍,查询分析性能提升 10-18 倍、实时性提升至 5 秒内等收益。
从湖仓分离到湖仓一体,四川航空基于 SelectDB 的多源数据联邦分析实践
|
2月前
|
安全 API 数据安全/隐私保护
12种API认证全场景解析:从Basic到OAuth2.0,哪个认证最适合你的业务?
在API认证领域,从简单的Key-Value到高级的OAuth2.0和JWT,共有12种主流认证方式。本文详解了每种方式的意义、适用场景及优劣,并通过认证方式矩阵对比常见工具(如Postman、Apifox)的支持情况。此外,还介绍了企业级安全功能,如密钥保险箱、动态令牌和合规审计。选择合适的认证方式不仅能提升安全性,还能大幅提高开发效率。未来,自动化认证矩阵或将成为API调试的核心趋势。
|
3月前
|
存储 安全 数据挖掘
天翼云:Apache Doris + Iceberg 超大规模湖仓一体实践
天翼云基于 Apache Doris 成功落地项目已超 20 个,整体集群规模超 50 套,部署节点超 3000 个,存储容量超 15PB
天翼云:Apache Doris + Iceberg 超大规模湖仓一体实践
|
3月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
3月前
|
SQL 存储 消息中间件
vivo基于Paimon的湖仓一体落地实践
本文整理自vivo互联网大数据专家徐昱在Flink Forward Asia 2024的分享,基于实际案例探讨了构建现代化数据湖仓的关键决策和技术实践。内容涵盖组件选型、架构设计、离线加速、流批链路统一、消息组件替代、样本拼接、查询提速、元数据监控、数据迁移及未来展望等方面。通过这些探索,展示了如何优化性能、降低成本并提升数据处理效率,为相关领域提供了宝贵的经验和参考。
618 3
vivo基于Paimon的湖仓一体落地实践
|
3月前
|
SQL 分布式计算 运维
StarRocks 在爱奇艺大数据场景的实践
本文介绍了爱奇艺大数据OLAP服务负责人林豪在StarRocks年度峰会上的分享,重点讲述了爱奇艺OLAP引擎的演进及引入StarRocks后的显著效果。在广告业务中,StarRocks替换Impala+Kudu后,接口性能提升400%,P90查询延迟缩短4.6倍;在“魔镜”数据分析平台中,StarRocks替代Spark达67%,P50查询速度提升33倍,P90提升15倍,节省4.6个人天。未来,爱奇艺计划进一步优化存算一体和存算分离架构,提升整体数据处理效率。
StarRocks 在爱奇艺大数据场景的实践
|
3月前
|
供应链 搜索推荐 API
一文读懂:京东、淘宝、拼多多 API 接口,功能大不同,场景各有招
本文深入解析京东、淘宝、拼多多三大电商巨头的API接口特点与差异。京东API以商品管理、订单处理和物流跟踪见长,适合电商平台及零售商;淘宝API功能丰富,涵盖商品查询、订单管理与用户认证,适用多场景电商业务;拼多多API聚焦社交电商,提供拼团、砍价等特色玩法,助力商家提升曝光与销量。开发者和商家需根据自身需求选择合适的API接口,并关注其安全性与稳定性。随着技术进步,这些API将持续优化,推动电商行业蓬勃发展。
|
3月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
99 11