本文是目前为止最简单,也不需要配Hadoop环境之类的教程,但是如果是xjtlu的小伙伴,可能就不太合适,因为老师好像是要求写出hdfs的操作的代码的,这儿可以参考阿里云第二弹。
loner:从阿里云轻量服务器安装Hadoop及环境配置
我们今天这篇文章是等价于以下这篇文章,来运行wordcount.java这个文件的
loner:阿里云Hadoop第二弹(运行WordCount)
在第二弹里面,核心的思路就是,在HDFS上创建文件,本地上传文件,连同你的script,然后在服务器里用javac compile出你的classes,然后打包成一个jar包,然后在Hadoop上运行jar包,然后同样也是用Hadoop命令查看你的结果。步骤显得非常繁琐
但是,在我注册完(白嫖完)IntelliJ IDEA的专业版后,他会提醒你需不需要装big data tools这个第三方插件,然后我巨盯着下面这行菜单栏陷入沉思,肯定可以有那种一键run,然后生成output的方式。
至于为什么不用eclipse,因为它实在太丑了(谁还不是个颜狗呢🤪)
我首先总结下Hadoop的三种运行模式
1。 单机模式
2。 伪分布模式
3。 完全分布模式
之前的三篇文章其实搭建的都是伪分布模式Hadoop的安装。但实际上基于Hadoop的MapReduce程序在本地程序上就完全可以运行,并不一定需要伪分布模式,甚至连Hadoop都不一定需要安装。在单机模式下,可以将MapReduce的程序当成一个普普通通的java程序。在这里我们需要借助项目管理工具Maven。这里就不用导入各种依赖,只需要一键导入pom文件(其中制定了Hadoop依赖包的名字和版本号),就不需要在花额外的时间纠缠在各种依赖上,只需要专门focus在你的代码编写上了
这里插一句:有很多小伙伴问我阿里云教程一步步做了,为啥还是装不上,各种找不到啊,或者报错。
1。代码一行行运行,不要全部复制,因为terminal里面毕竟是一行行运行的,若复制几行,很有可能会出错,比如某一行忘记运行了
2。如果是阿里云,记住,重置系统花的时间远比debug要的花的时间少,如果你只是完成作业,请大胆重置,如果你有很多时间,且很有兴趣,可以大胆的去搜去研究,对Linux环境的理解会很有帮助
进入正题,我们首先需要创建一个project,并且选择maven。
什么是maven,可以在下面链接查看,以及我当时参考的教程。这里非常感谢给予帮助的郭同学,因为之前完全没接触过这些只是,啥都不懂,非常感谢他手把手教我,然后重新看下面的操作,就很好理解(PS:xml的格式一定要完全复制,我之前配置Hadoop环境的时候碰到一个问题就是它xml格式上下不是完全相同的,/做区分)
Hadoop: Intellij结合Maven本地运行和调试MapReduce程序 (无需搭载Hadoop和HDFS环境)
输入名称后继续,什么都不要改,然后进入新创建的project,初始状态如下
然后下面导入我们的pom文件,路径依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| <?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" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId> <artifactId>Hadoop</artifactId> <version>1.0-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>6</source> <target>6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>6</source> <target>6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>7</source> <target>7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>7</source> <target>7</target> </configuration> </plugin> </plugins> </build>
<repositories> <repository> <id>apache</id> <url>http://maven.apache.org</url> </repository> </repositories>
<dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.2.1</version> </dependency> </dependencies>
</project>
|
会在右上角红框内出现这个,点击loade pom change,然后Hadoop会自动帮你配置完成,第一次可能需要点时间,等它compile完,你就完成一大半了。
下来书写你的WordCount.java
首先创造一个java,路径是在src/main/java底下new 一个java,class name 叫WordCount,然后这里导入我之前写的WordCount.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| 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;
public class WordCount {
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(); 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])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }
|
下来需要配置运行,选择application
选择application后需要配置如下,name随意,最重要的是Main class: 保证名字和你new的java文件名字一致,input和output是等会要放入的文件,输入和输出
配置输入文件
这里我刚刚在configuration里面写了我的输入文件叫input,需要配置输入路径,这里在(src同级目录下)新建一个文件夹input,并且把你需要输入的文件放进去,这儿还是之前的pg100.txt
额外,我们需要在File->Project Structure(或者mac快捷键command+;)将language level调整为7,然后点右下角ok
运行和调试
直接点右上角的run
会出现如下情况
注意:这里的红字不是报错,不要慌!
运行成功后,你的文件会出现一个output的文件,由于output的先天特性,它无法覆盖,所以下次运行的时候请删除之前的那个,或者你改个名字(我后来好像看见这个可以用其他方法覆盖的,这里就不做涉及)
打开part-r-00000,会出现你Hadoop运行的结果
到现在为,用IDEA配置Hadoop已经全部完成了。