#hadoop 開發環境搭建 (ubuntu + idea ) @(hadoop筆記)[idea|開發環境]java
基於ubuntu 和 idea 搭建 hadoop開發環境,實際上是搭建MR的開發環境。這裏簡單說一下爲何採用idea,就由於一點,idea比eclipse爽的太多,雖然eclipse有hadoop插件,可是能用idea解決戰鬥,我寧願犧牲一點的便利性。git
[TOC]程序員
##目的 首先,拋出該開發環境須要達到的目的和效果。github
基於以上三點,展開對開發環境的搭建。shell
##hadoop本地client環境搭建 這個是爲了方便本地操做集羣,包括管理hdfs和提交做業。因爲只是提供了本地客戶端的功能,因此配置很是簡單(固然,若是遠程集羣開啓了kerberos的話,本地也要初始化相應的Keytab)apache
vi /etc/profile
ubuntu
#配置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,初始化建立之後以下圖目錄結構 eclipse
把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>
到這裏,代碼就徹底不報錯了
拷貝遠程集羣上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運行,配置一個叫WordCount_local的Application,配置參數/tmp/in /tmp/out就是wordcount程序須要的參數。
修改成本地運行模式 重要!!!修改mapred-site.xml的mapreduce.framework.name爲local(本來的值爲yarn),即表示map和reduce都運行在本地的一個JVM中,方便調試。
運行debug模式 運行debug模式,進行斷點調試測試
能夠看到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(); //運行測試 } }
運行測試,查看測試結果 運行成功,如圖
若是運行失敗,則會提示哪個期待結果是不正確的,如圖
更多有趣的用法請自行查閱資料
執行mvn clean package
獲得wordcount-1.0-SNAPSHOT.jar
運行命令 hadoop jar wordcount-1.0-SNAPSHOT.jar com.ottowu.test.WordCount /tmp/in /tmp/out
便可運行到遠程集羣上,接下來就是按照部署發佈就行了,至此一次完整的開發結束。
一個很是有趣的嘗試,能夠直接在IDEA中提交任務,不過有點小瑕疵,留待之後補充吧。