java mapreduce程序_简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行...

[TOC]

简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行

程序源码

import java.io.IOException;

import java.util.Iterator;

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.input.TextInputFormat;

import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

import org.apache.hadoop.util.GenericOptionsParser;

public class Score {

public static class Map extends

Mapper {

// 实现map函数

public void map(LongWritable key, Text value, Context context)

throws IOException, InterruptedException {

// 将输入的纯文本文件的数据转化成String

String line = value.toString();

// 将输入的数据首先按行进行分割

StringTokenizer tokenizerArticle = new StringTokenizer(line, "\n");

// 分别对每一行进行处理

while (tokenizerArticle.hasMoreElements()) {

// 每行按空格划分

StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken());

String strName = tokenizerLine.nextToken();// 学生姓名部分

String strScore = tokenizerLine.nextToken();// 成绩部分

Text name = new Text(strName);

int scoreInt = Integer.parseInt(strScore);

// 输出姓名和成绩

context.write(name, new IntWritable(scoreInt));

}

}

}

public static class Reduce extends

Reducer {

// 实现reduce函数

public void reduce(Text key, Iterable values,

Context context) throws IOException, InterruptedException {

int sum = 0;

int count = 0;

Iterator iterator = values.iterator();

while (iterator.hasNext()) {

sum += iterator.next().get();// 计算总分

count++;// 统计总的科目数

}

int average = (int) sum / count;// 计算平均成绩

context.write(key, new IntWritable(average));

}

}

public static void main(String[] args) throws Exception {

Configuration conf = new Configuration();

// "localhost:9000" 需要根据实际情况设置一下

conf.set("mapred.job.tracker", "localhost:9000");

// 一个hdfs文件系统中的 输入目录 及 输出目录

String[] ioArgs = new String[] { "input/score", "output" };

String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();

if (otherArgs.length != 2) {

System.err.println("Usage: Score Average ");

System.exit(2);

}

Job job = new Job(conf, "Score Average");

job.setJarByClass(Score.class);

// 设置Map、Combine和Reduce处理类

job.setMapperClass(Map.class);

job.setCombinerClass(Reduce.class);

job.setReducerClass(Reduce.class);

// 设置输出类型

job.setOutputKeyClass(Text.class);

job.setOutputValueClass(IntWritable.class);

// 将输入的数据集分割成小数据块splites,提供一个RecordReder的实现

job.setInputFormatClass(TextInputFormat.class);

// 提供一个RecordWriter的实现,负责数据输出

job.setOutputFormatClass(TextOutputFormat.class);

// 设置输入和输出目录

FileInputFormat.addInputPath(job, new Path(otherArgs[0]));

FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

System.exit(job.waitForCompletion(true) ? 0 : 1);

}

}

编译

命令

javac Score.java

依赖错误

如果出现如下错误:

mint@lenovo ~/Desktop/hadoop $ javac Score.java

Score.java:4: error: package org.apache.hadoop.conf does not exist

import org.apache.hadoop.conf.Configuration;

^

Score.java:5: error: package org.apache.hadoop.fs does not exist

import org.apache.hadoop.fs.Path;

^

Score.java:6: error: package org.apache.hadoop.io does not exist

import org.apache.hadoop.io.IntWritable;

^

Score.java:7: error: package org.apache.hadoop.io does not exist

import org.apache.hadoop.io.LongWritable;

^

Score.java:8: error: package org.apache.hadoop.io does not exist

import org.apache.hadoop.io.Text;

尝试修改环境变量CLASSPATH

sudo vim /etc/profile

# 添加如下内容

export HADOOP_HOME=/usr/local/hadoop # 如果没设置的话, 路径是hadoop安装目录

export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH # 如果没设置的话

export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH

source /etc/profile

然后重复上述编译命令.

打包

编译之后会生成三个class文件:

mint@lenovo ~/Desktop/hadoop $ ls | grep class

Score.class

Score$Map.class

Score$Reduce.class

使用tar程序打包class文件.

tar -cvf Score.jar ./Score*.class

会生成Score.jar文件.

提交运行

样例输入

mint@lenovo ~/Desktop/hadoop $ ls | grep txt

chinese.txt

english.txt

math.txt

mint@lenovo ~/Desktop/hadoop $ cat chinese.txt

Zhao 98

Qian 9

Sun 67

Li 23

mint@lenovo ~/Desktop/hadoop $ cat english.txt

Zhao 93

Qian 42

Sun 87

Li 54

mint@lenovo ~/Desktop/hadoop $ cat math.txt

Zhao 38

Qian 45

Sun 23

Li 43

上传到HDFS

hdfs dfs -put ./*/txt input/score

mint@lenovo ~/Desktop/hadoop $ hdfs dfs -ls input/score

Found 3 items

-rw-r--r-- 1 mint supergroup 28 2017-01-11 23:25 input/score/chinese.txt

-rw-r--r-- 1 mint supergroup 29 2017-01-11 23:25 input/score/english.txt

-rw-r--r-- 1 mint supergroup 29 2017-01-11 23:25 input/score/math.txt

运行

mint@lenovo ~/Desktop/hadoop $ hadoop jar Score.jar Score input/score output

17/01/11 23:26:26 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032

17/01/11 23:26:27 INFO input.FileInputFormat: Total input paths to process : 3

17/01/11 23:26:27 INFO mapreduce.JobSubmitter: number of splits:3

17/01/11 23:26:27 INFO Configuration.deprecation: mapred.job.tracker is deprecated. Instead, use mapreduce.jobtracker.address

17/01/11 23:26:27 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1484147224423_0006

17/01/11 23:26:27 INFO impl.YarnClientImpl: Submitted application application_1484147224423_0006

17/01/11 23:26:27 INFO mapreduce.Job: The url to track the job: http://lenovo:8088/proxy/application_1484147224423_0006/

17/01/11 23:26:27 INFO mapreduce.Job: Running job: job_1484147224423_0006

17/01/11 23:26:33 INFO mapreduce.Job: Job job_1484147224423_0006 running in uber mode : false

17/01/11 23:26:33 INFO mapreduce.Job: map 0% reduce 0%

17/01/11 23:26:40 INFO mapreduce.Job: map 67% reduce 0%

17/01/11 23:26:41 INFO mapreduce.Job: map 100% reduce 0%

17/01/11 23:26:46 INFO mapreduce.Job: map 100% reduce 100%

17/01/11 23:26:46 INFO mapreduce.Job: Job job_1484147224423_0006 completed successfully

17/01/11 23:26:47 INFO mapreduce.Job: Counters: 49

File System Counters

FILE: Number of bytes read=129

FILE: Number of bytes written=471147

FILE: Number of read operations=0

FILE: Number of large read operations=0

FILE: Number of write operations=0

HDFS: Number of bytes read=443

HDFS: Number of bytes written=29

HDFS: Number of read operations=12

HDFS: Number of large read operations=0

HDFS: Number of write operations=2

Job Counters

Launched map tasks=3

Launched reduce tasks=1

Data-local map tasks=3

Total time spent by all maps in occupied slots (ms)=15538

Total time spent by all reduces in occupied slots (ms)=2551

Total time spent by all map tasks (ms)=15538

Total time spent by all reduce tasks (ms)=2551

Total vcore-milliseconds taken by all map tasks=15538

Total vcore-milliseconds taken by all reduce tasks=2551

Total megabyte-milliseconds taken by all map tasks=15910912

Total megabyte-milliseconds taken by all reduce tasks=2612224

Map-Reduce Framework

Map input records=12

Map output records=12

Map output bytes=99

Map output materialized bytes=141

Input split bytes=357

Combine input records=12

Combine output records=12

Reduce input groups=4

Reduce shuffle bytes=141

Reduce input records=12

Reduce output records=4

Spilled Records=24

Shuffled Maps =3

Failed Shuffles=0

Merged Map outputs=3

GC time elapsed (ms)=462

CPU time spent (ms)=2940

Physical memory (bytes) snapshot=992215040

Virtual memory (bytes) snapshot=7659905024

Total committed heap usage (bytes)=732430336

Shuffle Errors

BAD_ID=0

CONNECTION=0

IO_ERROR=0

WRONG_LENGTH=0

WRONG_MAP=0

WRONG_REDUCE=0

File Input Format Counters

Bytes Read=86

File Output Format Counters

Bytes Written=29

输出

mint@lenovo ~/Desktop/hadoop $ hdfs dfs -ls output

Found 2 items

-rw-r--r-- 1 mint supergroup 0 2017-01-11 23:26 output/_SUCCESS

-rw-r--r-- 1 mint supergroup 29 2017-01-11 23:26 output/part-r-00000

mint@lenovo ~/Desktop/hadoop $ hdfs dfs -cat output/part-r-00000

Li 40

Qian 32

Sun 59

Zhao 76

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

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

相关文章

python删除列表一段元素_Python基础--list列表删除元素

列表中删除元素主要分为以下 3 种场景: 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法; 根据元素本身的值进行删除,可使用列表(list类型)提供的 remove() 方法; 将列…

microbit编程_使用图形化编程实现主控板与手机蓝牙通讯(2019.3.25)

本文转自:DFRobot创客社区原文链接:[Mind]使用图形化编程实现主控板与手机蓝牙通讯-Mind论坛-DF创客社区​mc.dfrobot.com.cn本帖最后由 Forgotten 于 2019-3-25 12:58 编辑做项目时我们经常会遇到蓝牙的问题,例如使用appinventor制作一个app…

山海伏妖录java_山海伏妖录攻略大全 剧情结局加点妖兽大全

山海伏妖录是一款非常经典的ARPG游戏,其中有许多的剧情,结局,妖兽以及加点方案。Remilia为大家带来山海伏妖录攻略大全,各种攻略都能在这里查到,助您畅玩山海伏妖录!山海伏妖录人物介绍配角介绍山海伏妖录结…

spark环境搭建java_Spark MLlib 环境搭建超详细教程

1、系统及环境版本系统:Win7 旗舰版 64位 sp1JDK:1.8.0Spark:2.3.2Hadoop:2.7Scala:2.11.8文章最后,有所有版本的下载链接,不用再去折腾版本之间的问题。2、环境下载2.1 Spark 下载spark2.2 had…

python自动发邮件附件_python自动发送带附件的邮件(163邮箱,亲测可用)

1.设置发送邮件邮箱的SMTP服务 https://www.360kuai.com/pc/927b9f8da3555bb70?cota4&kuai_so1&tj_urlxz&sign360_57c3bbd1&refer_sceneso_1 设置步骤时,记住设置的邮箱的独立密码,在以下脚本中能够用到2. python脚本 import smtplib f…

java 导出bcp文件格式_使用BCP导出导入数据

bcp 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容量复制数据。 使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件。 除非与 queryout 选项一起使用,否则使用该实用工具不需要了解 Transact-SQL…

learnpythonthehardway下载_LearnPythonTheHardWay学习笔记1:学习环境搭建

觉得学习这本书应该有笔记,所以就从这里开始吧。 学习资料: 1.《笨办法学Python》(承德-至阳整理 2013/7/19) 2.《Learn Python The Hard Way,3rd Edition》 (Zed A. Shaw 2010) 一、准备学习环境 &#xf…

java ajax多文件上传插件_ajaxFileUpload.js插件支持多文件上传的方法

前提条件:ajaxFileUpload.js插件多文件上传步骤:1、修改源码,(源码只支持单个文件的上传)://修改前代码-------//var oldElement jQuery(# fileElementId);//var newElement jQuery(oldElement).clone();//jQuery(oldElement).…

鱼骨图分析法实际案例_会用“鱼骨图”的项目经理无难题

项目经理在遇到一些瓶颈问题时,如何突破这些难题?答案就是鱼骨图!项目经理,广州深圳PMP培训,PMP认证考试培训机构,圣略PMP培训考试1、鱼骨图分析法介绍鱼骨图的由来及含义鱼骨图是由日本管理大师石川馨先生所发明出来的,故又名石川…

mysql5.6.msi 百度云_如何安装Mysql数据库类型msi(5.6)

首先让大家看下我下载的数据库有多少哈,还不包括我删除的一些数据库。光是8.0.17.0的数据库我就下载了四五个,经常安装数据报错,我一直找不到是啥原因,所以我就把所有的全部给删掉了,然后一遍一遍的安装。现在想想还真…

pythonwhile循环怎么修改数据类型_python开发学习day05 (while循环; for循环; 数字类型操作)...

2020-06-05 目录: 一、流程控制之while循环 1.1 什么是while循环? 1.2 为什么要用while循环? 1.3 怎么用while循环? 1.3.1 基本用法 1.3.2 死循环 1.3.3 while循环的结束 1.3.4 while循环的嵌套 1.3.5 whilecontinue 1.3.6 whilee…

mysql如何下载msi_2、Windows下MySQL数据库下载与安装详细教程 MSI方式

做者:叁念mysql写在前言:本文篇幅比较长,可是整体分为三大部分:下载部分、安装部分、环境配置与测试部分 ;读者能够自行选择阅读web1、下载部分MySQL数据库下载与安装详细教程sql1.如何下载MySQL?(本文章以5.6版本实际…

python词云乱码_python词云库wordCloud使用方法详解(解决中文乱码)

文章中的例子主要借鉴wordColud的examples,在文章对examples中的例子做了一些改动。 一、wordColud设计中文词云乱码 使用wordColud设计词云的时候可能会产生乱码问题,因为wordColud默认的字体不支持中文,所以我们只需要替换wordColud的默认字…

easyui java管理系统_EasyUI 后台管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)开发工具:VS2015(2012以上)SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 任务调度…

linux同时安装python2和python3_linux-Centos7安装python3并与python2共存

1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5。 使用 python -V 命令查看一下是否安装Python 然后使用命令 which python 查看一下Python可执行文件的位置可见执行文件在/usr/bin/ 目录下,切换到该…

opencv获取模板旋转角度_OpenCV入门之获取图像的旋转角度

在我们的日常生活中,所碰到的图像往往都有一定的倾斜。那么,如何用OpenCV来获取图像的旋转角度呢?   我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度。可以看到,该图像存在着许多噪声,且…

后台使用orm多还是直接sql_Django应用app创建及ORM

Django应用app创建及ORM一.重要知识点回顾:1. form表单提交数据的注意事项:1. 是form不是from,必须要有method和action (action用来指定你的数据提交到后台哪个地方,method用来指定你提交数据的方式)2. 所有获取用户输入的表单标签要放在form表单里面&am…

java ruby脚本_Java 程序中直接执行 Ruby 脚本 (JRuby)

1.[代码]MainClass.javaimport java.io.BufferedReader;import java.io.FileReader;import javax.script.Invocable;import javax.script.ScriptEngine;import javax.script.ScriptEngineManager;public class MainClass {public static void main(String[] args) throws Excep…

python win32gui安装_python-无法安装win32gui

我正在尝试使用pip安装win32gui,但出现错误: C:\Users\?????>pip install win32gui Collecting win32gui Using cached https://files.pythonhosted.org/packages/b8/75/7bed82934e51903f9d48b26b3996161bb2dce1731607b4bb7fd26003ed3e/win32gui-221.5.tar.…

时间戳 java_java中获取时间戳的方法

在java开发过程中经常会遇到统计某一天或是某一个月的数据,因此常常需要获取截取数据的两个时间戳(比如统计今天的数据,则需要获取一个开始时间为今天零点以及一个结束时间为明天零点),然后根据数据相关的时间是否在该时间区间内来判断是否将…