Linux(Hadoop基礎(概述、linux環境下搭建、獨立操作、僞分佈式、WordCount示例))

Hadoop基礎

在這裏插入圖片描述

(一)概述

Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。用戶可以在不瞭解分佈式底層細節的情況下,開發分佈式程序。充分利用集羣進行高速運算和存儲。Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。Hadoop的框架最核心的設計就是:HDFS和MapReduce,HDFS爲海量的數據提供了存儲,MapReduce爲海量的數據提供了計算。
Hadoop的發行版除了有Apache hadoop外還有Cloudera版本(CDH),Hortonworks(HDP),DKhadoop等都提供了自己的商業版本。

(二)搭建Hadoop

1. 前提環境

  • 必須安裝Java環境:我們在linux上先卸載openjdk,下載安裝jdk1.8.rpm包;
  • 如果要使用可選的啓動和停止腳本,則必須安裝ssh且sshd必須正在運行以使用管理遠程Hadoop守護程序的Hadoop腳本。

2. 下載安裝

  • 下載地址:Hadoop官網
  • 解壓安裝:
    tar zxf hadoop-3.2.1.tar.gz
    這裏做一個軟連接便於操作 ln -s hadoop-3.2.1 hadoop,進入hadoop目錄:
    在這裏插入圖片描述
  • 配置hadoop的JAVA_HOME:
    查看本地jdk1.8的路徑:rpm -ql jdk1.8 | less,複製路徑
    在這裏插入圖片描述
    進入hadoop的 vim hadoop-env.sh編輯裏:
    在這裏插入圖片描述
  • 啓動hadoop,爲了方便查看,我們將hadoop的bin目錄路徑直接加載到 .bash_profile 配置文件中,再執行source .bash_profile 使它生效:
    在這裏插入圖片描述
    現在就可以在任何位置直接通過 hadoop 命令,查看hadoop!

(三)Hadoop的獨立操作

查找並顯示給定正則表達式的每個匹配項,輸出被寫入給定的輸出目錄。

$ mkdir input                            創建一個輸入目錄
$ cp hadoop/etc/hadoop/*.xml input       拷貝hadoop目錄下的.xml文件
$ hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'

在這裏插入圖片描述

(四)Hadoop的僞分佈式

即在一臺機器上實現集羣。

1. 編寫配置

vim /etc/hadoop/core-site.xml

<configuration> 
    <property> 
        <name>fs.defaultFS</name> 
        <value>hdfs://localhost:9000</value> 
    </property> 
</configuration>

vim /etc/hadoop/hdfs-site.xml

<configuration> 
    <property> 
        <name> dfs.replication </name> 
        <value> 1 </value> 
    </property> 
</configuration>

2. 設置無密碼SSH

ssh-keygen 生成公密鑰對
在.ssh目錄下會生成兩個文件:id_rsa 、id_rsa.pub
在這裏插入圖片描述
ssh-copy-id localhost 將公鑰拷貝至localhost實現免密登錄!

3. 啓動分佈式文件系統

  1. 在終端操作
  • 格式化文件系統:hdfs namenode -format
  • 啓動NameNode守護程序和DataNode守護程序:sbin/start-dfs.sh
  • 查看服務的端口號:netstat -antlp,默認9870爲分佈式文件系統的web接口
  • 訪問9870端口:
    在這裏插入圖片描述
  • 設置作業所需的HDFS目錄
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/chs
  • 將輸入文件複製到分佈式文件系統中
    在ssh登錄狀態下操作,hdfs dfs -put input
    在這裏插入圖片描述
    但此時權限受控:直接在web頁面進行圖形化操作是不被允許的!
    在這裏插入圖片描述
    注意:此時在機器上操作已經被連接到分佈式文件系統中,和本地沒有關係了!不會在本地生成output文件!
    例如:再次執行 $ hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
    查看網頁:
    在這裏插入圖片描述
    直接查看文件:hdfs dfs -cat output/*
    在這裏插入圖片描述
    將輸出文件從分佈式文件系統複製到本地文件系統並檢查它們:hdfs dfs -get output
    查看:
    在這裏插入圖片描述
    完成後,使用以下命令停止守護進程:sbin/stop-dfs.sh
  1. 授權後在分佈式文件系統web頁面操作
    配置文件:vim /etc/hadoop/hdfs-site.xml
<configuration> 
    <property> 
        <name> dfs.permissions </name> 
        <value>false</value> 
    </property> 
</configuration>

重啓分佈式,發現權限已經設置成功!可以在網頁上直接操作:可以直接刪除
在這裏插入圖片描述

(五)示例: WordCount v1.0

1. 解壓安裝IDEA

tar zxf ideaIU-2019.3.4.tar.gz -C /opt/
運行腳本:/opt/idea-IU-193.6911.18/bin/idea.sh
爲了防止下次無法正常打開 IDEA: 設置一下環境變量:vim ~/.bashrc 添加如下內容: export DISPLAY=:0.0 退出之後,執行,source ~/.bashrc

2. 創建maven項目

在這裏插入圖片描述
導入相關的依賴和jar包:
在這裏插入圖片描述

3. 測試代碼

import java.io.IOException;
import java.util.StringTokenizer;

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;

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 {
      StringTokenizer itr = new StringTokenizer(value.toString());
      while (itr.hasMoreTokens()) {
        word.set(itr.nextToken());
        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);
  }
}
(1)在idea項目生成output文件

在idea項目中編寫一個.txt測試文件,並指定輸出:
在這裏插入圖片描述
運行程序:生成output目錄,可以查看統計的次數:
在這裏插入圖片描述

(2)在分佈式文件系統管理生成output文件

首先上傳新建的.txt文件到分佈式文件系統:hdfs dfs -put test.txt,再在項目的resources目錄中導入hadoop的配置文件:hdfs-site.xmlcore-site.xml
在這裏插入圖片描述

下載分佈文件系統output文件到本地 hdfs dfs -get output,查看結果:
在這裏插入圖片描述

//下篇再見…謝謝
在這裏插入圖片描述

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