2024/10/15

临江柔發表於2024-10-15

今天完成的是虛擬機器mapduirce完成單詞統計

好的,下面是使用Java在Hadoop上執行一個完整的WordCount MapReduce作業的詳細步驟,包括準備環境、編寫程式碼、編譯、執行和檢視輸出結果。

好的,下面是使用Java在Hadoop上執行一個完整的WordCount MapReduce作業的詳細步驟,包括準備環境、編寫程式碼、編譯、執行和檢視輸出結果。

### 步驟 1: 環境準備

1. **安裝Hadoop**:確保Hadoop已經安裝並配置好,包括環境變數設定。
2. **安裝Java**:確保Java JDK已經安裝,並設定好JAVA_HOME環境變數。
3. **配置HDFS**:啟動Hadoop叢集並確認HDFS正常執行。可以使用以下命令啟動Hadoop叢集:
   ```bash
   start-dfs.sh
   start-yarn.sh
   ```

### 步驟 2: 建立輸入檔案

1. 在HDFS上建立輸入目錄:
   ```bash
   hdfs dfs -mkdir -p /user/lty/homework/input
   ```

2. 建立一個文字檔案並上傳到HDFS(例如,建立一個名為`input.txt`的檔案):
   ```bash
   echo -e "Hello Hadoop\nHello World" > input.txt
   hdfs dfs -put input.txt /user/lty/homework/input/
   ```

### 步驟 3: 編寫WordCount程式

1. 建立一個Java檔案,命名為 `WordCount.java`,內容如下:

```java
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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class WordCount {

    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            String[] words = value.toString().split("\\s+");
            for (String w : words) {
                word.set(w);
                context.write(word, one);
            }
        }
    }

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

        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();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}
```

### 步驟 4: 編譯Java程式

1. 在命令列中,進入到存放 `WordCount.java` 檔案的目錄。
2. 使用以下命令編譯Java程式:
   ```bash
   javac -classpath `hadoop classpath` -d . WordCount.java
   jar -cvf wordcount.jar -C . .
   ```

### 步驟 5: 執行Hadoop作業

使用以下命令在Hadoop叢集上執行WordCount作業:

```bash
hadoop jar wordcount.jar WordCount /user/lty/homework/input /user/lty/homework/output
```

### 步驟 6: 檢視輸出結果

1. 檢視輸出目錄中的結果:
   ```bash
   hdfs dfs -ls /user/lty/homework/output
   ```

2. 讀取輸出檔案內容:
   ```bash
   hdfs dfs -cat /user/lty/homework/output/part-r-00000
   ```

### 步驟 7: 清理輸出(可選)

如果需要重新執行作業,可以先刪除輸出目錄:

```bash
hdfs dfs -rm -r /user/lty/homework/output
```

### 總結

以上步驟詳細描述瞭如何使用Java在Hadoop上編寫、編譯、執行一個簡單的WordCount MapReduce作業。如果在任何步驟中遇到問題,請隨時告訴我,我會幫助你解決!

但是會遇到以下問題:hdfs dfs -ls /user/lty/homework/output輸入命令後沒有任何輸出

這個時候就需要用

hdfs dfs -cat /user/hadoop/homework/output/*命令來輸出。