hadoop發佈一個任務:遠程jar包部署(備忘)

ps:需要裝好HDFS的環境

此次實驗是統計各ip的訪問次數。

準備工作:

1.運行hdfs:

[root@CentOS ~]# start-dfs.sh

2.寫好任務

任務結構:

MapperDemo類,規定了如何分析數據。

package com.yun;

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

import java.io.IOException;

/**
 *  LongWritable 代表數據中  每行的字節行偏移量
 *  Test 每行的文本內容
 */
public class MapperDemo extends Mapper<LongWritable, Text,Text, IntWritable> {

    /**
     *
     * @param key :文本偏移量
     * @param value :每行文本
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //獲取第一行的第一個數據
        String ip = value.toString().split(" ")[0];
        context.write(new Text(ip),new IntWritable(1));
    }
}

ReducerDemo,規定了如何計算數據。

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

import java.io.IOException;

public class ReducerDemo extends Reducer<Text, IntWritable,Text,IntWritable> {
    /**
     *
     * @param key :ip
     * @param values :Int[]{1,1,1,...}
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int total=0;
        for (IntWritable value : values) {
            total+=value.get();
        }
        context.write(key,new IntWritable(total));
    }
}

CustomJobSubmiter,規約提交給hadoop做計算。

import org.apache.hadoop.conf.Configured;
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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

import javax.swing.*;

public class CustomJobSubmiter extends Configured implements Tool {
    public static void main(String[] args) throws Exception {
        ToolRunner.run(new CustomJobSubmiter(),args);
    }

    public int run(String[] args) throws Exception {
        //1 封裝job
        Job job = Job.getInstance(getConf());

        //附加:jar類加載器
        job.setJarByClass(CustomJobSubmiter.class);

        //2 設置數據讀入與寫出格式
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);

        //3 設置處理數據的路徑
        TextInputFormat.addInputPath(job,new Path("/demo/input"));
        TextOutputFormat.setOutputPath(job,new Path("/demo/output"));

        //4 設置計算數據使用得邏輯
        job.setMapperClass(MapperDemo.class);
        job.setReducerClass(ReducerDemo.class);

        //5 設置Mapper輸出泛型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        //6 設置Reducer輸出泛型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //7 提交任務
        job.submit();

        return 0;
    }
}

pom的配置:

<?xml version="1.0" encoding="UTF-8"?>
<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.yun</groupId>
    <artifactId>mapreduce</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!--hdfs特有的相關依賴-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-hdfs</artifactId>
            <version>2.6.0</version>
        </dependency>
        <!--hadoop普通依賴-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>2.6.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-core</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.clojure</groupId>
            <artifactId>clojure</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>

打成jar包:

找到maven工程,找到項目,點擊package打包

然後會看見target中多了個jar包。

找到這個jar包的路徑,把它傳送到 linux 中去。

如何把文件傳輸到linu,有很多辦法,這裏不贅述。

在linux根目錄下,root目錄下輸入ls查看可找到

然後需要準備 輸入的數據

這裏爲一個txt的文本

先創建一個文件

[root@CentOS ~]# vi newInput.txt

 在文件中輸入如下ip

139.212.122.190
61.233.169.47
61.235.118.135
171.10.177.236
210.44.124.58
171.10.177.236
210.38.128.203
182.81.141.169
106.91.10.155
171.15.236.27
36.61.91.146
61.233.175.233
139.205.123.246
171.14.166.146
171.14.166.146
139.212.122.190
139.212.122.190
171.10.60.168
210.44.124.58
36.61.18.65
36.63.76.3
139.212.122.190
106.91.10.155
36.63.76.3
123.234.253.167
61.233.169.47
171.10.177.236
36.63.76.3
36.63.76.3
139.205.123.246
123.234.253.167
171.15.236.27
210.44.124.58
121.76.252.189
171.14.166.146
36.60.90.114
123.234.253.167

把文件放進hdfs中:

我們在  CustomJobSubmiter 類中定義了 數據輸入及輸出的路徑,因此要把文件放入定義的輸入路徑下。

[root@CentOS ~]# hdfs dfs -put /root/newInput.txt /demo/input

 放好後,運行jar程序。hadoop jar命令 + jar包 + 需要運行的類

[root@CentOS ~]# hadoop jar mapreduce-1.0-SNAPSHOT.jar com.yun.CustomJobSubmiter

 結果會輸出到 /demo/output下,通過hadoop提供的瀏覽器訪問文件系統的方式。

 點擊下載:

獲取運算結果:

看懂的 點個贊吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章