Eclipse鏈接Hadoop分析的三種方式

Hadoop通常都部署在linux平臺上,想讓Hadoop執行咱們寫好的程序,首先須要在本地寫好程序打包,而後上傳到liunx,最後經過指定命令執行打包好的程序;一次兩次還能夠,若是進行頻繁的調試是很不方便的,全部最好是能直接經過IDE直接鏈接Hadoop;下面總結了三種方式鏈接Hadoop執行分析:php

1.利用Hadoop的本地模式,在Eclipse中執行本地數據計算
2.Eclipse鏈接遠程Hadoop,利用Hadoop的本地模式,在Eclipse中分析hdfs中的數據
3.Eclipse鏈接遠程Hadoop,提交本地程序到遠程的Hadoop分析hdfs中的數據

軟件版本java

操做系統:win7 64位
Eclipse:Indigo Service Release 2
Java:1.7
Hadoop:2.5.1
Linux:Centos7node

1、利用Hadoop的本地模式,在Eclipse中執行本地數據計算linux

寫好的程序在本地測試完以前再提交到遠程服務器上進行數據分析仍是頗有必要的,這就須要利用Hadoop提供的本地模式了
1.解壓hadoop-2.5.1.tar.gz到本地,如:D:\software\hadoop-2.5.1git

2.配置環境變量 HADOOP_PATH=D:\software\hadoop-2.5.1github

3.下載windows64位平臺的hadoop2.6插件包(hadoop.dll,winutils.exe)
在hadoop2.5.1源碼的hadoop-common-project\hadoop-common\src\main\winutils下,有一個vs.net工程,編譯這個工程能夠獲得這一堆文件,輸出的文件中有hadoop.dll和winutils.exe
或者直接下載編譯好的:http://pan.baidu.com/s/1nuP6CGT
將winutils.exe複製到%HADOOP_PATH%/bin目錄下,將hadoop.dll複製到C:\Windows\System32目錄下apache

4.新建maven項目
pomx.xml文件:windows

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <version>1.7</version>
        <scope>system</scope>
        <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
    </dependency>
</dependencies>

右擊->Maven->Update Project…bash

5.爲了顯示消息的輸出日誌,提供log4j.properties文件在classpath路徑下服務器

6.添加測試類,直接將%HADOOP_HOME%\share\hadoop\mapreduce\sources\hadoop-mapreduce-examples-2.5.1-sources.jar 中的WordCount.java拷貝到項目中
代碼總體結構:

7.Run As->Run Configurations…指定輸入和輸出

這裏的wordcount.txt隨便寫幾個單詞在裏面就好了

8.執行程序
D:\wordcount_out中生成了分析結果

打開part-r-00000

hello   3
world   3

 

2、Eclipse鏈接遠程Hadoop,利用Hadoop的本地模式,在Eclipse中分析hdfs中的數據
1.保證遠程Hadoop啓動正常
參考:Hadoop的僞分佈式模式

如下兩種方式須要遠程鏈接Hadoop,須要用到Hadoop的Eclipse插件
2.下載hadoop-eclipse-plugin插件
hadoop-eclipse-plugin是一個專門用於eclipse的hadoop插件,能夠直接在IDE環境中查看hdfs的目錄和文件內容
源碼: https://github.com/winghc/hadoop2x-eclipse-plugin
或者直接下載:http://pan.baidu.com/s/1bI149g
將hadoop-eclipse-plugin-2.5.1.jar下載複製到eclipse/plugins目錄下,而後重啓eclipse

3.配置hadoop-eclipse-plugin插件
window->preferences->Hadoop Map/Reduce 指定win7上的hadoop根目錄
windows->show view->other

打開Map/Reduce Locations

添加一個Location

Location name:隨便起個名字
Map/Reduce(V2) Master Host:這裏就是遠程裏hadoop master對應的IP地址,端口對應 hdfs-site.xml裏dfs.datanode.ipc.address屬性所指定的端口
DFS Master Port: 對應core-site.xml裏fs.defaultFS所指定的端口
User name:運行遠程hadoop的用戶名,好比root

4.一切順利的話,在Project Explorer面板中,就能看到hdfs裏的目錄和文件了

問題一:若是不能看到hdfs中的文件,先本地嘗試telnet 192.168.111.129 9000,若是沒法鏈接嘗試修改配置core-site.xml(服務器端)

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

問題二:在Eclipse中刪除hdfs中的文件,會出現權限不足的問題

hdfs-site.xml(服務器端)裏設置dfs.permissions.enabled:

<property>
      <name>dfs.permissions.enabled</name>
      <value>false</value>
</property>

若是仍是不行能夠直接服務器端作以下設置,爲了更加方便的測試(正式環境下確定是不容許的)

hadoop dfsadmin -safemode leave
hadoop fs -chmod 777 /

5.建立Map/Reduce Project

建立完直接將%HADOOP_HOME%\share\hadoop\mapreduce\sources\hadoop-mapreduce-examples-2.5.1-sources.jar 中的WordCount.java拷貝到項目中;
一樣添加log4j.properties文件,方便查錯

6.Run As->Run Configurations…指定輸入和輸出

7.執行程序

打開part-r-00000

hadoop  1
hello   3
java    1
world   1

問題三:user=Administrator沒有權限

Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=EXECUTE, inode="/tmp":hadoop:supergroup:drwx------
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:234)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:187)
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:150)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5433)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkPermission(FSNamesystem.java:5415)

由於本地電腦的用戶是Administrator,而hdfs須要相關的用戶才能操做,好比root,有兩種方式來修改:

1.能夠把計算機名改成root用戶的用戶名
2.hadoop fs -chown -R Administrator:Administrator  /tmp

 

3、Eclipse鏈接遠程Hadoop,提交本地程序到遠程的Hadoop分析hdfs中的數據
這種方式配置基本和第二種方式一致,只不過咱們須要在classpath路徑下添加一個hadoop-remote.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>192.168.111.129</value>
    </property>
    <property>
        <name>mapreduce.app-submission.cross-platform</name>
        <value>true</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>192.168.111.129:10020</value>
    </property>
</configuration>

同時在代碼裏面設置Configuration

conf.addResource("hadoop-remote.xml");

注一:配置的mapreduce.jobhistory.address須要在服務器端啓動historyserver

mr-jobhistory-daemon.sh start historyserver
mr-jobhistory-daemon.sh stop historyserver

注二:mapreduce.app-submission.cross-platform,map reduce默認沒有開啓跨平臺(win到linux)任務提交致使的,不設置爲true會出現以下錯誤

ExitCodeException exitCode=1: /bin/bash: line 0: fg: no job control

    at org.apache.hadoop.util.Shell.runCommand(Shell.java:538)
    at org.apache.hadoop.util.Shell.run(Shell.java:455)
    at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702)
    at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:300)
    at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

注三:yarn.resourcemanager.hostname,若是不設置具體的ip地址,會出現以下問題:

Retrying connect to server: 0.0.0.0/0.0.0.0:8032. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1000 MILLISECONDS)

這樣就能夠將本地的MapReduce程序發送到遠程Hadoop上進行執行,經測試得到同第二種方式相同的結果

總結

以上總結的三種方式通常都須要使用,而且有必定的順序性:

1.先用測試數據在本地Hadoop上執行,若是沒有問題,進入第二步

2.使用正式數據的副本在本地執行,若是沒有問題,進入第三步

3.提交程序到遠程Hadoop上執行

相關文章
相關標籤/搜索