日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

hadoop实战--搭建开发环境及编写Hello World

發(fā)布時(shí)間:2025/3/21 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hadoop实战--搭建开发环境及编写Hello World 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、下載

整個(gè)Hadoop是基于Java開(kāi)發(fā)的,所以要開(kāi)發(fā)Hadoop相應(yīng)的程序就得用java方便

進(jìn)入網(wǎng)站:http://archive.eclipse.org/eclipse/downloads/

選擇3.71 eclipse SDK?進(jìn)入下面的頁(yè)面:

http://archive.eclipse.org/eclipse/downloads/drops/R-3.7.1-201109091335/#EclipseSDK

選擇相關(guān)的版本下載JDK,我選擇的版本是:eclipse-SDK-3.7.1-linux-gtk

PS:查看linux系統(tǒng)是32位的還是64位的,可以使用下面的命令:

#uname -a

由于我的系統(tǒng)是32位的,所有選擇相應(yīng)的linux版本

2、解壓縮

下載下來(lái)一般是tar.gz文件,運(yùn)行:

$tar -zxvf eclipse-SDK-3.7.1-linux-gtk.tar.gz -C ~/opt

這里opt是需要解壓的目錄,我習(xí)慣將一些軟件放在opt文件夾中

解完后,在opt文件夾下,就可以看到eclipse文件夾。

運(yùn)行:$~/opt/eclipse/eclipse

3、下載hadoop在eclise中的插件并配置

直接進(jìn)入:http://www.java2s.com/Code/Jar/h/Downloadhadoop0202eclipsepluginjar.htm

注意:下載下來(lái)的是:hadoop-0.20.2-eclipse-plugin.jar.zip,先解壓縮成?hadoop-0.20.2-eclipse-plugin.jar

當(dāng)然,更加簡(jiǎn)單的方法是:hadoop-0.20.2/contrib/eclipse-plugin/文件夾中有個(gè)hadoop-0.20.2-eclipse-plugin.jar

將jar包放在eclipse安裝目錄下的plugins文件夾下。然后啟動(dòng)eclipse

進(jìn)入后,在菜單window->Rreferences下打開(kāi)設(shè)置:

點(diǎn)擊“Ant” 出現(xiàn):

點(diǎn)擊browse選擇hadoop的源碼下的build目錄,然后點(diǎn)OK

打開(kāi)Window->Show View->Other 選擇Map/Reduce Tools,單擊Map/Reduce Locations,會(huì)打開(kāi)一個(gè)View:

添加Hadoop Loacation,其中Host和Port的內(nèi)容這里的host和port對(duì)應(yīng)mapred-site.xml中mapred.job.tracker的值,UserName 是用戶名,我配置的是localhost和9001

但是出現(xiàn)如下問(wèn)題,eclipse的左側(cè)看不到project explorer,更看不到其中的dfs

解決辦法:

應(yīng)該在菜單欄

選擇:Window->Open pespective-><Map/Reduce>。然后就能看到HDFS文件系統(tǒng)已經(jīng)所創(chuàng)建得一些項(xiàng)目。

添加Hadoop Loacation,其中Host和Port的內(nèi)容跟據(jù)conf/hadoop-site.xml的配置填寫(xiě),UserName 是用戶名,如下圖

成功添加Hadoop Loacation后還可能出現(xiàn)如下錯(cuò)誤:

解決辦法:

這時(shí)候,需要對(duì)namenode進(jìn)行格式化:bin/hadoop namenode -format ?

執(zhí)行命令:bin/start-all.sh

如果test下面的文件夾顯示(1)而不是(2)也是正常的,如果要顯示(2),運(yùn)行《安裝并運(yùn)行hadoop》一文中最后的那幾個(gè)命令。

在配置完后,在Project Explorer中就可以瀏覽到DFS中的文件,一級(jí)級(jí)展開(kāi),可以看到之前我們上傳的in文件夾,以及當(dāng)是存放的2個(gè)txt文件,同時(shí)看到一個(gè)在計(jì)算完后的out文件夾。

現(xiàn)在我們要準(zhǔn)備自己寫(xiě)個(gè)Hadoop 程序了,所以我們要把這個(gè)out文件夾刪除,有兩種方式,一是可以在這樹(shù)上,執(zhí)行右健刪除。 二是可以用命令行:

$ bin/hadoop fs -rmr out

用$bin/hadoop fs -ls 查看

4、編寫(xiě)HelloWorld

環(huán)境搭建好了,之前運(yùn)行Hadoop時(shí),直接用了examples中的示例程序跑了下,現(xiàn)在可以自己來(lái)寫(xiě)這個(gè)HelloWorld了。在eclipse菜單下 new Project 可以看到,里面增加了Map/Reduce選項(xiàng):

選中,點(diǎn)下一步:

輸入項(xiàng)目名稱后,繼續(xù)(next), 再點(diǎn)Finish

然后在Project Explorer中就可以看到該項(xiàng)目了,展開(kāi),src發(fā)現(xiàn)里面啥也沒(méi)有,于是右健菜單,新建類(new->new class):

然后點(diǎn)擊Finish,就可以看到創(chuàng)建了一個(gè)java類了:

然后在這個(gè)類中填入下面代碼:

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}}}public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length != 2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);}Job job = new Job(conf, "word count");job.setJarByClass(wordCount.class);job.setMapperClass(TokenizerMapper.class);job.setCombinerClass(IntSumReducer.class);job.setReducerClass(IntSumReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path(otherArgs[0]));FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));System.exit(job.waitForCompletion(true) ? 0 : 1);}

填入代碼后,會(huì)看到一些錯(cuò)誤,沒(méi)關(guān)系,點(diǎn)擊邊上的紅叉,然后選擇里面的import即可:

import java.io.IOException; import java.util.StringTokenizer; 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.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser;

這里,如果直接用源碼來(lái)操作,可能會(huì)GenericOptionsParser這個(gè)類找不到定義,還是紅叉,添加commons-cli-1.2.jar這個(gè)jar包,在build/ivy/lib/Hadoop/Common下,右健Project Explorer中的MyHelloWorld工程,選擇Build Path->Config Build Path

在Liberaries Tab頁(yè)下,點(diǎn)擊Add External JARs 在彈出窗口中,跟據(jù)前面說(shuō)的目錄,找到這個(gè)jar包,點(diǎn)確定后,回到工程,可以看到紅叉消失,說(shuō)明編譯都通過(guò)了。

在確保整個(gè)工程沒(méi)有錯(cuò)誤后,點(diǎn)擊上面的小綠箭頭,然后在彈出的小窗口上,選擇Run On Hadoop:

點(diǎn)OK后,會(huì)彈出小窗口:

然手中選擇Choose an existing server from the list below。然后找到之前配置的地址項(xiàng),選中后,點(diǎn)Finish,然后系統(tǒng)不會(huì)Run起來(lái),在控制臺(tái)(雙擊可最大化)中可以看到運(yùn)行結(jié)果:

運(yùn)行完后,可以看到多了一個(gè)out文件夾,雙擊打開(kāi)out文件可以看到單詞的統(tǒng)計(jì)結(jié)果來(lái)

可能出現(xiàn)的問(wèn)題:

問(wèn)題1:

如果點(diǎn)了Run On Hadoop沒(méi)有反應(yīng),則可能你下的這個(gè)插件有問(wèn)題,

重新到:https://issues.apache.org/jira/secure/attachment/12460491/hadoop-eclipse-plugin-0.20.3-SNAPSHOT.jar

下載,然后將下載的插件重命名為"hadoop-0.20.2-eclipse-plugin.jar",放入eclipse中的plugins目錄下。

問(wèn)題2:

運(yùn)行后,如果Console里只輸出Usage :wordcount<in> <out>,

則需要修改下參數(shù),在運(yùn)行菜單邊上小箭頭,下拉,點(diǎn)擊Run Configuration,:

左邊選中 JavaApplication中的 WordCount,右邊,在Arguments中輸入 in out。然后再點(diǎn)Run 就可以看到結(jié)果了。

左邊選中 JavaApplication中的 WordCount,右邊,在Arguments中輸入 in out。然后再點(diǎn)Run 就可以看到結(jié)果了。

問(wèn)題3:

第二次運(yùn)行會(huì)報(bào)錯(cuò),仔細(xì)看提示,可以看到報(bào)錯(cuò)的是out目錄已經(jīng)存在,所以需要手動(dòng)來(lái)刪除一下。

更進(jìn)一步

上面我們寫(xiě)了一個(gè)MapReduce的HelloWorld程序,現(xiàn)在,我們就也學(xué)一學(xué)HDFS程序的編寫(xiě)。HDFS是什么,它是一個(gè)分布式文件存儲(chǔ)系統(tǒng)。一般常用操作有哪些? 當(dāng)然我們可以從編程角度來(lái):創(chuàng)建、讀、寫(xiě)一個(gè)文件,列出文件夾中的文件及文件夾列表,刪除文件夾,刪除目錄,移動(dòng)文件或文件夾,重命名文件或文件夾。

啟動(dòng)eclipse,新建Hadoop項(xiàng)目,名稱MyHDFSTest,新建類HDFSTest,點(diǎn)擊確定,然后同樣工程屬性Configure BuildPath中把 build/ivy/lib/Hadoop下的所有jar包都引用進(jìn)來(lái)(不詳細(xì)說(shuō)明了,可參考上面的步驟)

在類中,添加main函數(shù):

public static void main(String[] args) { }

或者也可以在添加類時(shí),勾選上創(chuàng)建main,則會(huì)自動(dòng)添加上。

在mian函數(shù)中添加以下內(nèi)容:

try {Configuration conf = new Configuration();conf.set("fs.default.name", "hdfs://localhost:9000");FileSystem hdfs = FileSystem.get(conf);Path path = new Path("in/test3.txt");FSDataOutputStream outputStream = hdfs.create(path);byte[] buffer = "Hello".getBytes();outputStream.write(buffer, 0, buffer.length);outputStream.flush();outputStream.close();System.out.println("Create OK");} catch (IOException e) {e.printStackTrace(); }

直接添加進(jìn)來(lái)會(huì)報(bào)錯(cuò),然后需要添加一些引用才行:

import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path;

在沒(méi)有錯(cuò)誤后,點(diǎn)擊工具條上的運(yùn)行, 但這次跟前次不一樣,選擇Run as Java Application。然后,就可以在輸出框中看到Create OK的字樣了,表明程序運(yùn)行成功。

這段代碼的意思是在in文件夾下,創(chuàng)建test3.txt,里面的內(nèi)容是"Hello"。 在運(yùn)行完后,我們可以到eclipse的Project Explorer中查看是否有這文件以及內(nèi)容。同樣也可以用命令行查看$bin/hadoop fs -ls in。

ok,第一個(gè)操作HDFS的程序跑起來(lái)了,那其它功能只要套上相應(yīng)的處理類就可以了。為了方便查找操作,我們列舉了張表:

操作說(shuō)明

操作本地文件

操作DFS文件

主要命名空間

java.io.File

java.io.FileInputStream

java.io.FileOutputStream

org.apache.hadoop.conf.Configuration

org.apache.hadoop.fs.FileSystem

org.apache.hadoop.fs.Path

org.apache.hadoop.fs.FSDataInputStream;

org.apache.hadoop.fs.FSDataOutputStream

初使化對(duì)象

new File(路徑);

Configuration

FileSystem hdfs

創(chuàng)建文件

File.createNewFile();

FSDataOutputStream = hdfs.create(path)

FSDataOutputStream.write(

buffer, 0, buffer.length);

創(chuàng)建文件夾

File.mkdir()

hdfs.mkdirs(Path);

讀文件

new FileInputStream();

FileInputStream.read(buffer)

FSDataInputStream = hdfs.open(path);

FSDataInputStream.read(buffer);

寫(xiě)文件

FileOutputStream.write(

buffer, 0, buffer.length);

FSDataOutputStream = hdfs.append(path)

FSDataOutputStream.write(

buffer, 0, buffer.length);

刪除文件(夾)

File.delete()

FileSystem.delete(Path)

列出文件夾內(nèi)容

File.list();

FileSystem.listStatus()

重命令文件(夾)

File.renameTo(File)

FileSystem.rename(Path, Path)????????

有了這張表,以后在需要的時(shí)候就可以方便查詢了。

參考資料:

1、http://www.cnblogs.com/zjfstudio/p/3870762.html

2、http://www.cnblogs.com/xia520pi/archive/2012/05/16/2504205.html

作者:wuyudong 出處:http://www.cnblogs.com/wuyudong/

總結(jié)

以上是生活随笔為你收集整理的hadoop实战--搭建开发环境及编写Hello World的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。