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.pswp.cn/news/534905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534905.shtml
英文地址,請注明出處:http://en.pswp.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開發過程中經常會遇到統計某一天或是某一個月的數據,因此常常需要獲取截取數據的兩個時間戳(比如統計今天的數據,則需要獲取一個開始時間為今天零點以及一個結束時間為明天零點),然后根據數據相關的時間是否在該時間區間內來判斷是否將…