第十一站:Java翡翠绿——大数据处理的力量

在Java大数据处理领域,Hadoop和Spark是两个至关重要的框架,它们充分展示了Java在处理大规模数据集方面的实力。下面我将通过简化的范例来讲解这两个框架的基本使用。

Hadoop MapReduce 示例

Hadoop MapReduce 是一种编程模型,用于处理和生成大数据集。下面是一个基本的Word Count程序示例,用于统计文本文件中每个单词出现的次数。

步骤简述:

  1. Mapper 阶段:读取输入文件的每一行,将其分割成单词,并为每个单词生成键值对(单词,1)。
  2. Reducer 阶段:对相同单词的键值对进行汇总,计算每个单词的总次数。

Java代码示例(简略版):

import java.io.IOException;
import java.util.StringTokenizer;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class WordCount {public static class TokenizerMapperextends Mapper<LongWritable, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducerextends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf, "word count");job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

Apache Spark 示例

Spark 提供了更高级的数据处理能力,支持内存计算,可以更高效地执行迭代算法和交互式数据分析。下面是一个使用Spark Java API进行Word Count的简单示例。

Java代码示例(使用Spark):

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;public class SparkWordCount {public static void main(String[] args) {SparkConf conf = new SparkConf().setAppName("Spark Word Count");JavaSparkContext sc = new JavaSparkContext(conf);JavaRDD<String> textFile = sc.textFile("hdfs://localhost:9000/path/to/input.txt");JavaRDD<String> words = textFile.flatMap(s -> Arrays.asList(s.split(" ")).iterator());JavaPairRDD<String, Integer> counts = words.mapToPair(word -> new Tuple2<>(word, 1)).reduceByKey((a, b) -> a + b);counts.saveAsTextFile("hdfs://localhost:9000/path/to/output");sc.stop();}
}

在这两个示例中,我们看到了如何使用Java语言在Hadoop MapReduce和Apache Spark框架下进行大数据处理。Hadoop提供了基础的分布式存储和计算能力,而Spark在此基础上提供了更高级的处理速度和灵活性,特别是在需要快速迭代处理和实时分析的场景中。

Apache Hadoop MapReduce 进阶示例:二次排序(Secondary Sort)

在Hadoop MapReduce中,有时我们需要对输出的键进行排序,同时还要保证相同键下的值也按照一定的顺序排列,这就是所谓的“二次排序”。下面是一个实现二次排序的Java示例。

Java代码示例:

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Comparator;import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;public class SecondarySort extends Configured implements Tool {public static class MyKey implements WritableComparable<MyKey> {protected Text first = new Text();protected IntWritable second = new IntWritable();public MyKey() {}public MyKey(Text first, IntWritable second) {this.first = first;this.second = second;}public void write(DataOutput out) throws IOException {first.write(out);second.write(out);}public void readFields(DataInput in) throws IOException {first.readFields(in);second.readFields(in);}public int compareTo(MyKey other) {int cmp = this.first.compareTo(other.first);if(cmp != 0) {return cmp;} else {return this.second.compareTo(other.second);}}@Overridepublic String toString() {return first + "\t" + second;}}public static class MyValue implements Writable {private Text value = new Text();public MyValue() {}public MyValue(String value) {this.value.set(value);}public void write(DataOutput out) throws IOException {value.write(out);}public void readFields(DataInput in) throws IOException {value.readFields(in);}@Overridepublic String toString() {return value.toString();}}public static class MyMapper extends Mapper<LongWritable, Text, MyKey, MyValue> {private final MyKey key = new MyKey();private final MyValue value = new MyValue();public void map(LongWritable offset, Text lineText, Context context)throws IOException, InterruptedException {String line = lineText.toString();String[] parts = line.split("\t");key.set(new Text(parts[0]), new IntWritable(Integer.parseInt(parts[1])));value.set(new Text(parts[2]));context.write(key, value);}}public static class MyPartitioner extends Partitioner<MyKey, MyValue> {@Overridepublic int getPartition(MyKey key, MyValue value, int numPartitions) {return (key.getFirst().hashCode() & Integer.MAX_VALUE) % numPartitions;}}public static class MyGroupComparator extends WritableComparator {protected MyGroupComparator() {super(MyKey.class, true);}@Overridepublic int compare(WritableComparable a, WritableComparable b) {MyKey keyA = (MyKey) a;MyKey keyB = (MyKey) b;return keyA.getFirst().compareTo(keyB.getFirst());}}public static class MyComparator extends WritableComparator {protected MyComparator() {super(MyKey.class, true);}@Overridepublic int compare(WritableComparable a, WritableComparable b) {MyKey keyA = (MyKey) a;MyKey keyB = (MyKey) b;int cmp = keyA.getFirst().compareTo(keyB.getFirst());if(cmp != 0) {return cmp;} else {return keyA.getSecond().compareTo(keyB.getSecond());}}}public static class MyReducer extends Reducer<MyKey, MyValue, Text, IntWritable> {private IntWritable result = new IntWritable();public void reduce(MyKey key, Iterable<MyValue> values, Context context)throws IOException, InterruptedException {for (MyValue val : values) {context.write(key.getFirst(), result);}}}public int run(String[] args) throws Exception {Job job = Job.getInstance(getConf(), "Secondary Sort");job.setJarByClass(SecondarySort.class);job.setMapperClass(MyMapper.class);job.setReducerClass(MyReducer.class);job.setPartitionerClass(MyPartitioner.class);job.setGroupingComparatorClass(MyGroupComparator.class);job.setSortComparatorClass(MyComparator.class);job.setOutputKeyClass(MyKey.class);job.setOutputValueClass(MyValue.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));return job.waitForCompletion(true) ? 0 : 1;}public static void main(String[] args) throws Exception {int exitCode = ToolRunner.run(new SecondarySort(), args);System.exit(exitCode);}
}

这个示例展示了如何在MapReduce作业中实现二次排序,其中MyKey类包含了两个排序依据(一个主要排序键和一个次要排序键),并且定义了相应的比较器、分组比较器以及分区器来完成复杂的排序需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv 打开图片后,cv::mat存入共享内存的代码,以及如何设置共享内存的大小?图片的3840x2160 pixels

opencv 打开图片后&#xff0c;cv::mat存入共享内存的代码&#xff0c;以及如何设置共享内存的大小&#xff1f;图片的3840x2160 pixels。 在OpenCV中&#xff0c;将cv::Mat对象存入共享内存需要几个步骤。首先&#xff0c;你需要创建一个共享内存区域&#xff0c;然后将cv::Ma…

DashText-进阶使用

前置知识 BM25简介 BM25算法&#xff08;Best Matching 25&#xff09;是一种广泛用于信息检索领域的排名函数&#xff0c;用于在给定查询&#xff08;Query&#xff09;时对一组文档&#xff08;Document&#xff09;进行评分和排序。BM25在计算Query和Document之间的相似度…

好文!12个策略解决 Kafka 数据丢失问题

哥们儿&#xff01;有遇到Kafka数据丢失问题的问题吗&#xff0c;你是如何解决的&#xff1f;今天的文章&#xff0c;V哥来详细解释一下&#xff0c;整理了12种解决策略&#xff0c;希望可以帮助你解决项目中的问题&#xff1a;以下是一些常见的解决方案和最佳实践。 生产者确认…

四川赤橙宏海商务信息咨询有限公司正规吗?

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。作为这一潮流的佼佼者&#xff0c;抖音电商以其独特的短视频直播模式&#xff0c;吸引了大量消费者和商家的目光。在这一背景下&#xff0c;四川赤橙宏海商务信息咨询有限公司应运而生&#xff0c;…

2Y0A21 GP2Y0A21YK0F 红外测距传感器 arduino使用教程

三根线 正极负极信号线 确认自己的三根线分别代表什么&#xff0c;我们的颜色可能不一样 附一张我买的传感器他们的说明图 正极 接 开发板5V 负极 接开发板GND 信号线 接A0 代码arduino ide上面写 // Infračerven senzor vzdlenosti Sharp 2Y0A21// připojen potře…

2024最新AI大模型-LLm八股合集(三)

常见的大模型 1.ChatGLM 1.1 背景 主流的预训练框架主要有三种&#xff1a; autoregressive自回归模型&#xff08;AR模型&#xff09; &#xff1a;代表作GPT。本质上是一个left-to-right的语言模型。 通常用于生成式任务 &#xff0c;在长文本生成方面取得了巨大的成功…

【x264】整体框架汇总

【x264】整体框架汇总 1. x264整体框架图2. 思考 参考&#xff1a; x264源代码简单分析&#xff1a;概述 参数分析&#xff1a; 【x264】x264编码器参数配置 流程分析&#xff1a; 【x264】x264编码主流程简单分析 【x264】编码核心函数&#xff08;x264_encoder_encode&…

空气流量和空气压力参数解耦系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 空气流量和空气压力参数解耦系统simulink建模与仿真&#xff0c;在许多系统中&#xff0c;空气流量&#xff08;Q&#xff09;和压力&#xff08;P&#xff09;之间存在耦合关…

SpringBoot + thymeleaf 修改文件,刷新页面不能实时展示修改后的内容问题解决

修改页面后文件后&#xff0c;刷新页面&#xff0c;内容不变&#xff0c;是因为项目没有编译&#xff0c;没有将新的页面文件编译&#xff0c;以下方法可以完美解决次问题 具体内容请查看&#xff1a;http://www.haozgx.top/blog/article/2

注解详解系列 - @Transactional

注解简介 在今天的每日一注解中&#xff0c;我们将探讨Transactional注解。Transactional是Spring框架中的一个注解&#xff0c;用于管理事务&#xff0c;以确保操作的原子性、一致性、隔离性和持久性&#xff08;ACID属性&#xff09;。 注解定义 Transactional注解用于声明…

vue element-ui 车牌号选择组件

实现效果 carnumber.vue <template><div class"car_no_popover"><div class"row_div"><div class"every_div" v-for"item in area"><button click"selectCarNo(item)">{{ item }}</butto…

绿色免费离线版JS加密混淆工具 - 支持全景VR加密, 小程序js加密, H5网站加密

自从我们推出在线版的免费JS加密混淆工具以来&#xff0c;受到了广大用户的热烈欢迎。特别是全景开发人员&#xff0c;他们使用该工具加密VR插件的JS代码, 添加域名锁等&#xff0c;都非常有效地保护了插件的代码资源。 最近&#xff0c;我们收到了许多用户的反馈&#xff0c;…

Android WindowFeature小探究

主Activity&#xff0c;用来提供文字信息和输入效果ID&#xff1a; package com.zms.windowfeature; import org.xml.sax.Parser; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.v…

【代码随想录算法训练营第四十一天|1049.最后一块石头的重量II、494.目标和、474.一和零】

文章目录 1049.最后一块石头的重量II494.目标和474.一和零 1049.最后一块石头的重量II 稍微数学退一下就可以看出实际上还是把数组分成两个部分&#xff0c;去求两个子集的差值的最小值&#xff0c;和昨天最后一题是一样的。 class Solution:def lastStoneWeightII(self, sto…

Cloneable接口和对象的克隆——浅拷贝和深拷贝

用Clonable接口实现对象的克隆——浅拷贝和深拷贝 1. 浅拷贝2. 深拷贝 在Object类中提供了clone方法&#xff0c;用来是实现对象的克隆&#xff01; 1. 浅拷贝 我们首先来尝试用clone方法去克隆一个Person对象 public class Person {public String name;public int age;publi…

Perforce静态代码分析专家解读MISRA C++:2023®新标准:如何安全、高效地使用基于范围的for循环,防范未定义行为

MISRA C&#xff1a;2023——MISRA C 标准的下一个版本来了&#xff01;为了帮助您了解 MISRA C&#xff1a;2023相比于之前版本的变化&#xff0c;我们将继续为您带来Perforce首席技术支持工程师Frank van den Beuken博士的博客系列&#xff0c;本期为第三篇。 在前两篇系列文…

【NLP基础知识】有哪些相似度计算方式(持续更新)

相异性/相似性的计算-zine 相似度计算方式 1. Euclidean Distance (L2) 用途&#xff1a;主要用于计算机视觉领域。 解释&#xff1a;计算两个点之间的直线距离。假设有两个向量 a [ a 1 , a 2 , . . . , a n ] \mathbf{a} [a_1, a_2, ..., a_n] a[a1​,a2​,...,an​] …

企业为何需要搭建线上虚拟品牌展厅?

在数字化时代&#xff0c;线上虚拟品牌展厅已成为企业不可或缺的一部分。以下是构建线上虚拟品牌展厅的4大关键理由&#xff1a; 1、迎合在线购物趋势 随着移动互联网的飞速发展和普及&#xff0c;消费者越来越倾向于在线购物。一个线上虚拟品牌展厅能够完美地满足这一需求&am…

数据分析必备:一步步教你如何用matplotlib做数据可视化(5)

1、Matplotlib Multiplots 在本章中&#xff0c;我们将学习如何在同一画布上创建多个子图。 subplot()函数返回给定网格位置的axes对象。此函数的签名是 plt.subplot(subplot(nrows, ncols, index)在当前图中&#xff0c;该函数创建并返回一个Axes对象&#xff0c;在ncolsaxe…

VScode如何调试

调试 1.打断点 1.点击调试按钮 3.点击下拉选择环境node&#xff0c;点击绿三角选择输入调试的命令&#xff08;具体命令查看package.json中scripts中的哪一个命令和运行的文件&#xff09;&#xff0c;点击右边的设置&#xff08;可以直接跳下面第八步&#xff01;&#xff…