您的位置:首頁(yè) > 軟件教程 > 教程 > 零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

來源:好特整理 | 時(shí)間:2024-11-16 10:27:12 | 閱讀:187 |  標(biāo)簽: Te a T DC 基礎(chǔ) El C in 服務(wù) 服務(wù)器 EA Intel word   | 分享到:

今天我們來聊一聊大數(shù)據(jù),作為一個(gè)Hadoop的新手,我也并不敢深入探討復(fù)雜的底層原理。因此,這篇文章的重點(diǎn)更多是從實(shí)際操作和入門實(shí)踐的角度出發(fā),帶領(lǐng)大家一起了解大數(shù)據(jù)應(yīng)用的基本過程。我們將通過一個(gè)經(jīng)典的案例——WordCounter,來幫助大家入門。簡(jiǎn)單來說,這個(gè)案例的目標(biāo)是從一個(gè)文本文件中讀取每一

今天我們來聊一聊大數(shù)據(jù),作為一個(gè)Hadoop的新手,我也并不敢深入探討復(fù)雜的底層原理。因此,這篇文章的重點(diǎn)更多是從實(shí)際操作和入門實(shí)踐的角度出發(fā),帶領(lǐng)大家一起了解大數(shù)據(jù)應(yīng)用的基本過程。我們將通過一個(gè)經(jīng)典的案例——WordCounter,來幫助大家入門。簡(jiǎn)單來說,這個(gè)案例的目標(biāo)是從一個(gè)文本文件中讀取每一行,統(tǒng)計(jì)其中單詞出現(xiàn)的頻率,最后生成一個(gè)統(tǒng)計(jì)結(jié)果。表面上看,這個(gè)任務(wù)似乎不難,畢竟我們?cè)诒镜赜肑ava程序就可以很輕松地實(shí)現(xiàn)。

然而,實(shí)際情況并非如此簡(jiǎn)單。雖然我們能夠在一臺(tái)計(jì)算機(jī)上通過簡(jiǎn)單的Java程序完成類似的任務(wù),但在大數(shù)據(jù)的場(chǎng)景下,數(shù)據(jù)量遠(yuǎn)遠(yuǎn)超過一臺(tái)機(jī)器能夠處理的能力。此時(shí),單純依賴一臺(tái)機(jī)器的計(jì)算資源就無法應(yīng)對(duì)龐大的數(shù)據(jù)量,這正是分布式計(jì)算和存儲(chǔ)技術(shù)的重要性所在。分布式計(jì)算將任務(wù)拆分為多個(gè)子任務(wù),并利用多臺(tái)機(jī)器協(xié)同工作,從而實(shí)現(xiàn)高效處理海量數(shù)據(jù),而分布式存儲(chǔ)則可以將數(shù)據(jù)切分并存儲(chǔ)在多個(gè)節(jié)點(diǎn)上,解決數(shù)據(jù)存儲(chǔ)和訪問的瓶頸。

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

因此,通過今天的介紹,我希望能夠帶大家從一個(gè)簡(jiǎn)單的例子出發(fā),逐步理解大數(shù)據(jù)處理中如何借助Hadoop這樣的分布式框架,來高效地進(jìn)行數(shù)據(jù)計(jì)算和存儲(chǔ)。

環(huán)境準(zhǔn)備

Hadoop安裝

這里我不太喜歡在本地 Windows 系統(tǒng)上進(jìn)行安裝,因?yàn)楸镜丨h(huán)境中通常會(huì)積累很多不必要的文件和配置,可能會(huì)影響系統(tǒng)的干凈與流暢度。因此,演示的重點(diǎn)將放在以 Linux 服務(wù)器為主的環(huán)境上,通過 Docker 實(shí)現(xiàn)快速部署。

我們將利用寶塔面板進(jìn)行一鍵式安裝,只需通過簡(jiǎn)單的操作即可完成整個(gè)部署過程,免去手動(dòng)敲命令的麻煩,讓安裝變得更加便捷和快速。

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

開放端口

這里,系統(tǒng)本身已經(jīng)對(duì)外開放了部分端口,例如 9870 用于訪問 Web UI 界面,但有一個(gè)重要的端口 8020 并沒有開放。這個(gè)端口是我們需要通過本地的 IntelliJ IDEA 進(jìn)行連接和使用的,因此必須手動(dòng)進(jìn)行額外的配置,確保該端口能夠正常訪問。具體操作可以參考以下示意圖進(jìn)行設(shè)置,以便順利完成連接。

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

如果你已經(jīng)成功啟動(dòng)并完成配置,那么此時(shí)你應(yīng)該能夠順利訪問并查看 Web 頁(yè)面。如圖所示:

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

項(xiàng)目開發(fā)

創(chuàng)建項(xiàng)目

我們可以直接創(chuàng)建一個(gè)新的項(xiàng)目,并根據(jù)項(xiàng)目需求手動(dòng)配置相關(guān)的項(xiàng)目信息,例如 groupId artifactId version 等基本配置。為了確保兼容性和穩(wěn)定性,我們選擇使用 JDK 8 作為開發(fā)環(huán)境版本。

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

首先,讓我們先來查看一下項(xiàng)目的文件目錄結(jié)構(gòu),以便對(duì)整個(gè)項(xiàng)目的組織形式和文件分布有一個(gè)清晰的了解。

tree /f 可以直接生成

├─input
│      test.txt
├─output
├─src
│  ├─main
│  │  ├─java
│  │  │  └─org
│  │  │      └─xiaoyu
│  │  │              InputCountMapper.java
│  │  │              Main.java
│  │  │              WordsCounterReducer.java
│  │  │
│  │  └─resources
│  │          core-site.xml
│  │          log4j.xml

接下來,我們將實(shí)現(xiàn)大數(shù)據(jù)中的經(jīng)典示例——"Hello, World!" 程序,也就是我們通常所說的 WordCounter。為了實(shí)現(xiàn)這個(gè)功能,首先,我們需要編寫 MapReduce 程序。在 Map 階段,主要的任務(wù)是將輸入的文件進(jìn)行解析,將數(shù)據(jù)分解并轉(zhuǎn)化成有規(guī)律的格式(例如,單詞和其出現(xiàn)次數(shù)的鍵值對(duì))。接著,在 Reduce 階段,我們會(huì)對(duì) Map 階段輸出的數(shù)據(jù)進(jìn)行匯總和統(tǒng)計(jì),最終得到我們想要的統(tǒng)計(jì)結(jié)果,比如每個(gè)單詞的出現(xiàn)次數(shù)。

此外,我們還需要編寫一個(gè)啟動(dòng)類——Job 類,用來配置和啟動(dòng) MapReduce 任務(wù),確保 Map 和 Reduce 階段的流程能夠順利進(jìn)行。通過這整套流程的實(shí)現(xiàn),我們就完成了一個(gè)基本的 WordCounter 程序,從而理解了 MapReduce 的核心思想與應(yīng)用。

pom依賴

這里沒有什么好說的,直接添加相關(guān)依賴即可:


    org.apache.hadoop
    hadoop-common
    3.2.0


    org.apache.hadoop
    hadoop-hdfs
    3.2.0


    log4j
    log4j
    1.2.17


    org.apache.hadoop
    hadoop-client
    3.2.0




    org.apache.hadoop
    hadoop-mapreduce-client-core
    3.2.0


    org.apache.hadoop
    hadoop-mapreduce-client-common
    3.2.0

core-site.xml

這里配置的我們遠(yuǎn)程Hadoop連接配置信息:




    
        fs.defaultFS
        hdfs://你自己的ip:8020
     

test.txt

我們此次主要以演示為主,因此并不需要處理非常大的文件。為了簡(jiǎn)化演示過程,我在此僅提供了一部分?jǐn)?shù)據(jù)。

xiaoyu xiaoyu
cuicui ntfgh
hanhan dfb
yy yy
asd dfg
123 43g
nmao awriojd

InputCountMapper

先來構(gòu)建一下InputCountMapper類。代碼如下:

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;

public class InputCountMapper extends Mapper {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString().trim();
        for (int i = 0; i < line.split(" ").length; i++) {
            word.set(line.split(" ")[i]);
            context.write(word, one);
        }
    }
}

在Hadoop的MapReduce編程中,寫法其實(shí)是相對(duì)簡(jiǎn)單的,關(guān)鍵在于正確理解和定義泛型。你需要集成一個(gè) Mapper 類,并根據(jù)任務(wù)的需求為其定義四個(gè)泛型類型。在這個(gè)過程中,每?jī)蓚(gè)泛型組成一對(duì),形成K-V(鍵值對(duì))結(jié)構(gòu)。以上面的例子來說,輸入數(shù)據(jù)的K-V類型是 LongWritable-Text ,輸出數(shù)據(jù)的K-V類型定義為 Text-IntWritable 。這里的 LongWritable Text 、 IntWritable 等都是Hadoop自定義的數(shù)據(jù)類型,它們代表了不同的數(shù)據(jù)格式和類型。除了 String 在Hadoop中被替換成 Text ,其他的數(shù)據(jù)類型通常是在后面加上 Writable 后綴。

接下來,對(duì)于 Mapper 類的輸出格式,我們已經(jīng)在代碼中定義了格式類型。然而,需要注意的是,我們重寫的 map 方法并沒有直接返回值。相反, Mapper 類會(huì)通過 Context 上下文對(duì)象來傳遞最終結(jié)果。

因此,我們只需要確保在 map 方法中將格式化后的數(shù)據(jù)存入 Context ,然后交給 Reducer 處理即可。

WordsCounterReducer

這一步的代碼如下:

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

import java.io.IOException;

public class WordsCounterReducer extends Reducer {
    @Override
    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
        int sum = 0;
        for (IntWritable val : values) {
            sum += val.get();
        }
        context.write(key, new IntWritable(sum));
    }
}

在Hadoop的MapReduce編程中, Reduce 階段的寫法也遵循固定模式。首先,我們需要集成 Reducer 類,并定義好四個(gè)泛型參數(shù),類似于 Mapper 階段。這四個(gè)泛型包括輸入鍵值對(duì)類型、輸入值類型、輸出鍵值對(duì)類型、以及輸出值類型。

Reduce 階段,輸入數(shù)據(jù)的格式會(huì)有所變化,尤其是在值的部分,通常會(huì)變成 Iterable 類型的集合。這個(gè)變化的原因是, Mapper 階段處理時(shí),我們通常將每個(gè)單詞的出現(xiàn)次數(shù)(或其他統(tǒng)計(jì)信息)作為1存入 Context 。比如,假設(shè)在 Mapper 階段遇到單詞“xiaoyu”時(shí),我們每次都會(huì)輸出一個(gè) (xiaoyu, 1) 的鍵值對(duì)。結(jié)果,如果單詞“xiaoyu”在輸入數(shù)據(jù)中出現(xiàn)多次, Context 會(huì)把這些鍵值對(duì)合并成一個(gè) Iterable 集合,像是 (xiaoyu, [1, 1]) ,表示該單詞出現(xiàn)了兩次。

在這個(gè)例子中, Reduce 階段的操作非常簡(jiǎn)單,只需要對(duì)每個(gè) Iterable 集合中的值進(jìn)行累加即可。比如,對(duì)于 xiaoyu 的輸入集合 (xiaoyu, [1, 1]) ,我們只需要將其所有的 1 值累加起來,得出最終的結(jié)果2。

Main

最后我們需要生成一個(gè)Job,代碼如下:

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 Main {
    static {
        try {
            System.load("E:\\hadoop.dll");//建議采用絕對(duì)地址,bin目錄下的hadoop.dll文件路徑
        } catch (UnsatisfiedLinkError e) {
            System.err.println("Native code library failed to load.\n" + e);
            System.exit(1);
        }
    }


    public static void main(String[] args) throws Exception{
        Configuration conf = new Configuration(); 
        Job job = Job.getInstance(conf, "wordCounter"); 
        job.setJarByClass(Main.class);
        job.setMapperClass(InputCountMapper.class);
        job.setReducerClass(WordsCounterReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        FileInputFormat.addInputPath(job, new Path("file:///E:/hadoop/test/input"));
        FileOutputFormat.setOutputPath(job, new Path("file:///E:/hadoop/test/output"));

        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

好的,這里所展示的是一種完全固定的寫法,但在實(shí)際操作過程中,需要特別注意的是,我們必須通過 Windows 環(huán)境來連接遠(yuǎn)程的 Hadoop 集群進(jìn)行相關(guān)操作。這個(gè)過程中會(huì)遇到很多潛在的問題和坑,尤其是在配置、連接、權(quán)限等方面。

接下來,我將逐一解析并解決這些常見的難題,希望能為大家提供一些實(shí)際的參考和指導(dǎo),幫助大家更順利地完成操作。

疑難解答

目錄不存在

如果你并不是以本地 Windows 目錄為主,而是以遠(yuǎn)程服務(wù)器上的目錄為主進(jìn)行操作,那么你可能會(huì)采用類似以下的寫法:

FileInputFormat.addInputPath(job, new Path("/input"));
FileOutputFormat.setOutputPath(job, new Path("/output"));

那么,在這種情況下,我們必須先創(chuàng)建與操作相關(guān)的輸入目錄(input),但需要特別注意的是,切勿提前創(chuàng)建輸出目錄(output),因?yàn)?Hadoop 在運(yùn)行作業(yè)時(shí)會(huì)自動(dòng)創(chuàng)建該目錄,如果該目錄已存在,會(huì)導(dǎo)致作業(yè)執(zhí)行失敗。因此,只需要進(jìn)入 Docker 環(huán)境并直接執(zhí)行以下命令即可順利開始操作。

hdfs dfs -mkdir /input

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

當(dāng)然,還有一種更簡(jiǎn)單的方式,就是直接通過圖形界面在頁(yè)面上創(chuàng)建相關(guān)目錄或資源。具體操作可以參考以下步驟,如圖所示:

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

Permission denied

接下來,當(dāng)你在運(yùn)行 Job 任務(wù)時(shí),系統(tǒng)會(huì)在最后一步嘗試創(chuàng)建輸出目錄(output)。然而,由于當(dāng)前用戶并沒有足夠的權(quán)限來進(jìn)行此操作,因此會(huì)出現(xiàn)類似于以下的權(quán)限錯(cuò)誤提示: Permission denied: user=yu, access=WRITE, inode="/":root:supergroup:drwxr-xr-x 。該錯(cuò)誤意味著當(dāng)前用戶(yu)試圖在根目錄下創(chuàng)建目錄或文件,但由于該目錄的權(quán)限設(shè)置為只有管理員(root)才能寫入,普通用戶無法進(jìn)行寫操作,從而導(dǎo)致作業(yè)執(zhí)行失敗。

所以你仍需要進(jìn)入docker容器,執(zhí)行以下命令:

hadoop fs -chmod 777 /

這樣基本上就可以順利完成任務(wù)了。接下來,你可以直接點(diǎn)擊進(jìn)入查看 output 目錄下的文件內(nèi)容。不過需要注意的是,由于我們沒有配置具體的 IP 地址,因此在進(jìn)行文件下載時(shí),你需要手動(dòng)將文件中的 IP 地址替換為你自己真實(shí)的 IP 地址,才能確保下載過程能夠順利進(jìn)行并成功獲取所需的文件。

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

報(bào)錯(cuò):org.apache.hadoop.io.nativeio.NativeIO$Windows

這種問題通常是由于缺少 hadoop.dll 文件導(dǎo)致的。在 Windows 系統(tǒng)上運(yùn)行 Hadoop 時(shí), hadoop.dll 或者 winutils.exe 是必需的依賴文件,因?yàn)樗鼈兲峁┝?Hadoop 在 Windows 上所需的本地代碼支持和執(zhí)行環(huán)境。

為了確保順利運(yùn)行,你需要下載對(duì)應(yīng)版本的 hadoop.dll 或者 winutils.exe 文件。已經(jīng)為你準(zhǔn)備好了多個(gè) Hadoop 版本對(duì)應(yīng)的這些文件,所有的文件都可以從以下鏈接下載: https://github.com/cdarlint/winutils

我們這里只下載一個(gè)hadoop.dll,為了不重啟電腦,直接在代碼里面寫死:

static {
  try {
      System.load("E:\\hadoop.dll");//建議采用絕對(duì)地址,bin目錄下的hadoop.dll文件路徑
  } catch (UnsatisfiedLinkError e) {
      System.err.println("Native code library failed to load.\n" + e);
      System.exit(1);
  }
}

如果仍然有問題,那就配置下windows下的wsl子系統(tǒng):

使用Windows + R快捷鍵打開「運(yùn)行」對(duì)話框,執(zhí)行OptionalFeatures打開「Windows 功能」。

勾選「適用于 Linux 的 Windows 子系統(tǒng)」和「虛擬機(jī)平臺(tái)」,然后點(diǎn)擊「確定」。

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

最終效果

終于成功跑出結(jié)果了!在這個(gè)過程中,輸出的結(jié)果是按照默認(rèn)的順序進(jìn)行排序的,當(dāng)然這個(gè)排序方式是可以根據(jù)需要進(jìn)行自定義的。如果你對(duì)如何控制排序有興趣,實(shí)際上可以深入了解并調(diào)整排序機(jī)制。

零基礎(chǔ)入門Hadoop:IntelliJ IDEA遠(yuǎn)程連接服務(wù)器中Hadoop運(yùn)行WordCount

總結(jié)

通過今天的分享,我們簡(jiǎn)單地了解了大數(shù)據(jù)處理中一個(gè)經(jīng)典的應(yīng)用——WordCounter,并通過Hadoop框架的實(shí)踐,展示了如何使用MapReduce進(jìn)行分布式計(jì)算。雖然表面上看,WordCounter是一個(gè)相對(duì)簡(jiǎn)單的程序,但它卻揭示了大數(shù)據(jù)處理中的核心思想。

從安裝配置到編寫代碼,我們一步步走過了Hadoop集群的搭建過程,希望通過這篇文章,你能對(duì)大數(shù)據(jù)應(yīng)用開發(fā),特別是Hadoop框架下的MapReduce編程,獲得一些啟發(fā)和幫助。大數(shù)據(jù)的世界龐大而復(fù)雜,但每一次小小的實(shí)踐,都會(huì)帶你離真正掌握這門技術(shù)更近一步。


我是努力的小雨,一名 Java 服務(wù)端碼農(nóng),潛心研究著 AI 技術(shù)的奧秘。我熱愛技術(shù)交流與分享,對(duì)開源社區(qū)充滿熱情。同時(shí)也是一位騰訊云創(chuàng)作之星、阿里云專家博主、華為云云享專家、掘金優(yōu)秀作者。

? 我將不吝分享我在技術(shù)道路上的個(gè)人探索與經(jīng)驗(yàn),希望能為你的學(xué)習(xí)與成長(zhǎng)帶來一些啟發(fā)與幫助。

? 歡迎關(guān)注努力的小雨!?

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

Te v1.4
Te v1.4
類型:休閑益智  運(yùn)營(yíng)狀態(tài):正式運(yùn)營(yíng)  語言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動(dòng)

TeChewingum完整版是一款模擬觸手進(jìn)攻的休閑游戲。游戲中設(shè)計(jì)了許多可愛的小女孩,玩家可以操作觸手對(duì)她
a 1.0
a 1.0
類型:休閑益智  運(yùn)營(yíng)狀態(tài):正式運(yùn)營(yíng)  語言:中文   

游戲攻略

游戲禮包

游戲視頻

游戲下載

游戲活動(dòng)

《alittletotheleft》官網(wǎng)正版是一款備受歡迎的休閑益智整理游戲。玩家的任務(wù)是對(duì)日常生活中的各種雜亂物

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]

湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)