hadoop 開發環境搭建

#hadoop 開發環境搭建 (ubuntu + idea ) @(hadoop筆記)[idea|開發環境]java

基於ubuntuidea 搭建 hadoop開發環境,實際上是搭建MR的開發環境。這裏簡單說一下爲何採用idea,就由於一點,idea比eclipse爽的太多,雖然eclipse有hadoop插件,可是能用idea解決戰鬥,我寧願犧牲一點的便利性。git


[TOC]程序員

##目的 首先,拋出該開發環境須要達到的目的和效果。github

  • 支持debug :首要目的!必須達到!不能調試的程序永遠是程序員的噩夢。
  • 單元測試 :方便微調代碼邏輯以後的迴歸測試。
  • 提交到遠程集羣 :可選,這個能夠增長便利性。

基於以上三點,展開對開發環境的搭建。shell

##hadoop本地client環境搭建 這個是爲了方便本地操做集羣,包括管理hdfs和提交做業。因爲只是提供了本地客戶端的功能,因此配置很是簡單(固然,若是遠程集羣開啓了kerberos的話,本地也要初始化相應的Keytab)apache

第一步:下載與遠程集羣版本一致的hadoo的tar包,解壓

第二步:配置環境變量

vi /etc/profileubuntu

#配置java環境
export JAVA_HOME=/opt/jdk1.7.0_79
export PATH=$PATH:$JAVA_HOME/bin

#配置hadoop環境,HADOOP_CONF_DIR用來讀取配置文件,HADOOP_HOME用來加載hadoop程序和腳本
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HADOOP_HOME=/path/to/your/hadoop #第一步裏解壓出來的那個路徑
export PATH=$PATH:$HADOOP_HOME/bin

第三步:從遠程集羣上拷貝core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml到第二步配置的HADOOP_CONF_DIR目錄下

執行hdfs dfs -ls / 命令,測試一下是否成功顯示遠程hdfs的文件目錄app

##IDEA開發環境搭建 這一部分會比較詳細,可能會有點囉嗦。。。 ###第一步:新建一個wordcount工程 新建一個maven工程wordcount,初始化建立之後以下圖目錄結構 Alt texteclipse

第二步:生成完整wordcount代碼

把hadoop MR的wordcount示例代碼拷貝到工程目錄下,源代碼傳送門,並在pom.xml添加所需依賴maven

<dependency>
	<groupId>org.apache.hadoop</groupId>
	<artifactId>hadoop-client</artifactId>
	<version>2.6.0</version>
	<!--<scope>provided</scope>-->
</dependency>

到這裏,代碼就徹底不報錯了

第三步:生成hadoop配置

拷貝遠程集羣上core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml到 src/main/resources目錄下(若是沒有就手動建立,並該目錄爲resource),這樣所須要的配置也有了。固然也能夠conf.setXXX方式把全部須要的配置都設置上,可是拷貝配置文件更省事,也跟遠程集羣配置統一。

第四步:生成測試數據

這裏若是把core-site.xml中的fs.defaultFS配置爲file:///表示使用本地文件系統,測試數據生成在本地就行了

<property>
       <name>fs.defaultFS</name>
       <!--<value>hdfs://DataCenterCluster</value>-->
       <value>file:///</value>
</property>

生成本地文件系統上的測試數據

mkdir /tmp/in
	# 生成測試數據
	echo "this is a test file , test word count" > /tmp/in/test.txt
	cat /tmp/in/test.txt

若是core-site.xml中的fs.defaultFS配置爲hdfs://DataCenterCluster(這個是ha的配置)表示使用遠程的hdfs文件系統,測試數據就用hdfs上的,也能夠在hdfs上手動生成測試數據,以下:

hdfs dfs -mkdir /tmp/in
	echo "this is a test file , test word count" | hdfs dfs -put - /tmp/in/test.txt
	hdfs dfs -cat /tmp/in/test.txt

固然對於真正MR程序,抽取一小部分真實數據做爲測試數據是最好的

第五步:配置debug和run運行環境

配置本地debug運行,配置一個叫WordCount_local的Application,配置參數/tmp/in /tmp/out就是wordcount程序須要的參數。

Alt text

修改成本地運行模式 重要!!!修改mapred-site.xml的mapreduce.framework.name爲local(本來的值爲yarn),即表示map和reduce都運行在本地的一個JVM中,方便調試。 Alt text

運行debug模式 運行debug模式,進行斷點調試測試

  • map斷點

Alt text

  • reduce斷點

Alt text

能夠看到map和reduce的斷點都能正常的進行斷點調試,並能看到如今全部變量的值。這樣就解決了文章開頭目的的第一點「支持debug」,顯然這個debug只能調試小數據量,用來調試程序的正確性。

運行run模式 運行完整的MR程序,這個其實跟debug模式結果一致,只是不進入斷點,只測試一下結果數據是否正確。至此,咱們使用了遠程集羣上的數據(第四步配置爲集羣),配置,只有map和reduce是運行在本地的JVM裏,這樣排除了yarn的調度的話已經很是接近真正集羣的運行情況了(提交到集羣其實就是把map和reduce在集羣的某臺機器的JVM裏去運行)。在這裏若是運行是預期結果的話已經能夠直接打包提交運行了,若是不關心單元測試,能夠直接跳到第七步。

第六步:單元測試(非必須)

這裏單元測試用到了mrunit,能夠很簡單的模擬測試map和reduce方法,當修改了map的邏輯以後能夠用單元測試測試修改以後的程序的正確性。 先添加mrunit的依賴到pom.xml文件中

<dependency>
      <groupId>org.apache.mrunit</groupId>
      <artifactId>mrunit</artifactId>
      <version>1.1.0</version>
      <classifier>hadoop2</classifier>
</dependency>

而後編寫測試代碼

package com.ottowu.test;

import junit.framework.TestCase;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mrunit.mapreduce.MapDriver;
import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;

import java.io.IOException;
import java.util.Arrays;


/**
 * Created by whl on 16-12-12.
 */
public class WordCountTest extends TestCase {

//單元測試map
    public void testMap() throws IOException {
        Text value = new Text("this is test");

        IntWritable one = new IntWritable(1);

        new MapDriver<Object, Text, Text, IntWritable>()
                .withMapper(new WordCount.TokenizerMapper())
                .withInput(NullWritable.get(), value) //模擬輸入
                .withOutput(new Text("this"), one) //模擬輸出,多行輸出
                .withOutput(new Text("is"), one)
                .withOutput(new Text("test"), one)
                .runTest(); //運行測試
    }
    
//單元測試reduce
    public void testReduce() throws IOException {

        IntWritable one = new IntWritable(1);
        IntWritable two = new IntWritable(2);

        new ReduceDriver<Text, IntWritable, Text, IntWritable>()
                .withReducer(new WordCount.IntSumReducer())
                .withInput(new Text("this"), Arrays.asList(new IntWritable[]{one, one}))//模擬輸入,多行
                .withInput(new Text("is"), Arrays.asList(new IntWritable[]{one}))
                .withOutput(new Text("this"), two) //模擬輸出,多行
                .withOutput(new Text("is"), one)
                .runTest(); //運行測試
    }
}

運行測試,查看測試結果 運行成功,如圖 Alt text

若是運行失敗,則會提示哪個期待結果是不正確的,如圖 Alt text

更多有趣的用法請自行查閱資料

第七步:打包運行

執行mvn clean package 獲得wordcount-1.0-SNAPSHOT.jar 運行命令 hadoop jar wordcount-1.0-SNAPSHOT.jar com.ottowu.test.WordCount /tmp/in /tmp/out 便可運行到遠程集羣上,接下來就是按照部署發佈就行了,至此一次完整的開發結束。

經過IDEA直接提交任務到遠程集羣

一個很是有趣的嘗試,能夠直接在IDEA中提交任務,不過有點小瑕疵,留待之後補充吧。

相關文章
相關標籤/搜索