目次
導入:
分散コースでは、IDE (IDEA、Eclipse) を使用して、Hadoop クラスター上でファイル操作を直接実行するプログラムを作成する必要があります。現在、IDEA を Hadoop クラスターに接続するための混合チュートリアルがあります。私は、次の内容に基づいて IDEA を Hadoop クラスターに接続するプロセスを完了しました。複数のチュートリアル。完全なプロセスを以下に示します。
記事がうまくまとまっていない、または理解できない点がある場合は、メッセージを残してください。
環境:
windows10 (IDEA 2021.1.3)
VMware 16 workstation pro (インストール用のチュートリアルを検索すると簡単です)
Linux サーバー (Hadoop-2.7.7 クラスター 1 マスター 3 スレーブ)
クラスタの構築がわかりますHadoop クラスタの構築 (超詳細)_Ruan Hahahahaha のブログ - CSDN ブログ
アイデアが Hadoop クラスタに接続する方法を確認できますアイデアがローカル仮想マシンの Hadoop クラスタに接続して wordcount を実行する - Xu Chunhui - Blog Park (cnblogs.com)
前提:
1. 仮想マシンを介して完全に分散された Hadoop クラスターの構築を完了します。start-all.sh を使用してマスター ノードで Hadoop クラスターを開始し、jps を使用して、Hadoop クラスターが正常に構築されたことを示す次の出力を取得します。 。
もちろん、Hadoop が提供する Web インターフェースからも見ることができますが、一般的にはブラウザに http://192.168.xx.101:50070 と入力してアクセスします。 (注: 実際にこのインターフェイスにジャンプできる場合もありますが、データノードが正常に実行されているかどうかを確認する必要があります。そのような状況では、 datanode 構成は失敗しますが、Hadoop クラスターは正常に起動できますが、後続のファイル操作は正常に実行できません)
「データノード」をクリックすると、上記のインターフェースが表示され、Hadoop クラスターが構成されたことが示されます。
2.IDEA開発ツールのインストール
成し遂げる:
ウィンドウ上で Hadoop を構成する
1. hadoop-2.7.7.tar.gz ファイルを Windows にダウンロードします。 Hadoop の各バージョンでは、2.7.7 を選択しました
Hadoop はクロスプラットフォームです。Linux と Windows 間の非互換性について心配する必要はありません。ただし、hadoop-2.7.7/etc/hadoop/hadoop-env.sh中JAVA_HOME を に変更する必要があります。ウィンドウ< a i=6>下のjdkのパス。
2. 空のディレクトリを選択して hadoop-2.7.7.tar.gz を解凍します。
3. hadoop-2.7.7 を環境変数に追加します。
変数名: HADOOP_HOME
変数値: E:\xx\xx\xx\hadoop-2.7.7 (最初に下の図を参照してからコピーします)
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin (最初に下の図を参照してからコピーします)
4. コマンドラインを使用して、環境変数が正しく設定されているかどうかを確認します。
ハドゥープのバージョン
5. jdk をインストールします (JDK 8 のすべてのバージョン)
それをディレクトリに抽出し、環境変数を追加します (Hadoop 構成と同様に、上に移動して確認できます)
変数名: JAVA_HOME
変数値: E:\ProgramSoftware\java\JAVAHOME\jdk1.8.0_162
変数値: %JAVA_HOME%\bin
変数値: %JAVA_HOME%\jre\bin
java -version と javac を使用して確認します (上記の bin と \jre\bin を設定する必要があることに注意してください。設定しないと、Hadoop が JAVA_HOME を見つけられないという問題が発生します)
6.winutil.exe をhadoop-2.7.7\bin\ a>、GitHub から自分の Hadoop バージョンと同じかそれ以降のバージョンを選択します) ダウンロードwintil.ext ディレクトリ。 (
7. 将winutil.exe以及hadoop-2.7.7\bin\hadoop.dll放置到C:\Windows\System32中
8. アイデアを使用して空のディレクトリを開きます
9. Maven を追加し、[Add Framwork Support] をクリックします。
メイブンを追加
追加が成功すると、main と test が表示されます
10. Maven を設定し、hadoop-2.7.7\etc\core-site.xml と リソースにコピー (log4j.properties を通じてコンソール ログの出力レベルを設定でき、オンラインでクエリできます) その他出力レベル戦略)
log4j.rootLogger=debug,stdout,R log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=mapreduce_test.log log4j.appender.R.MaxFileSize=1MB log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n log4j.logger.com.codefutures=デバッグ
11.pom.xmlの構成
初期状態
次のコンテンツを pom.xml に追加します。追加後、idea は必要なリソース ファイルの読み込みを開始します。ダウンロードが完了すると、元の 赤い pom.xml が表示されます。色(注: Hadoop のバージョンは自分のバージョンと同じである必要があります)
<プロパティ> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <hadoop.version>2.7.7</hadoop.version> </properties> <依存関係> <依存性> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <依存性> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <依存性> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> </dependency> <依存性> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>${hadoop.version}</version> </dependency> <依存性> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <バージョン>1.3.1</version> </dependency> <依存性> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> </依存関係>
テスト
上記の操作により、アイデアの Hadoop クラスターへの接続が基本的に実現されました。
1. JavaでJavaファイルを作成する
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache. hadoop.fs.Path;
import org.apache.log4j.BasicConfigurator;インポート java.io.IOException;
パブリック クラス HDfsTest {public static void main(String[] args) { //デフォルトの Log4j 環境を自動的かつ迅速に使用します。 BasicConfigurator.configure(); 試してみる {
// 独自の IP と対応するファイルのパスに変更します
String filename = "hdfs://192.168.47.131:9000/words.txt"; fs = FileSystem.get(conf); a> if (fs.exists(new Path(filename))){
Configuration conf = new Configuration();
FileSystem fs = null; 構成 conf = new Configuration();
// コンソールでファイルが存在するか存在しないかを検索します。状況に応じて、ファイルが存在する場合はファイルが開かれます。
// ファイルは存在します 不存在就会打印 ファイルは存在しません
System.out.println("ファイルは存在します");< a i=2> }else{ System.out.println("ファイルが存在しません"); } } catch (IOException e) { e.printStackTrace(); } }
}
この時、jdkの設定がされていない可能性が高いので、以下のように設定してください。
2. 設定が成功したら、プログラムを実行し、コンソールに word.txt が存在するかどうかを確認し、ディレクトリ内のすべてのファイルにファイルが存在することが表示されます。
3. 単語頻度統計プログラムを実装する
java.io.IOException をインポート; import java.util.Iterator; import java.util.StringTokenizer; import org.apache.hadoop.fs.Path; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.FileInputFormat; import org.apache.hadoop.mapred.FileOutputFormat; import org.apache.hadoop.mapred.JobClient; import org.apache.hadoop.mapred.JobConf; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.OutputCollector; import org.apache.hadoop.mapred.Reducer; import org.apache.hadoop.mapred.Reporter; import org.apache.hadoop.mapred.TextInputFormat; import org.apache.hadoop.mapred.TextOutputFormat; import org.apache.log4j.BasicConfigurator; /** * 单词统计MapReduce */ パブリック クラス WordCount { /** * マッパー类 */ public static class WordCountMapper extends MapReduceBase 実装 Mapper<Object, Text, Text, IntWritable> { private Final static IntWritable one = new IntWritable(1); private Text word = new Text(); /** * マップ方法完了作業就是读取文件 * 文書内の每荕词はキー键として使用され、値は 1 に設定されます。 * その後、この値がマップの出力、つまり入力の削減に設定されます。 */ @オーバーライド public void map(オブジェクト キー, テキスト値, OutputCollector /** * StringTokenizer:文字串分間隔解析类型 * 前に無し発行现竟然有この好用なツール类 * java.util.StringTokenizer * 1. StringTokenizer(String str) : * str を解析するための StringTokenizer オブジェクトを構築します。 * Java で認められる分間隔記号は、「空格」、「制表符('\t')」、「行行符('\n')」、「回送符('\r')」です。 * 2. StringTokenizer(String str, String delim) : * str の解析に使用する StringTokenizer オブジェクトを構築し、指定された分間隔を提供します。 * 3. StringTokenizer(String str, String delim, boolean returnDelims) : * str の StringTokenizer オブジェクトを構築し、指定された分間隔を提供し、同時に指定されたかどうかを返します。 * * Java で承認される分間隔は、「空格」、「制表符('\t')」、「行行符('\n')」、「回帰符('\r')」です。 */ StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); Output.collect(word, one); } } } /** ※reduceの入力はmapの出力となり、同じキーを持つ単語の値が統計的に蓄積されます * 統計的な単語数を取得し、最終的に単語をキーとして使用し、単語数を値として使用できます。 * 設定した出力ファイルに出力し、保存します */ public static class WordCountReducer extends MapReduceBaseimplements Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); @オーバーライド public voidreduce(Text key, Iterator int sum = 0; while (values.hasNext()) { 合計 += 値.next().get(); } result.set(sum); Output.collect(key, result); } } public static void main(String[] args) throws Exception { //log4j ログ機能をすぐに使用する BasicConfigurator.configure(); // データ入力パス ここのパスは独自の Hadoop アドレスに置き換える必要があります String input = "hdfs://192.168.139.100:9000/テスト /input/word.txt"; /** * 出力パスは HDFS のルート ディレクトリの out フォルダーに設定されます * 注: このフォルダーは存在しないでください。存在しないとエラーが発生します。 */文字列出力 = "hdfs://192.168.139.100:9000/test/output1"; JobConf conf = new JobConf(WordCount.class); // 送信者を設定する conf.setUser("マスター"); /** * Map-Reduce プロセスでは、map-reduce クラスをカスタマイズする必要があるため、 * したがって、プロジェクトを jar パッケージとしてエクスポートする必要があります * setjar およびローカル Hadoop の単語頻度統計 jar パッケージ */ conf.setJar("E:\\ProgramSoftware\\java\\hadoop2.7.7\\hadoop-2.7.7\\share\\hadoop\\mapreduce\\hadoop- mapreduce-examples-2.7.7.jar"); // ジョブ名を設定 conf.setJobName("wordcount"); /** * クロスプラットフォームでの課題の提出を宣言する */ conf.set("mapreduce.app-submission.cross-platform", "true"); // 非常に重要なステートメント conf.setJarByClass(WordCount.class); // 対応する単語列 conf.setOutputKeyClass(Text.class); //統計的に該当する単語数 int 型 conf.setOutputValueClass(IntWritable.class); // マッパー クラスを設定 conf.setMapperClass(WordCountMapper.クラス); /** * マージ関数を設定すると、マージ関数の出力が Reducer の入力として使用されます。 * パフォーマンスを向上させ、マップとリデュース間のデータ転送量を効果的に削減します。 ※ただし、マージ機能を悪用することはできません。特定のビジネスと組み合わせる必要があります。 * このアプリケーションは単語数をカウントするため、結合機能を使用しても結果には影響しません。 * ビジネス ロジックの結果は影響を及ぼします。 ※結果に影響を与える場合、マージ機能は使用できません。 * 例: 単語の平均出現数のビジネス ロジックをカウントする場合、マージ は使用できません。 * 関数。この時点で使用すると、最終結果に影響します。 */ conf.setCombinerClass(WordCountReducer.class); //reduce クラスを設定します conf.setReducerClass(WordCountReducer.class); /** * 入力形式を設定します。TextInputFormat がデフォルトの入力形式です ※ここにコードを記述する必要はありません。 * 生成されるキーのタイプは LongWritable タイプ (ファイル内の各行の先頭のオフセット値を表す) ※値の型はText型(テキスト型) です。 */ conf.setInputFormat(TextInputFormat.class); /** * 出力形式を設定します。TextOutpuTFormat がデフォルトの出力形式です * 各レコードはテキスト行として書き込まれます。そのキーと値は任意のタイプにすることができます。出力コールバックは toString() を呼び出します。 ※出力文字列はテキストに書き込まれます。デフォルトでは、キーと値はタブで区切られています。 */ conf.setOutputFormat(TextOutputFormat.class); // 入力データ ファイルのパスを設定します FileInputFormat.setInputPaths(conf, new Path(input)); // 出力データ ファイルのパスを設定します (パスは存在できません。存在しない場合は例外が発生します) FileOutputFormat.setOutputPath(conf, 新しいパス(出力)); //mapreduce を開始 JobClient.runJob(conf); System.exit(0); } }
最後に、Linux仮想マシンのMaserノードに入力できます
hdfs dfs -ls /test/output/*
結論:
この時点で、このアイデアは Hadoop クラスター構成に関連付けられており、Hadoop が提供する構成クラスのファイルシステム クラス、FSDataInputStream クラス、および FSDataOutputStream クラスを通じてさらに多くの操作を実装できます。
問題を抱えた友人はメッセージを残すことができ、私が解決できる問題にはすぐに返信します。インストール中に発生した問題の一部は最後に配置されており、誰でも閲覧して見ることができます。
質問:
1. Windows 環境に Hadoop ファイルを配置し、必要に応じて Hadoop 環境変数を追加すると、以下が表示されます。
JAVA_HOME が正しく設定されていません。C:\hadoop-3.1.2\etc\hadoop\hadoop-env.cmd を更新してください。
最初の試行では、Hadoop 圧縮ファイルを Linux から Windows にアップロードしました。上記のエラーが発生しました。情報を調べたところ、確かに hadoo-env.sh ファイル内の JAVA_HOME に Linux パスが設定されていたことがわかりました。 notepad++で修正する方法は大きく分けて2種類あります。
(1)JAVA_HOME=${JAVA_HOME}を設定します
(2)JAVA_HOME=xxxx\jdk1.8.0_162を設定します
変更後も問題が発生したため、jdk の設定に問題があるかどうかを確認しました。コマンドラインで java -version を入力すると正常に実行できましたが、javac を入力しても応答がありませんでした。最初はこの問題に注目していたので、Hadoop の設定に問題がないか再度確認しましたが、問題がある場合は、環境変数を基に設定ファイルをよく確認し、正しいことを確認してください。もう一度javacに指を向けたので、javacが起動できない原因を確認し、jdkの正しい設定方法を確認しました。
私の Windows 構成 JDK は 2 番目の項目を構成しなかったため、それを追加した後、Hadoop -version を再度実行し、成功しました。
2. ubantu サーバー IP 構成チュートリアルに従って構成した後、www.baidu.com に ping できないことがわかりました。 IP アドレスの構成は、仮想マシンの IP、ゲートウェイ、サブネット マスクと同じ原則に従う必要があります。調査の結果、チュートリアルで指定されたゲートウェイの最後の桁は 1 ですが、仮想マシンのゲートウェイの最後の桁は 2 であることがわかりました。変更後は、インターネットに正常にアクセスできます。
3. Hadoop クラスターの 5 つの主要なファイルを構成する際、ほとんどのチュートリアルでは etc/hadoop ディレクトリ内の hadoop-env.xml ファイルが変更されていないことがわかりました。元の設定 JAVA_HOME={JAVA_HOME} を使用するだけの場合、 jdk が見つかりません。ローカルの jdk パスに設定する必要があります
4. pom.xml を構成するときに、バージョンの理由で jdk.tool の依存関係が適切にコンパイルされないことがわかりました。正しい解決策は、システムパスをローカル JAVA_HOME に変更することです (非常に人気がありますが、そうではありません)案件)
5. すべてを完了しても接続できない場合は、ローカルの hdfs-site.xml および core-site.xml でエイリアス (master、s1) が使用されている可能性が高く、これをマスターの IP に置き換える必要があります。ホスト。
コアサイト.xml
hdfs-site.xml