溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

IDEA 中怎么運行MapReduce 程序

發(fā)布時間:2021-06-21 17:54:03 來源:億速云 閱讀:1860 作者:Leah 欄目:大數(shù)據(jù)

IDEA 中怎么運行MapReduce 程序,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

1、Idea 本地獨立模式運行 MapReduce

1.1、解壓 Hadoop 和設(shè)置環(huán)境變量

將 Hadoop 解壓本地目錄,例如 C:\Hadoop

設(shè)置環(huán)境變量:

  • HADOOP_HOME 指向 Hadoop 解壓目錄

  • HADOOP_USER_NAME : 用戶名,Hadoop 運行的用戶名(下一節(jié) 遠(yuǎn)程提交需要,跟 HDFS 集群所用的一樣)

  • PATH:添加指向 HADOOP_HOME\bin 和 HADOOP_HOME\sbin 的值

重要:Windows 系統(tǒng):Windows 運行 Hadoop 需要 winutils.exe 和 hadoop.dll 這兩個文件:

  • https://github.com/cdarlint/winutils 下載對應(yīng) Hadoop 版本的

  • hadoop.dll 復(fù)制到 C:\Windows\System32

  • winutils.exe 復(fù)制到 HADOOP_HOME\bin

1.2、新建項目

示例項目在 src/hadoop

選擇 Gradle 或者 Maven 等構(gòu)建工具,添加如下依賴:version 對應(yīng) Hadoop 的版本。

// https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common
compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '3.2.1'
// https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client
compile group: 'org.apache.hadoop', name: 'hadoop-client', version: '3.2.1'

日志輸出配置:項目/src/main/resource/log4j.properties

log4j.appender.A1.Encoding=UTF-8
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{ABSOLUTE} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %m%n

新建:org.xiao.hadoop.chapter01.WordCount.class :

public class WordCount {
    public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {

        private final static IntWritable ONE = new IntWritable(1);
        private final Text word = new Text();

        @Override
        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            // 按照空格切割字符串,一行一行輸入的
            // Context 將輸出內(nèi)容寫入 《Hadoop 權(quán)威指南》P25
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, ONE);
            }
        }
    }

    public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private final IntWritable result = new IntWritable();

        @Override
        public void reduce(Text key, Iterable<IntWritable> values, Context context)
                throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        // 讀取配置文件
        Configuration conf = new Configuration();
        // 設(shè)置任務(wù)名稱
        Job job = Job.getInstance(conf, "WordCount");
        // 設(shè)置運行的 jar 包,通過 class 的形式 TODO:驗證直接設(shè)置 jar 包
        job.setJarByClass(WordCount.class);
        // Map 的類,
        job.setMapperClass(WordCountMapper.class);
        // Reducer 類的設(shè)置
        // Combiner 是非必須的,屬于優(yōu)化方案,用于找出每個 Map 的結(jié)果,然后再通過 Reducer 再次聚合
        // 作用是減少每個 map 輸出結(jié)果量,有他沒他最終結(jié)果是一樣的 ,《Hadoop 權(quán)威指南》中文第三版 P35
        job.setCombinerClass(WordCountReducer.class);
        job.setReducerClass(WordCountReducer.class);
        // 設(shè)置輸出的 key--value 的類型,Hadoop 的 org.apache.hadoop.io 包提供了一套可優(yōu)化的網(wǎng)絡(luò)序列化傳輸基本類型。
        // 并不直接使用 Java 的內(nèi)嵌類型
        // Text 相當(dāng)于 String
        job.setOutputKeyClass(Text.class);
        // IntWritable 相當(dāng)于 Integer
        job.setOutputValueClass(IntWritable.class);
        // 設(shè)置輸入文件的路徑,可以直接指定或者通過傳入?yún)?shù)
        FileInputFormat.addInputPath(job, new Path("input/chapter01/WordCount"));
        // 設(shè)置輸出文件的存放路徑
        FileOutputFormat.setOutputPath(job, new Path("output/chapter01/WordCount"));
        // true 表示打印 job 和 Task 的運行日志,如果正常運行結(jié)束則返回零
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

如果是 Windows 系統(tǒng)和 Gradle 項目,需要打開 Idea 設(shè)置,將 Gradle 的設(shè)置如下,不然日志會亂碼

IDEA 中怎么運行MapReduce 程序

Hadoop 輸入文件:input/chapter01/WordCount/word.txt

hello world
hello hadoop
hello bigdata
hello hadoop  and bigdata

Hadoop 輸出文件夾,output/chapter01/WordCount 運行程序前需要刪除。

在 WordCount.class 按 Ctrl + Shift + F10 直接運行程序即可。項目運行配置:

IDEA 中怎么運行MapReduce 程序

輸出示例:src/hadoop/output/chapter01/WordCount/part-r-00000,沒有錯誤。

and	1
bigdata	2
hadoop	2
hello	4
world	1

2、Idea 遠(yuǎn)程提交 MapReduce

前提已經(jīng)完成:Hadoop 安裝和配置

2020.05.07 更新:追蹤源碼發(fā)現(xiàn),這只是使用集群中的文件,并沒有提交到集群。見 2.5 真遠(yuǎn)程提交。

2.1、在上一節(jié)的基礎(chǔ)上,增加如下配置:

文件: resource/core-site.xml

<configuration>
  <property>
    <!-- URI 定義主機名稱和 namenode 的 RPC 服務(wù)器工作的端口號 -->
    <name>fs.defaultFS</name>
    <value>hdfs://master:9000</value>
  </property>
  <!--
  <property> 這個可以設(shè)置為本地路徑,但沒有什么用,這個路徑是 Hadoop 集群用的
    Hadoop 臨時目錄,默認(rèn)是系統(tǒng)的臨時目錄下,/tmp/hadoop-${username} 下
    <name>hadoop.tmp.dir</name>
    <value>/home/xian/hadoop/cluster</value>
  </property>  -->
</configuration>

文件 resource/mapred-site.xml

<configuration>
    <!-- 遠(yuǎn)程提交到 Linux 的平臺上 -->
    <property>         
        <name>mapred.remote.os</name>  
        <value>Linux</value>
        <description>Remote MapReduce framework's OS, can be either Linux or Windows</description>    
    </property>
    <!--允許跨平臺提交 解決 /bin/bash: line 0: fg: no job control  -->
    <property>
        <name>mapreduce.app-submission.cross-platform</name>
        <value>true</value>
    </property>
</configuration>

hdfs-site.xml 和 yarn-site.xml 可以直接復(fù)制集群上的配置文件。

2.2、安裝 BigDataTools 插件

安裝 Idea 官方的 BigDataTools 插件,配置連接到 HDFS 集群??梢苑奖愕纳蟼?、下載、刪除文件。

IDEA 中怎么運行MapReduce 程序

2.3、修改一下代碼

Map 輸入文件路徑可以是絕對路徑,也可以是相對路徑。

// 讀取配置文件,自動讀取 resource 的那幾個 xml
Configuration conf = new Configuration();
// 省略其他
// 設(shè)置輸入文件的路徑,可以直接指定或者通過傳入?yún)?shù)
// new Path(arg[0]) 通過 Programmer argument 傳入
// Path("input") 等于 hdfs://master:9000/user/{HADOOP_USER_NAME}/input
FileInputFormat.addInputPath(job, new Path("input"));
// 設(shè)置輸出文件的存放路徑
FileOutputFormat.setOutputPath(job, new Path("output"));

將 input/chapter01/WordCount/word.txt 上傳到 hdfs://master:9000/user/{HADOOP_USER_NAME}/input,(上文:解壓 Hadoop 和設(shè)置環(huán)境變量)

2.4、運行項目

如果已經(jīng)存在 output 文件夾,需要先刪除了。

同樣,按 Ctrl + Shift + F10 運行項目,結(jié)果存儲在 hdfs://master:9000/user/{HADOOP_USER_NAME}/output/part-r-00000 中。

2.5、真遠(yuǎn)程提交方式

首先,使用 Gradle 將代碼打包成 jar 文件,修改文件 src/hadoop/build.gradle,添加

dependencies {
// 省略依賴
}
// 支持中文編碼和注釋
tasks.withType(JavaCompile) {options.encoding = "UTF-8"}

使用 Gradle 打包成 jar ,點擊右邊 框起來的 jar 命令,左邊是生產(chǎn)的 jar 文件。

IDEA 中怎么運行MapReduce 程序

將 jar 提交到遠(yuǎn)程,以下兩種方式:

方式一:文件 src/hadoop/src/main/java/org/xiao/hadoop/chapter01/WordCount.java 讀取配置文件的地方

 // 讀取配置文件
Configuration conf = new Configuration();
conf.set("mapreduce.job.jar","D:/Project/BigDateNotes/src/hadoop/build/libs/hadoop-1.0.0.jar");

或者 mapred-site.xml 文件添加,注意不管方式一還是方式二,都必須指定 :mapreduce.framework.name 為 yarn。

<configuration>
    <property>
        <!-- 使用 Yarn Windows 下遠(yuǎn)程提交去掉這個 https://www.oschina.net/question/2478160_2231358
        會導(dǎo)致找不 Map Reduce 類,原因是遠(yuǎn)程提交,job.setJarByClass 失效 -->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <!-- 設(shè)置提交的 jar 文件路徑 方式二 -->
        <name>mapreduce.job.jar</name>
        <value>D:/Project/BigDateNotes/src/hadoop/build/libs/hadoop-1.0.0.jar</value>
    </property>
</configuration>

提交運行就行了

小結(jié):

  • Window 下運行 Hadoop 需要 winutils.exe 和 hadoop.dll

  • 推薦使用構(gòu)建工具如 Maven、Gradle 管理 Hadoop 依賴

  • Windows 下 需要設(shè)置 Gradle 的 build and run using、tests run using 為 IDEA(因為中文注釋和終端輸出亂碼問題)

  • Idea 遠(yuǎn)程提交需要設(shè)置 mapred.remote.os,mapreduce.app-submission.cross-platform,mapreduce.job.jar 這三個配置。

關(guān)于IDEA 中怎么運行MapReduce 程序問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI