多くのHadoopの初心者はおそらく同じです。十分な機械リソースがないため、仮想マシンにインストールされているHadoopの擬似分布のみを作成できます。次に、Win7でEclipseまたはIntellijのアイデアを使用してコードテストを書きます。問題は、Win7でのリモートHadoopおよびBreakpoint Debuggingにマップをリモート/リモート送信/削減する方法です。
1。準備
1.1 Win7では、ディレクトリを見つけて、Hadoop-2.6.0を減圧します。この記事では、d:/yangjm/code/study/hadoop/hadoop-2.6.0(以下は$ hadoop_homeで表されています)
1.2 Win7にいくつかの環境変数を追加します
hadoop_home = d:/yangjm/code/study/hadoop/hadoop-2.6.0
hadoop_bin_path =%hadoop_home%/bin
hadoop_prefix = d:/yangjm/code/study/hadoop/hadoop-2.6.0
さらに、パス変数は最後に追加されます。 %hadoop_home%/bin
2。リモートデバッグをeclipse
1.1 Hadoop-Eclipse-Pluginプラグインをダウンロードします
Hadoop-Eclipse-Pluginは、Eclipseに特別に使用されるHadoopプラグインであり、IDE環境でHDFのディレクトリとファイルコンテンツを直接表示できます。そのソースコードはgithubでホストされており、公式ウェブサイトの住所はhttps://github.com/winghc/hadoop2x-eclipse-pluginです
興味がある場合は、ソースコードをダウンロードして自分でコンパイルできます。 Baiduは多くの記事を撮りますが、https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20を使用する場合、さまざまなコンパイルされたバージョンがここに提供されます。直接使用してください。ダウンロードしたHadoop-Eclipse-Plugin-2.6.0.jarをEclipse/Pluginsディレクトリにコピーしてから、Eclipseを再起動します。それはすべて完了です。
1.2 Windows64ビットプラットフォーム用のHadoop2.6プラグインパッケージ(hadoop.dll、winutils.exe)のダウンロード
Hadoop2.6.0ソースコードには、Hadoop-Common-Project/Hadoop-Common/SRC/Main/Winutilsの下で、Vs.NETプロジェクトがあります。このプロジェクトをコンパイルすると、このファイルと出力ファイルを入手できます。
hadoop.dllとwinutils.exeが最も便利です。 winutils.exeを$ hadoop_home/binディレクトリにコピーし、hadoop.dllを%windir%/system32ディレクトリにコピーします(主にプラグインが空のオブジェクト参照などのさまざまな不可解なエラーを報告するのを防ぐため)。
注:コンパイルしたくない場合は、コンパイルされたファイルhadoop2.6(x64)v0.2.rarを直接ダウンロードできます
1.3 Hadoop-Eclipse-Pluginプラグインの構成
Eclipseを開始、Windows-> show View-> other
ウィンドウ - >設定 - > hadoopマップ/recoce win7のhadoopのルートディレクトリを指定する(すなわち:$ hadoop_home)
次に、マップ/削減場所パネルで、赤ちゃんの象のアイコンをクリックします
場所を追加します
このインターフェイスは非常に重要です。いくつかのパラメーターを説明します:
ロケーション名は単なる名前です、それを呼ぶだけです
Map/Reduce(V2)マスターホストは、仮想マシンのHadoopマスターに対応するIPアドレスです。以下のポートは、dfs.datanode.ipc.address属性によって指定されたポートに対応しています。
DFSマスターポート:ここのポートは、core-site.xmlのfs.defaultfsで指定されたポートに対応しています。
最後のユーザー名は、仮想マシンでHadoopを実行するユーザー名と同じでなければなりません。 Hadoop 2.6.0をHadoopでインストールして実行したので、Hadoopをここに記入してください。ルートでインストールした場合は、それに応じてルートに変更します。
これらのパラメーターが指定されたら、[完了とEclipse]をクリックして、Hadoopに接続する方法を知ります。すべてがうまくいけば、Project ExplorerパネルのHDFのディレクトリとファイルを見ることができます。
ファイルを右クリックして、削除を選択して試してみることができます。通常、初めては失敗し、多くのことがあります。一般的な考え方は、許可が不十分であるということです。その理由は、現在のWin7ログインユーザーが仮想マシンのHadoopの実行中のユーザーではないためです。多くの解決策があります。たとえば、Win7で新しいHadoop管理者ユーザーを作成し、Hadoopに切り替えてWin7にログインし、Eclipseを使用して開発できます。しかし、これはあまりにも迷惑で、最も簡単な方法です。
hdfs-site.xmlに追加されました
<property> <name> dfs.permissions </name> <valut> false </value> </property>
次に、仮想マシンで、hadoop dfsadmin -safemode leaveを実行します
安全になるために、別のhadoop fs -chmod 777 /
要するに、Hadoopのセキュリティ検出を完全にオフにすること(学習段階でこれらを必要としない、公式に作成されたときにこれを行わないでください)、最終的にHadoopを再起動してから、Eclipseに移動し、削除ファイル操作を今すぐ繰り返します。
1.4 WoldCountサンプルプロジェクトの作成
新しいプロジェクトを作成し、Map/Reduceプロジェクトを選択します
次にwodcount.javaに置くだけで、コードは次のとおりです。
yjmyzzをパッケージ; 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.iapach. org.apache.hadoop.mapreduce.mapper; Import org.apache.hadoop.mapreduce.ducer; Import org.apache.hadoop.mapreduce.lib.input.fileinputformat; Import org.apache.hadoop.mapreduce.lib.outtupt.fileoutputpontat; org.apache.hadoop.util.genericoptionsparser; public class wordcount {public static class tokenizermapperはmapper <オブジェクト、テキスト、テキスト、intwritable> {private final static intwritable = new intwritable(1);プライベートテキストword = new Text(); public void Map(オブジェクトキー、テキスト値、コンテキストコンテキスト)IoException、arturtedexception {stringtokenizer itr = new StringTokenizer(value.toString()); while(itr.hasmoretokens()){word.set(itr.nexttoken()); context.write(word、one); }}}} public static class intsumreducerはreducer <text、intwritable、text、intwritable> {private intwritable result = new intwritable(); public void reduce(テキストキー、iterable <intwrita>値、コンテキストコンテキスト)がioexception、arturtedexception {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).getRemaingargs(); if(otherargs.length <2){system.err.println( "usage:wordcount <in> [<in>] <out>"); System.Exit(2); } job job = job.getInstance(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); for(int i = 0; i <otherargs.length -1; ++ i){fileinputformat.addinputpath(job、new Path(otherArgs [i])); } fileoutputformat.setOutputPath(job、new Path(otherArgs [otherargs.length -1])); system.exit(job.waitforcompletion(true)?0:1); }}次に、log4j.propertiesを置きます。コンテンツは次のとおりです。(実行の便利さのために、さまざまな出力を確認してください)
log4j.rootlogger = info、 stdout#log4j.logger.org.springframework = info#log4j.logger.org.apache.activemq = info#log4j.logger.org.apache。 Activemq.spring = warn#log4j.logger.org.apache.activemq.store.journal = info#log4j.logger.org.apache.activemq.or g.activeio.journal = infolog4j.appender.stdout = org.apache.log4j.consoleappenderlog4j.appender.stdout.layout = org.apache.log4j.patternlayoutlog4j.appender.stdout.layout.conversionionionionionionionionionionionion %-5.5p | %-16.16T | %-32.32C {1} | %-32.32C%4L | %m%n最終的なディレクトリ構造は次のとおりです。
その後、WordCountにパラメーターが入力されていないため、もちろん成功しません。次の図を参照してください。
1.5操作パラメーターを設定します
WordCountはファイルを入力して単語をカウントしてから別のフォルダーに出力するため、2つのパラメーターを指定し、上記の図を参照して、プログラムの引数に入力することです。
hdfs://172.28.20.xxx:9000/jimmy/input/readme.txt
hdfs://172.28.20.xxx:9000/jimmy/output/
これを参照して変更してください(主に仮想マシンのIPをIPに置き換えてください)。入力/readm.txtファイルにそれがない場合は、最初に手動でアップロードしてから、//出力/存在してはいけません。それ以外の場合、プログラムが最後まで実行され、ターゲットディレクトリが存在することがわかった場合、エラーが報告されます。この後、適切な位置にブレークポイントを設定でき、最終的にデバッグできます。
3。Intellij IdeaリモートデバッグHadoop
3.1 Maven WordCountプロジェクトを作成します
POMファイルは次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <project xmlns = "http://maven.apache.org/pom/4.0.0" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance <http://www.w3.org/2001 xsi:schemalocation = "http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.0.sdsd"> <modelversion> 4.0.0 </modelversion> <グループ> Yjmyzz </groupid> <Artifactid> MapReduce-HelloWorld </artifactid> <version> 1.0-snapshot </version> <dependencies> <dependency> <ependency> groupid> org.apache.hadoop </groupid> <artifactid> hadoop-common </artifactid> <バージョン> 2.6.0 </バージョン<artifactid> hadoop-mapreduce-client-jobclient </artifactid> <version> 2.6.0 </version> </dependency> <dependency> <groupid> <artifactid> commons-cli </artifactid> <バージョン> 1.2 </バージョン> <FinalName> $ {project.artifactid} </finalName> </build> </project>プロジェクト構造は次のとおりです。
プロジェクトを右クリック - >モジュール設定を開くか、F12を押してモジュールプロパティを開きます
依存関係のLIBARY参照の追加
次に、対応するすべてのパッケージを$ hadoop_homeでインポートします
Hadoop2.6など、輸入されたLibaryに名前を付けることができます
3.2操作パラメーターを設定します
2つの場所に注意してください:
1はプログラムレジームであり、Eclipesに似ており、入力ファイルと出力フォルダーを指定します
2はワーキングディレクトリ、つまり、$ hadoop_homeがあるディレクトリとして指定されている作業ディレクトリです。
その後、デバッグできます
Intellijの下で不幸なのは、Eclipseと同様のHadoopプラグインがないことです。 WordCountを実行するたびに、コマンドラインの出力ディレクトリを手動で削除してからデバッグすることができます。この問題を解決するには、WordCountコードを改善し、実行する前に出力ディレクトリを削除できます。次のコードを参照してください。
パッケージyjmyzz; import java.io.ioexception; import java.util.stringtokenizer; import org.apache.hadoop.conf.configuration; Import org.apache.hadoop.fs.filesext; Import org.apache.hadoop.fs.fs.fs.fs.path; import org.apach.impach.iont.io.init.iont.io.init.iont.io.init.iont.io.init.iontwrite org.apache.hadoop.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.ducer; import org.apache.hadup.mapreduce.lib.input.fileinputformat; inmorg.apach.hadoop.hadoop.mapreduct.liduce.linput.liduce org.apache.hadoop.util.genericoptionsparser; public class wordcount {public static class tokenizermapperはmapper <オブジェクト、テキスト、テキスト、intwritable> {private final static intwritable = new intwritable(1);プライベートテキストword = new Text(); public void Map(オブジェクトキー、テキスト値、コンテキストコンテキスト)IoException、arturtedexception {stringtokenizer itr = new StringTokenizer(value.toString()); while(itr.hasmoretokens()){word.set(itr.nexttoken()); context.write(word、one); }}}} public static class intsumreducerはreducer <text、intwritable、text、intwritable> {private intwritable result = new intwritable(); public void reduce(テキストキー、iterable <intwrita>値、コンテキストコンテキスト)がioexception、arturtedexception {int sum = 0; for(intwritable val:values){sum += val.get(); } result.set(sum); context.write(key、result); }} / ** *指定されたディレクトリを削除 * * @param conf * @param dirpath * @throws ioexception * / private static void deletedir(configuration conf、string dirpath)throws ioexception {filesystem.get(conf);パスターゲットパス= new Path(dirpath); if(fs.exists(targetpath)){boolean delresult = fs.delete(targetpath、true); if(delresult){system.out.println(targetpath + "が削除されました。"); } else {system.out.println(targetpath + "削除が失敗しました。"); }}} public static void main(string [] args)throws exception {configuration conf = new Configuration(); string [] otherargs = new genericoptionsparser(conf、args).getRemaingargs(); if(otherargs.length <2){system.err.println( "usage:wordcount <in> [<in>] <out>"); System.Exit(2); } //出力ディレクトリを削除するfirst deletedir(conf、otherargs [otherargs.length -1]);ジョブジョブ= job.getInstance(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); for(int i = 0; i <otherargs.length -1; ++ i){fileinputformat.addinputpath(job、new Path(otherArgs [i])); } fileoutputformat.setOutputPath(job、new Path(otherArgs [otherargs.length -1])); system.exit(job.waitforcompletion(true)?0:1); }}しかし、これで十分ではありません。 IDE環境で実行する場合、IDEはどのHDFSインスタンスに接続するかを知る必要があります(DB開発のようなもので、構成XMLでDataSourceを指定する必要があります)。
内容は次のとおりです。
<?xml version = "1.0" encoding = "utf-8"?> <?xml-stylesheet type = "text/xsl" href = "configuration.xsl"?> <configuration> <property> <name>
上記のIPを仮想マシンのIPに置き換えるだけです。