hadoopのwodcountコードの例


MapReduceとは何かを簡単な例で説明できます。
大きなファイルの中の単語の出現回数を統計します。ファイルが大きいからです。私たちはこの書類を小さい書類に分けて、複数の人に統計を取りに行きます。この過程は「Map」です。そして、一人一人の統計数字を統合して、これが「Reduce」です。
上記の例がMapReduceであれば、タスクjobを作成し、jobによってファイルをいくつかの独立したデータブロックに切り分けて、異なるマシンノードに分散する必要があります。その後、異なるノードに分散されたMapタスクにより、完全に並列に処理される。MapReduceはMapの出力先を収集し、結果をReduceに出力して次の処理を行います。
タスクの具体的な実行プロセスには、「JobTracker」というプロセスがあります。MapReduceの実行中のすべてのタスクを調整します。いくつかのTaskTrackerプロセスは、個々のMapタスクを実行するために使用され、いつでもタスクの実行状況をJobTrackerに報告します。TaskTrackerがタスクに失敗したと報告した場合、または長期間にわたって自分のタスクについて報告しなかった場合、JobTrackerは別のTaskTrackerを起動して単独のMapタスクを再実行します。
以下の具体的なコードの実現:
1.word countに関するjobを作成する
(1)eclipseでmaven関連プロジェクトを作成し、jarパッケージに依存しています。(hadoopソースパッケージのhadoop-mapredeuce-examplesプロジェクトのpom配置も参照してください。)
注意:mavenプラグインMaven-jar-pluginを配置し、manClassを指定します。

<dependencies>
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.11</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-mapreduce-client-core</artifactId>
    <version>2.5.2</version>
  </dependency>
  <dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-common</artifactId>
    <version>2.5.2</version>
  </dependency>
 </dependencies>
 
 <build>
   <plugins>
     <plugin>
  <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-jar-plugin</artifactId>
   <configuration>
    <archive>
     <manifest>
      <mainClass>com.xxx.demo.hadoop.wordcount.WordCount</mainClass>
     </manifest>
    </archive>
   </configuration>
  </plugin>
   </plugins>
 </build>
(2)MapReduceの運営メカニズムによって、一つのjobは少なくとも三つの種類を作成して、Map論理、Reduce論理、作業スケジュールの三つのことを完成させます。
Mapのコードはorg.apache.hadoop.mapreuce.Mapper類を継承できます。

public static class TokenizerMapper
    extends Mapper<Object, Text, Text, IntWritable>{
 
  private final static IntWritable one = new IntWritable(1);
  private Text word = new Text();
   //        key   ,    key         Object
  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);
   }
  }
 }
Reduceのコードはorg.apache.hadoop.mapreuce.Reducerクラスを継承できます。

public 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();
  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);
  FileInputFormat.addInputPath(job, new Path(args[0]));
  FileOutputFormat.setOutputPath(job, new Path(args[1]));
  job.waitForCompletion(true) ;
  //System.exit(job.waitForCompletion(true) ? 0 : 1);
 }
2.データファイルをhadoopクラスタ環境にアップロードする
mvn installを実行して、プロジェクトをjarファイルにして、linuxクラスタ環境にアップロードし、hdfs dfs-mkdirコマンドを使用してhdfsファイルシステムで対応するコマンドを作成し、hdfs dfs-putを使用して、必要な処理データファイルをhdfsシステムにアップロードします。path/データファイル{hdfs_}パス
3.jobを実行する
クラスタ環境でコマンドを実行します。path)/wordcount.jar$hdfs_input_path}$hdfs_out put_パス
4.統計結果を見る
hdfs dfs-cat$hdfs_out put_パス)/出力ファイル名
以上のように、hadoopクラスタ環境が起動されていない場合には、Localモードで動作し、HFSとYARNは機能しない。以下は偽分布モードでmapreduce jobを実行する時に必要な仕事です。まず公式サイトに記載されている手順を抜粋してください。
ホスト名の設定# vi /etc/sysconfig/networkたとえば:

NETWORKING=yes
HOSTNAME=master


vi /etc/hosts
下記の内容を記入します127.0.0.1 localhostsshフリーパスワードの設定ssh-keygen -t rsa
# cat?~/.ssh/id_rsa.pub?>>?~/.ssh/authorized_keys
core-site.xmlファイルを設定します。HOME)/etc/hadoop/

<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>
hdfs-site.xmlファイルの設定

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>
以下のコマンドは、シングルマシンの擬似分布モードでmapreduceのjobを実行することができます。
1.Format the filesystem:
$bin/hdfs namenode-format
2.Start Name Node daemen and DataNode daemen:
$sbin/start-dfs.sh
3.The hadoop daemen logn output is written to the$HADOOP_LOG_DIR directory(defaults to$HADOOP_)HOME/logs).
4.Browse the web interface for the NameNode;by default it is available at:
NameNode-http://localhost:50070/
Make the HFS directores required to execute MapReduce jobs:
$bin/hdfs dfs-mkdir/user
$bin/hdfs dfs-mkdir/user/
5.Copy the input files into the distributed filesystem:
$bin/hdfs dfs-put etc/hadoop input
6.Run some of the examples provided:
$bin/hadoop jar shar/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.2.jar grep input'dfs[a-z.]+'
7.Exmine the output files:
Copy the out put files from the distributed filesystem to the local filesystem and exmine the m:
$bin/hdfs dfs-get output out put
$cat output/*
or
View the output files on the distributed filesystem:
$bin/hdfs dfs-cat output/*
8.When you're done、stop the daemens with:
$sbin/stop-dfs.sh
締め括りをつける
以上がhadoopのwodcountコードのすべての内容です。皆さんの助けを期待しています。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。