1. 程式人生 > >Mapreduce 的簡單例子2 多個檔案的數字排序

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
package 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);
        }

    }
}
Runner 為了方便分割槽也寫在這個裡。。按照程式設計思想,應該分開的。。但是我就這麼寫了,感覺這樣寫比較舒服,也許我是個假的程式設計師 0.0
package 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);
    }
}
程式碼里路徑這麼寫其實是放在hdfs的檔案系統裡的 ,所以我們把檔案上傳到hdfs

注意這裡的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.