自己研究大數據一年多了,雖然技術上有很多提高,但是有個問題就是一直沒法使用本地聯調集羣,每次都是寫完打包放到集羣執行。最近發現可以本地直接連接遠程聯調,大大提高了開發效率,分享一下。
1、下載hadoop,配置到本地環境變量中,路徑中最好不要有空格或下劃線
環境變量:
2、修改項目的pom.xml
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-jobclient</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
3、把集羣中core-site.xml和hdfs-site.xml兩個文件拿下來,放到項目中resources目錄下
4、設置Intellij idea中運行變量:
這裏的working directory設置爲hadoop的安裝地址。至於上面的Program arguments,這是設置運行時傳遞的參數,可以傳值,直接編寫到程序中也可以。
這個地方遇到了坑,網上都是設置的單機IP地址加端口,比如hdfs://192.168.xx.xx:9000/...
這種樣式的,我也一直測試但都是報不能連接9000端口。還一直以爲自己哪裏配錯了。但是後來想明白了,既然是連接操作hdfs,那應該是8020端口,換了之後果然連通了。**如果這裏用的是IP地址加端口,那resources中core-site.xml中也要使用同樣的。**我這裏使用的是集羣名稱的方式,resources中core-site.xml中也要使用同樣的方式。如果兩個不一樣,會報錯誤。不建議使用IP的方式,假如配置使用的IP在啓動的時候是standby角色的namenode,執行的時候會報不能寫的錯誤,所以最好是使用hdfs://集羣服務名
這種方式。
5、這個時候執行會報錯:Unable to load native-hadoop library for your platform… using builtin-Java classes where applicable
,需要下載hadoop.dll,然後替換掉本地hadoop中bin目錄下的文件。至於winutils.exe,我是沒有替換也能正常執行,可換可不換。
下載地址:
6、執行繼續報錯
org.apache.hadoop.security.AccessControlException: Permission denied: user=ZhOu, access=WRITE, inode="/app":root:supergroup:drwxr-xr-x
,很明顯是用戶權限問題,網上找了一下,有很多解決方案,有興趣的可以研究研究。這裏提供一個簡單的方案,就是不校驗權限:修改hdfs-site.xml,本地和集羣都要修改,然後集羣還要重啓namenode。
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
7、做到這裏,就可以正常執行了。不需要每次打包放到線上執行了。Spark項目也是一樣的做法,只是把working directory設置爲spark的安裝路徑即可。