Mapreduce 的簡單例子2 多個檔案的數字排序
並行演算法能算很多東西,不只是計數,wordCount是一個比較簡單的例子,很多其他的請參見我上傳的基於mapreduce 的並行演算法的設計。
今天來實現一個排序的簡單例子。實現過程從簡,因為具體的流程在我寫的wordCount中已經詳細的寫在註釋裡了
首先輸入是一堆檔案file1、file2……裡面存著數字,具體的邏輯是先對數字進行分塊,比如100-200放在一起,200-300……然後每組分別分發給下面,
算完結果一拼就ok了
具體不囉嗦,直接貼程式碼
map
package sort; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; /** * Created by zhangguanlong on 2017/11/15. */ public class SortMapper extends Mapper<Object, Text, IntWritable, IntWritable>{ private static IntWritable data = new IntWritable(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); data.set(Integer.parseInt(line)); context.write(data, new IntWritable(1)); } }
reduce
Runner 為了方便分割槽也寫在這個裡。。按照程式設計思想,應該分開的。。但是我就這麼寫了,感覺這樣寫比較舒服,也許我是個假的程式設計師 0.0package sort; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; /** * Created by zhangguanlong on 2017/11/15. */ public class SortReducer extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable>{ private static IntWritable linenum = new IntWritable(1); public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { for (IntWritable val : values) { context.write(linenum, key); linenum = new IntWritable(linenum.get() + 1); } } }
程式碼里路徑這麼寫其實是放在hdfs的檔案系統裡的 ,所以我們把檔案上傳到hdfspackage sort; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Partitioner; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; /** * Created by zhangguanlong on 2017/11/15. */ public class SortRunner { public static class Partition extends Partitioner<IntWritable, IntWritable> { @Override public int getPartition(IntWritable key, IntWritable value, int numPartitions) { int MaxNumber = 65223; int bound = MaxNumber / numPartitions + 1; int keynumber = key.get(); for (int i = 0; i < numPartitions; i++) { if (keynumber < bound * i && keynumber >= bound * (i - 1)) return i - 1; } return 0; } } /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub Configuration conf = new Configuration(); Job job = new Job(conf, "Sort"); job.setJarByClass(SortRunner.class); job.setMapperClass(SortMapper.class); job.setPartitionerClass(Partition.class); job.setReducerClass(SortReducer.class); job.setOutputKeyClass(IntWritable.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("/wc/sort1/")); FileOutputFormat.setOutputPath(job, new Path("/wc/sort2/")); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
注意這裡的file本來是放在linux根目錄下的,不懂得可以去看hadoop 和linux的shell指令,然後執行
[[email protected] ~]$ hadoop jar SProject.jar sort.SortRunner
注意這裡因為輸出目錄寫死了,如果目錄已存在會報錯。。。
成功跑起來是這個樣子
還要注意的是檔案裡一定不要有空格,內容必須是數字,因為這只是個簡單的demo。。。。
跑完看下結果
over
相關推薦
Mapreduce 的簡單例子2 多個檔案的數字排序
並行演算法能算很多東西,不只是計數,wordCount是一個比較簡單的例子,很多其他的請參見我上傳的基於mapreduce 的並行演算法的設計。 今天來實現一個排序的簡單例子。實現過程從簡,因為具體的流程在我寫的wordCount中已經詳細的寫在註釋裡了 首先輸入是一堆檔案
Jsoup簡單例子2.0——多執行緒爬取網頁內的郵箱
上一篇文章講了利用Jsoup爬取貼吧帖子裡的郵箱,雖然爬取成功了,但我對效率有所追求。10頁的帖子爬取了兩百多個郵箱,最快用時8秒,一般需要9秒。在思考了一下怎麼提升效率後,決定採用多執行緒的方式爬取網頁內的郵箱。廢話不多說,直接上程式碼。 引入Jsoup的jar包此處省略,沒有的可以檢視上篇文
IC數字前端設計開發9(vim——開啟多個檔案、同時顯示多個檔案、在檔案之間切換)
開啟多個檔案: 1.vim還沒有啟動的時候: 在終端裡輸入 vim file1 file2 ... filen便可以開啟所有想要開啟的檔案 2.vim已經啟動 輸入 :open file
IC數字前端設計開發21 (shell指令碼示例:批量比較多個檔案的內容是否相同)
來自:https://www.linuxidc.com/Linux/2017-08/146536.htm 要比較兩個檔案的內容是否完全一致,可以簡單地使用diff命令。例如: diff file1 file2 &>./tmp/null.txt 但是dif
asp.net簡單例項——同時上傳多個檔案
之前在網站上看到的一些上傳檔案的功能,感覺還是蠻方便的,這次自己利用asp.net中的HttpFileCollection類做了一個簡單的例子。廢話不多說,下面看操作。 首先,新增一個新的web窗體,在窗體上直接拖拽這幾個控制元件:一個Panel作為容器、
C語言及程式設計進階例程-2 一個程式,多個檔案
演示:建立多檔案的專案main.c#include <stdio.h> int max(int x,int y); int main( ) { int a,b,c; printf("輸入兩數:"); scanf("%d %d", &a, &b
phpstorm將多個int數字拼接成字符串
多個 使用 數組使用 class 搜索字符串 div phpstorm 分隔 repl 場景:將程序輸出的多個int數字拼成以‘,‘分隔的字符串 數據為 8680 24399 37619 45425 49635 139334 386918 429498 461616 52
java實現多個檔案以壓縮包匯出到本地
描述:使用java將多個檔案同時壓縮為壓縮包,並匯出到本地 /** *壓縮檔案並匯出 */ public static void zipFiles() throws IOException { File file = null; String zipFileName = ""; File[
【經驗分享】如何將一個PDF檔案拆分成多個檔案
從事於辦公的夥伴每天都需要處理到各式各樣的辦公檔案,PDF格式的檔案就是其中的一種,有時候遇到一份PDF檔案頁面比較多,處理起來很麻煩的話我們該用什麼樣的方法呢?在這裡可以將一個PDF檔案拆分成多個檔案,這樣子就方便了很多。下面就將這種方法分享給大家!以供大家參考。 &n
awk開啟多個檔案的方法
本文引自:http://www.cnblogs.com/Berryxiong/p/6209324.html 1、當awk讀取的檔案只有兩個的時候,比較常用的有三種方法 (1)awk 'NR==FNR{...}NR>FNR{...}' file1 file2 (2)awk 'NR=
一次下載多個檔案的解決思路-JS
一次下載多個檔案的解決思路(iframe) - Eric 真實經歷 最近開發專案需要做檔案下載,想想挺簡單的,之前也做過,後臺提供下載介面,前端使用window.location.href就行了唄。不過開發的時候發現,有些檔案有附屬檔案,點選 下載按鈕 需要下載兩個檔案,而且不能使用壓縮包的形式。想想
如何在 Linux 中一次重新命名多個檔案
你可能已經知道,我們使用 mv 命令在類 Unix 作業系統中重新命名或者移動檔案和目錄。 但是,mv 命令不支援一次重新命名多個檔案。 不用擔心。 在本教程中,我們將學習使用 Linux 中的 mmv 命令一次重新命名多個檔案。 此命令用於在類 Unix 作業系統中使用標準萬用字元批量移動、複製、追加和重新
Python基礎 使用with結構開啟多個檔案
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
微信小程式上傳(多個檔案上傳)
微信小程式上傳(多個檔案上傳) /** * 上傳照片//選擇圖片時限制9張,如需超過9張,同理亦可參照此方法上傳多張照片 */ uploadImg:function(){ var that = this; wx.chooseImage({ count
16-GPRS(Air202)關於多個檔案中的變數呼叫和定時器
https://www.cnblogs.com/yangfengwu/p/9968405.html 因為自己看到好多問多個檔案呼叫的,感覺這個應該說一說 對了大家有沒有知道這個是幹什麼的 大家有沒有看這篇 https://www.cnblogs.com/yang
Struts的多個檔案上傳
public class UploadsAction extends BaseAction{ private File[] file; private String[] fileFileName; private String[] fileContentType; p
tensorflow-讀取多個檔案
#!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Sat Sep 15 10:54:53 2018 @author: myhaspl @email:[email protected] 讀取多個檔案 """ import t
sed 批量替換多個檔案內容
格式: sed -i "s/查詢欄位/替換欄位/g" `grep 查詢欄位 -rl 路徑` linux sed 批量替換多個檔案中的字串 sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir` 例如: sed -
Swift中避免在多個檔案中重複import相同的第三方包
swift中由於有名稱空間的存在,在同一個target建立的檔案,都可以不引用直接就可以拿來使用,但是不同target之間必須要import 之後才能使用,在不同的檔案中使用都要重複的import這個模組 //隨便在一個檔案中新增自己想要的類庫 ///MARK:TODO 定義常用的類庫資訊, 使用@_
Struts2單個檔案和多個檔案上傳
<一>簡述: Struts2的檔案上傳其實也是通過攔截器來實現的,只是該攔截器定義為預設攔截器了,所以不用自己去手工配置,<interceptor name=”fileUpload” class=”org.apache.struts2.interceptor.