hadoop環境搭建總結

krco8100 8年前發布 | 19K 次閱讀 分布式/云計算/大數據

來自: http://my.oschina.net/carlcheer/blog/617286


最近一段時間在看Hadoop The Definitive Guide, 3rd Edition.pdf,學習hadoop,個人想不能總看書,不實踐呀,于是準備搭建一套開發環境,果然遇到很多問題,最終調試出了運行結果,在此記錄。

我實踐的過程比較坎坷,分別嘗試了centos,Ubuntu,windows下的Eclipse的hadoop插件,都加載成功,但是windows下的示例沒有運行成功。下面詳細說明

參考Hadoop The Definitive Guide, 3rd Edition.pdf附錄A,先下載hadoop:http://hadoop.apache.org/common/releases.html,我下載的版本是2.6.4。解壓后放到/usr/local/下,我個人安裝的程序都在這個目錄下。但是java和Eclipse都是系統自帶的或者yum安裝,都不在這個目錄下。

設置JAVA_HOME,java是系統自帶的,java的安裝你可以去網上搜一下,或者按照下面的方法,也可以找到

zhang@oradt:/etc/alternatives$ java -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
zhang@oradt:/etc/alternatives$ which java
/usr/bin/java
zhang@oradt:/etc/alternatives$ ll /usr/bin/java
lrwxrwxrwx 1 root root 22 二月 16 16:42 /usr/bin/java -> /etc/alternatives/java*
zhang@oradt:/etc/alternatives$ ll /etc/alternatives/java
lrwxrwxrwx 1 root root 46 二月 16 16:42 /etc/alternatives/java -> /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java*
zhang@oradt:/etc/alternatives$

修改~/.bashrc,設置環境變量,添加到最后即可,添加完成后,source一下生效

export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64"
export HADOOP_INSTALL="/usr/local/hadoop-2.6.4"
export PATH=$PATH:$HADOOP_INSTALL/bin:$HADOOP_INSTALL/sbin

接下來你應該可以運行hadoop了,先查一下版本,接下來按照附錄上的配置文件修改配置,調試過程中,我作了一些修改,配置如下:

core-site.xml,下面的9000端口在配置Eclipse的時候有用到。

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

hdfs-site.xml

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

</configuration>

mapred-site.xml

<configuration>
        <property>
                <name>mapred.job.tracker</name>
                <value>localhost:8021</value>
        </property>

</configuration>

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.resourcemanager.address</name>
                <value>localhost:8032</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce.shuffle</value>
        </property>

</configuration>

按照資料上講的,ssh localhost的時候不能輸入密碼,所以要使用密鑰登錄,使用下面兩條命令;

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

下面是一系列的hadoop命令,格式化節點,啟動,關閉守護進程等等,我直接使用的yarn,未找到mapred.sh,據說這個腳本用到客戶端了,我認識還比較淺,不清楚如何啟動這個本地的。

hadoop namenode -format

start-dfs.sh
start-yarn.sh

stop-dfs.sh
stop-yarn.sh

到此,你可以查看一下監聽的各個端口,也可以訪問網址localhost:50070和localhost:8088,查看運行狀態。


上面這個步驟在centos和Ubuntu下一次性配置都是成功的,比較簡單,但是還沒有用到任何map,reduce實際運行的內容,下一步配置Eclipse開發環境才是重點。

我的Eclipse也是系統自帶的,先找一下Eclipse的安裝目錄,如果通過yum和apt-get安裝的,一般在/usr/lib(64)下,實在找不到可以使用find / -name plugins|grep eclipse查找。接下來就是把hadoop的Eclipse插件放到plugins目錄下。

網上應該能下到不少hadoop的eclipse插件版本,我認為最權威的應該還是git托管的那個,地址是:https://github.com/winghc/hadoop2x-eclipse-plugin,這里邊不僅有源碼,還有幾個編譯好的jar包可以使用,但是最高版本是2.6.0,開始的時候我使用這個2.6.0版本的jar包,放入plugins文件夾,Eclipse不識別,我以為是jar包不能兼容,或者編譯的版本不對,我嘗試了各種方法重新編譯這個jar包,但是都以失敗告終,無論實在centos,Ubuntu,還是windows,原因貌似是Eclipse少什么包,出大量的編譯錯誤,因此,我嘗試重新安裝Eclipse。到最后,我也沒編譯通過這個插件。

安裝Eclipse的方法我也嘗試了幾種,最后成功的是apt-get,將hadoop-eclipse-plugin-2.6.0.jar放到plugins目錄,在命令行下使用eclipse命令啟動后,竟然出現了DFS Locations,說明插件加載成功呀。

接下來按照網上的步驟, 配置hadoop,Window->Preference

Window->Show View -> Others -> MapReduce Tools ->Map/Reduce Locations

添加Locations

第一個端口使用的默認的50020,第二個是前面配置的9000,這個地方我使用的IP地址,見前面的配置,前面的fs.defaultFS配置為localhost的話,在windows系統下連接192.168.80.202是不成功的。

如果正常的話,這個地方展開是沒有錯誤的。文件目錄結構是使用命令新建的,hdfs dfs -mkdir -p input,這個命令會在/user/你的用戶名/ 目錄下新建一個input目錄,hadoop fs -put intput1.txt input,這個命令是上傳文件到input目錄下。

到此環境算是搭建好了。


下面是新建項目了:

File->New->Others...->

添加map和reduce類

Mapper類注意父類的最后一個參數是IntWriteable類型

Reducer類注意第二個輸入參數和第四個輸出參數為IntWriteable類型

最后再添加一個MaxTemperature類,這3個類的詳細內容,建議還是讀讀書吧。

MaxTemperatureMapper.java

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;


public class MaxTemperatureMapper extends
        Mapper<LongWritable, Text, Text, IntWritable> {
    private static final int MISSING = 9999;
    //private static Logger logger = Logger.getLogger(MaxTemperatureMapper.class);
    public void map(LongWritable ikey, Text ivalue, Context context)
            throws IOException, InterruptedException {
        String line = ivalue.toString();
        System.err.println(line);
        String year = line.substring(15, 19);
        int airTemperature;
        if (line.charAt(87) == '+') { // parseInt doesn't like leading plus signs
            airTemperature = Integer.parseInt(line.substring(88, 92));
        } else {
            airTemperature = Integer.parseInt(line.substring(87, 92));
        }
        String quality = line.substring(92, 93);
        if (airTemperature != MISSING && quality.matches("[01459]")) {
            context.write(new Text(year), new IntWritable(airTemperature));
        }else{
            context.write(new Text(year), new IntWritable(0));
        }

    }

}

MaxTemperatureReducer.java

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;


public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    public void reduce(Text _key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        // process values
        int maxValue  = Integer.MIN_VALUE;
        for (IntWritable val : values) {
            System.err.println(val.get());
            maxValue = Math.max(maxValue, val.get());
        }
        context.write(_key, new IntWritable(maxValue));
    }

}

MaxTemperature.java

//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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class MaxTemperature {
    public static void main(String[] args) throws Exception {
        if (args.length != 2) {
            System.err.println("Usage: MaxTemperature <input path> <output path>");
            System.exit(-1);
        }
        //Configuration conf = new Configuration();
        Job job = Job.getInstance();
        job.setJarByClass(MaxTemperature.class);
        job.setJobName("Max temperature");
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        job.setMapperClass(MaxTemperatureMapper.class);
        job.setReducerClass(MaxTemperatureReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }

}

代碼完成后,先準備一個測試文件吧,文件內容我給你弄個現成的,千萬注意,最后別有空行。

0067011990999991950051507004+51317+028783FM-12+017199999V0203201N00721004501CN0100001N9+00001+01391102681
0067011990999991950051507004+51317+028783FM-12+017199999V0203201N00721004501CN0100001N9+00021+01391102681
0067011990999991952051507004+51317+028783FM-12+017199999V0203201N00721004501CN0100001N9+00011+01391102681
0067011990999991953051507004+51317+028783FM-12+017199999V0203201N00721004501CN0100001N9+00031+01391102681

運行的時候需要設置下參數Run->Run Configuration:

我開始運行的時候,一個問題是出現了關于log4j相關的警告,第二個問題是程序運行結束后,只出現了output文件夾,但是沒有出現輸出文件。整了半天,果然是不能忽略警告呀,警告解決后,會出現日志,錯誤自然就知道了呀。

解決日志的問題方法網上有很多,就是在src目錄添加一個文件log4j.properties,內容如下(不限于這一種)

# Configure logging for testing: optionally with log file
log4j.rootLogger=WARN, stdout
# log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

關鍵是你要在eclipse目錄下刷新一下,出現這個文件,否則不管用。于是我看到了日志,原因是text文件多了一個空行,導致String的截取方法出錯崩潰。

修正后,出現了正確的結果。

 本文由用戶 krco8100 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!