Java實現MapReduce Wordcount案例

来源:https://www.cnblogs.com/mcq1999/archive/2019/11/02/11780758.html
-Advertisement-
Play Games

先改pom.xml: 在resources文件夾下添加文件 log4j.properties: WordcountDriver.java: WordcountMapper.java: WordcountReducer.java: 在run configuration裡加上參數e:/mrtest/in ...


先改pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mcq</groupId>
	<artifactId>mr-1101</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<dependencies>
		<dependency>
			<groupId>jdk.tools</groupId>
			<artifactId>jdk.tools</artifactId>
			<version>1.8</version>
			<scope>system</scope>
			<systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.8.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-common</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-client</artifactId>
			<version>2.7.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.hadoop</groupId>
			<artifactId>hadoop-hdfs</artifactId>
			<version>2.7.2</version>
		</dependency>
	</dependencies>
</project>

在resources文件夾下添加文件 log4j.properties:

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

 

 WordcountDriver.java:

package com.mcq;

import java.io.IOException;

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 WordcountDriver{
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		System.out.println("hello");
		Configuration conf=new Configuration();
		//1.獲取Job對象
		Job job=Job.getInstance(conf);
		//2.設置jar存儲位置
		job.setJarByClass(WordcountDriver.class);
		//3.關聯Map和Reduce類
		job.setMapperClass(WordcountMapper.class);
		job.setReducerClass(WordcountReducer.class);
		//4.設置Mapper階段輸出數據的key和value類型
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		//5.設置最終輸出的key和value類型
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		//6.設置輸入路徑和輸出路徑
		FileInputFormat.setInputPaths(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		//7.提交Job
//		job.submit();
		job.waitForCompletion(true);
//		boolean res=job.waitForCompletion(true);//true表示列印結果
//		System.exit(res?0:1);
	}
}

 WordcountMapper.java:

package com.mcq;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

//map階段
//KEYIN:輸入數據的key(偏移量,比如第一行是0~19,第二行是20~25),必須是LongWritable
//VALUEIN:輸入數據的value(比如文本內容是字元串,那就填Text)
//KEYOUT:輸出數據的key類型
//VALUEOUT:輸出數據的值類型
public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
	IntWritable v=new IntWritable(1);
	Text k = new Text();
	@Override
	protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
			throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		//1.獲取一行
		String line=value.toString();
		//2.切割單詞
		String[] words=line.split(" ");
		//3.迴圈寫出
		for(String word:words) {
			k.set(word);
			context.write(k, v);
		}
	}
}

 WordcountReducer.java:

package com.mcq;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

//KEYIN、VALUEIN:map階段輸出的key和value類型
public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
	IntWritable v=new IntWritable();
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		// TODO Auto-generated method stub
		int sum=0;
		for(IntWritable value:values) {
			sum+=value.get();
		}
		v.set(sum);
		context.write(key, v);
	}
}

在run configuration裡加上參數e:/mrtest/in.txt e:/mrtest/out.txt

 

 

運行時遇到了個bug,參考https://blog.csdn.net/qq_40310148/article/details/86617512解決了

 

在集群上運行:

用maven打成jar包,需要添加一些打包依賴:

	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-assembly-plugin </artifactId>
				<configuration>
					<descriptorRefs>
						<descriptorRef>jar-with-dependencies</descriptorRef>
					</descriptorRefs>
					<archive>
						<manifest>
							<mainClass>com.mcq.WordcountDriver</mainClass>
						</manifest>
					</archive>
				</configuration>
				<executions>
					<execution>
						<id>make-assembly</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

 註意上面mainClass里要填驅動類的主類名,可以點擊類名右鍵copy qualified name。

將程式打成jar包(具體操作:右鍵工程名run as maven install,然後target文件夾會產生兩個jar包,我們把不用依賴的包拷貝到hadoop集群上,因為集群已經配好相關依賴了),上傳到集群

輸入以下命令運行

hadoop jar mr-1101-0.0.1-SNAPSHOT.jar com.mcq.WordcountDriver /xiaocao.txt /output

註意這裡輸入輸出的路徑是集群上的路徑。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 事務的基本特征 ACID Atomic(原子性) :事務中所有的操作是一個整體單元,這個單元中的操作要麼全部成功,要麼全部失敗,不會出現部分失敗、部分成功的場景; Consistency(一致性) :事務在完成時,必須使所有的數據都保持一致的狀態(約束 a + b = 10,事務結束後 a + b ...
  • 前述:這篇文檔是建立在三台虛擬機相互ping通,防火牆關閉,hosts文件修改,SSH 免密碼登錄,主機名修改等的基礎上開始的。 一.傳入文件 1.創建安裝目錄 mkdir /usr/local/soft 2.打開xftp,找到對應目錄,將所需安裝包傳入進去 查看安裝包:cd /usr/local/ ...
  • 前言 Redis 並沒有直接使用數據結構來實現鍵值對資料庫, 而是基於這些數據結構創建了一個對象系統, 這個系統包含字元串對象、列表對象、哈希對象、集合對象和有序集合對象這五種類型的對象, 每種對象都用到了至少一種我們前面所介紹的數據結構。 通過這五種不同類型的對象, Redis 可以在執行命令之前 ...
  • 在每次使用redis都進行連接的話會拉低redis的效率,都知道redis是基於記憶體的資料庫,效率賊高,所以每次進行連接比真正使用消耗的資源和時間還多。所以為了節省資源,減少多次連接損耗,連接池的作用相當於緩存了多個客戶端與redis服務端的連接,當有新的客戶端來進行連接時,此時,只需要去連接池獲取 ...
  • 針對“附近的人”這一位置服務領域的應用場景,常見的可使用PG、MySQL和MongoDB等多種DB的空間索引進行實現。而Redis另闢蹊徑,結合其有序隊列zset以及geohash編碼,實現了空間搜索功能,且擁有極高的運行效率。本文將從源碼角度對其演算法原理進行解析,並推算查詢時間複雜度。 操作命令 ...
  • MySQL的分頁查詢通常通過limit來實現。 MySQL的limit基本用法很簡單。limit接收1或2個整數型參數,如果是2個參數,第一個是指定第一個返回記錄行的偏移量,第二個是返回記錄行的最大數目。初始記錄行的偏移量是0。疑問:對於小的偏移量,直接使用limit來查詢沒有什麼問題,但隨著數據量 ...
  • 問題背景:前後端分離情況下後端開發測試需要配置hosts,有此問題的人員有RD,QA,PM,User 測試環境由於用戶使用這種配置導致無法使用線上系統發起單據影響用戶使用,同時讓用戶誤以為系統出問題而導致增加溝通成本。 問題原理:用戶訪問的是線上,但是由於本地hosts影響,瀏覽器載入的資源是測試環 ...
  • 1.pt query digest 安裝 cd /usr/bin wget percona.com/get/pt query digest chmod u+x pt query digest yum install y perl Time HiRes 2.命令示例 pt query digest h ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...