还是那句话,看别人写的的总是觉得心累,代码一贴,一打包,扔到Hadoop上跑一遍就完事了????写个测试样例程序(MapReduce中的Hello World)还要这么麻烦!!!?,还本地打Jar包,传到Linux上,最后再用jar命令运行jar包敲一遍in和out参数,我去,我是受不了了,我很捉急,

我就想知道MapReduce的工作原理,而知道原理后,我就想在本地用Java程序跑一遍整个MapReduce的计算过程,这个很难吗? 搜遍全网,没发现几个是自己想要的(也有可能漏掉了),都是可以参考的,但是零零散散不对胃口,不适合入门级“玩家”像我一样的人,最后,下定决心,看视频搜集资料,从头到尾的捋一下MapReduce的原理,以及如何在本地,通过编写map和reduce函数对一个文本文件中的单词进行出现次数的统计,并将结果输出到HDFS文件系统上

注: 本文最后,还会附上一套自己写的HDFS的文件操作Java API,使用起来也很方便,API还在不断的完善..


效果:

1、  HelloWorld文本

  1. a b c d
  2. e f a c
  3. a c b f


2、上传至HDFS的intput目录下


3、客户端提交Job,执行MapReduce

A、map的输出结果


B、reduce的输入结果(上一步map的输出)

 

C、reduce的计算结果(代码实现细节先暂时忽略,文章中会讲到)

 
 


D、最后,待任务全部完成,交由HDFS进行结果的文件写入


MapReduce中的分区默认是哈希分区,但是我们也可以自己写demo来重写Partitioner类的getPartiton方法,如下:

分区规则定后,我们需要指定客户端Job的map task的分区类并设置reducer的个数,如下

最后,提交Job跑一遍MapReduce的效果如下:

我们分别下载文件*.*-00000和*.*-00001至本地,并进行结果验证,效果如下:

分区0对应的reduce结果文件如下:

分区1对应的reduce结果文件如下:

至此,我用效果图的方式,给大家演示了一下MapReduce的前前后后究竟是如何进行map和reduce的,其中发生了什么,最后又发生了什么,很直观,但是,注意,效果图只能帮助你理解MapReduce最终能干什么,具体MapReduce内部的工作原理如何,我下面会继续讲到,而且,博文的末尾,我会附上本篇博文演示要用到的全demo。


一、什么是MapReduce

我们要数图书馆里面的所有书,你数1号书架,我数2号书架,他数3号书架...这就叫Map

现在我们把所有人统计的图书数加在(归并)一起,这就叫“Reduce”

合起来就是MapReduce【分布式大数据处理功能】!!!

详细的请查看:MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算

二、MapReduce执行过程

补充:

1、JobTracker  对应于 NameNode,TaskTracker 对应于 DataNode。

2、JobTracker是一个master服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。

Client         :客户端提交一个Job给JobTracker

JobTracker :调度Job的每一个mapper和reducer,并运行在TaskTracker上,并监控它们

Mapper      :拿到符合自己的InputSplit(输入内容),进行map后,输出MapOutPut(map的输出内容)

Reducer     : 拿到MapOutPut作为自己的ReduceInput,进行reduce计算,最后输出OutPut结果

三、MapReduce工作原理

 

注:reducer开始reduce之前,一定要等待mapper完成map后才能开始

第一步:Job读取存在于 HDFS文件系统上的文件作为Mapper的输入内容(key,value)并经过特殊的处理(map编程实现)交由Mapper Task

第二步:Mapper Task对map后的数据进行shuffle(洗牌,重组),包括分区、排序或合并(combine)

第三步:Mapper把shuffle后的输出结果(key,values)提供给对应的Reducer Task,由Reducer取走

第四步:Reducer拿到上一步Mapper的输出结果,进行reduce(客户端编程实现)

第五步:Reducer完成reduce计算后,将结果写入HDFS文件系统,不同的reducer对应不同的结果文件

粗犷的图(自己画的)如下

四、Shuffle过程简介

 
 
 

上图需要注意的就是shuffle过程中的分区,图中很直观的说明了,mapper最后会把key-value键值对数据(输入数据)从缓存中拿出(缓存数据溢出)并根据分区规则进行磁盘文件的写入(注意:这里的磁盘文件不是HDFS文件系统上的文件,且写入文件的内容已经是排序过的了),同时会对不同分区的key-value数据文件进行一个归并,最后分给不同的Reduce任务进行reduce处理,如果有多个Mapper,则Reducer从Map端获取的内容需要再次进行归并(把属于不同的Mapper但属于同一个分区的输出的结果进行归并,并在reduce端也进行shuffle过程,写入磁盘文件,最后进行reduce计算,reduce计算的结果最后以文件的形式输出到HDFS文件系统中)

五、Map端的Shuffle过程

 
 
 

需要知道的是:

1、缓存的大小是可以设置的(mapreduce.task.io.sort.mb,默认100M)

2、溢出比(缓存使用率有一个软阈值 == mapreduce.map.sort.spill.percent,默认0.80),当超过阈值时,溢出行为会在后台起一个线程执行从而使Map任务不会因为缓存的溢出而被阻塞。但如果达到硬限制,Map任务会被阻塞,直到溢出行为结束

六、如何编写map和reduce函数

 
 

到这一步,如果你对MapReduce的工作原理已经掌握了,那么接下来,编写客户端程序,利用MapReduce的计算功能,实现文本文件中单词的出现次数的统计,将会是轻而易举的。

首先,我们需要一个mapper(任务),其次是reducer(任务),有了两个任务后,我们需要创建一个Job(作业),将mapper和reducer关联起来,并提交至Hadoop集群,由集群中的JobTracker进行mapper和reducer任务的调度,并最终完成数据的计算工作。

因此,不难发现,光有mapper和reducer任务,是无法进行MapReduce(分布式大数据计算)的,这里我们需要写三个类,一个是实现Map的类,一个是实现Reduce的类,还有一个就是提交作业的主类(Client Main Class)

由于博主的Hadoop版本是3.1.0的,因此,为了兼顾3.X以下的Hadoop集群环境能够在下面提供的demo中能够跑起来,特将本文中涉及到的Hadoop依赖换成了2.7.X的版本,如下:

注意:不要使用过时的hadoop-core(1.2.1)依赖,否则会出现各种意想不到的的问题

  1. <dependency>
  2. <groupId>org.apache.hadoop</groupId>
  3. <artifactId>hadoop-common</artifactId>
  4. <version>2.7.1</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.hadoop</groupId>
  8. <artifactId>hadoop-hdfs</artifactId>
  9. <version>2.7.1</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.hadoop</groupId>
  13. <artifactId>hadoop-client</artifactId>
  14. <version>2.7.1</version>
  15. </dependency>
  16. <!-- common 依赖 tools.jar包 -->
  17. <dependency>
  18. <groupId>jdk.tools</groupId>
  19. <artifactId>jdk.tools</artifactId>
  20. <version>1.8</version>
  21. <scope>system</scope>
  22. <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
  23. </dependency>

(1)编写Mapper

  1. import java.io.IOException;
  2.  
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.LongWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Mapper;
  7.  
  8. /**
  9. * Mapper 原型 : Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
  10. *
  11. * KEYIN : 默认情况下,是mr框架所读到的一行文本内容的起始偏移量,Long,
  12. * 但是在hadoop中有自己的更精简的序列化接口,所以不直接用Long,而用LongWritable
  13. * VALUEIN : 默认情况下,是mr框架所读到的一行文本的内容(Java String 对应 Hadoop中的Text)
  14. * KEYOUT : 用户自定义逻辑处理完成之后输出数据中的key,在此处是单词(String),同上用Text
  15. * VALUEOUT : 用户自定义逻辑处理完成之后输出数据中的value,在这里是单词的次数:Integer,对应Hadoop中的IntWritable
  16. *
  17. * mapper的输入输出参数的类型必须和reducer的一致,且mapper的输出是reducer的输入
  18. *
  19. * @blob http://blog.csdn.net/appleyk
  20. * @date 2018年7月3日15:41:13
  21. */
  22. public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{
  23.  
  24. /**
  25. * map实现数据拆分的操作
  26. * 本操作主要进行Map的数据处理
  27. * 在Mapper父类里面接受的内容如下:
  28. * LongWritable:文本内容的起始偏移量
  29. * Text:每行的文本数据(行内容)
  30. * Text:每个单词分解后的统计结果
  31. * IntWritable:输出记录的结果
  32. */
  33. @Override
  34. protected void map(LongWritable key, Text value,Context context)
  35. throws IOException, InterruptedException {
  36.  
  37. System.out.println("文本内容的起始偏移量:"+key);
  38. String line = value.toString() ;//取出每行的数据
  39. String[] result = line.split(" ");//按照空格进行数据拆分
  40. //循环单词
  41. for (int i = 0 ;i <result.length ; i++){
  42.  
  43. //针对每一个单词,构造一个key-value
  44. System.out.println("key-value : <"+new Text(result[i])+","+new IntWritable(1)+">");
  45.  
  46. /**
  47. * 将每个单词的key-value写入到输入输出上下文对象中
  48. * 并传递给mapper进行shuffle过程,待所有mapper task完成后交由reducer进行对号取走
  49. */
  50. context.write(new Text(result[i]), new IntWritable(1));
  51. }
  52.  
  53. /** map端的shuffle过程(大致简单的描述一下)
  54. * |
  55. * | 放缓存(默认100M,溢出比是0.8,即80M满进行磁盘写入并清空,
  56. * | 剩余20M继续写入缓存,二者结合完美实现边写缓存边溢写(写磁盘))
  57. * V
  58. * <b,1>,<c,1>,<a,1>,<a,1>
  59. *
  60. * |
  61. * | 缓存写满了,开始shuffle(洗牌、重组) == 包括分区,排序,以及可进行自定的合并(combine)
  62. * V
  63. * 写入磁盘文件(not hdfs)并进行文件归并,成一个个的大文件 <a,<1,1>>,<b,1>,<c,1>
  64. *
  65. * |
  66. * |
  67. * V
  68. * 每一个大文件都有各自的分区,有几个分区就对应几个reducer,随后文件被各自的reducer领走
  69. *
  70. * !!! 这就是所谓的mapper的输入即是reducer的输出 !!!
  71. */
  72. }
  73. }

(2)编写Reducer

 

  

  1. import java.io.IOException;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4.  
  5. import org.apache.hadoop.io.IntWritable;
  6. import org.apache.hadoop.io.Text;
  7. import org.apache.hadoop.mapreduce.Reducer;
  8.  
  9. /**
  10. * 进行合并后数据的最终统计
  11. * 本次要使用的类型信息如下:
  12. * Text:Map输出的文本内容
  13. * IntWritable:Map处理的个数
  14. * Text:Reduce输出文本
  15. * IntWritable:Reduce的输出个数
  16. */
  17. public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
  18.  
  19. @Override
  20. protected void reduce(Text key, Iterable<IntWritable> values,Context context)
  21. throws IOException, InterruptedException {
  22.  
  23. //mapper的输出是reducer的输入,因此,这里打一下reducer的接收内容
  24. List<Integer> list = new ArrayList<>();
  25.  
  26. int sum = 0;//记录每个单词(key)出现的次数
  27. for (IntWritable value : values) {
  28. //从values集合里面取出key的单个频率数量(其实就是1)进行叠加
  29. int num = value.get();
  30. sum += num;
  31. list.add(num);
  32.  
  33. }
  34.  
  35. /**
  36. * mapper会把一堆key-value进行shuffle操作,其中涉及分区、排序以及合并(combine)
  37. * 注:上述shuffle中的的合并(combine)区别于map最终的的合(归)并(merge)
  38. * 比如有三个键值对:<a,1>,<b,1>,<a,1>
  39. * combine的结果:<a,2>,<b,1> == 被reducer取走,数据小
  40. * merage 的结果;<a,<1,1>>,<b,1> == 被reducer取走,数据较大(相比较上述combine来说)
  41. * 注:默认combiner是需要用户自定义进行开启的,所以,最终mapper的输出其实是归并(merage)后的的结果
  42. *
  43. * 所以,下面的打印其实就是想看一下mapper在shuffle这个过程后的merage结果(一堆key-values)
  44. */
  45. System.out.println("key-values :<"+key+","+list.toString().replace("[", "<")
  46. .replace("]", ">")+">");
  47.  
  48. //打印一下reduce的结果
  49. System.out.println("reduce计算结果 == key-value :<"+key+","+new IntWritable(sum)+">");
  50. //最后写入到输入输出上下文对象里面,传递给reducer进行shuffle,待所有reducer task完成后交由HDFS进行文件写入
  51. context.write(key, new IntWritable(sum));
  52.  
  53. }
  54. }

(3)编写Partition分区类(如果需要修改Map默认的哈希分区规则的话)

  1.  
  1. import org.apache.hadoop.io.IntWritable;
  2. import org.apache.hadoop.io.Text;
  3. import org.apache.hadoop.mapreduce.Partitioner;
  4.  
  5. public class PartitionTest extends Partitioner<Text, IntWritable> {
  6.  
  7. /**
  8. * key : map的输出key
  9. * value : map的输出value
  10. * numReduceTask: reduce的task数量
  11. * 返回值,指定reduce,从0开始
  12. * 比如,分区0交由reducer0拿走
  13. */
  14. @Override
  15. public int getPartition(Text key, IntWritable value, int numReduceTask) {
  16.  
  17. if (key.toString().equals("a")) {
  18. //如果key的值等于a,则将其分区指定为0,对应第一个reducer拿走进行reduce
  19. return 0;
  20. } else {
  21. return 1;
  22. }
  23. }
  24. }

(4)编写Job类(Main Class)

 
  1. import org.apache.hadoop.conf.Configuration;
  2. import org.apache.hadoop.fs.Path;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Job;
  6. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  7. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  8.  
  9. import com.appleyk.hdfs.mapper.WordCountMapper;
  10. import com.appleyk.hdfs.part.PartitionTest;
  11. import com.appleyk.hdfs.reducer.WordCountReducer;
  12.  
  13. /**
  14. * Client端,提交作业
  15. * @author yukun24@126.com
  16. * @blob http://blog.csdn.net/appleyk
  17. * @date 2018年7月3日-上午9:51:49
  18. */
  19. public class WordCountApp {
  20.  
  21. public static void main(String[] args) throws Exception{
  22.  
  23. Configuration conf = new Configuration();
  24. //配置uri
  25. conf.set("fs.defaultFS", "hdfs://192.168.142.138:9000");
  26.  
  27. //创建一个作业,作业名"wordCount",作用在Hadoop集群上(remote)
  28. Job job = Job.getInstance(conf, "wordCount");
  29.  
  30. /**
  31. * 设置jar包的主类(如果样例demo打成Jar包扔在Linux下跑任务,
  32. * 需要指定jar包的Main Class,也就是指定jar包运行的主入口main函数)
  33. */
  34. job.setJarByClass(WordCountApp.class);
  35.  
  36. //设置Mapper 任务的类(自己写demo实现map)
  37. job.setMapperClass(WordCountMapper.class);
  38. //设置Reducer任务的类(自己写demo实现reduce)
  39. job.setReducerClass(WordCountReducer.class);
  40.  
  41. //指定mapper的分区类
  42. //job.setPartitionerClass(PartitionTest.class);
  43.  
  44. //设置reducer(reduce task)的数量(从0开始)
  45. //job.setNumReduceTasks(2);
  46.  
  47. //设置映射输出数据的键(key) 类(型)
  48. job.setMapOutputKeyClass(Text.class);
  49. //设置映射输出数据的值(value)类(型)
  50. job.setMapOutputValueClass(IntWritable.class);
  51.  
  52. //设置作业(Job)输出数据的键(key) 类(型) == 最后要写入到输出文件里面
  53. job.setOutputKeyClass(Text.class);
  54. //设置作业(Job)输出数据的值(value)类(型) == 最后要写入到输出文件里面
  55. job.setOutputValueClass(IntWritable.class);
  56.  
  57. //设置输入的Path列表(可以是单个文件也可以是多个文件(目录表示即可))
  58. FileInputFormat.setInputPaths (job, new Path("hdfs://192.168.142.138:9000/input" ));
  59. //设置输出的目录Path(确认输出Path不存在,如存在,请先进行目录删除)
  60. FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.142.138:9000/output"));
  61.  
  62. //将作业提交到集群并等待它完成。
  63. boolean bb =job.waitForCompletion(true);
  64.  
  65. if (!bb) {
  66. System.out.println("Job作业执行失败!");
  67. } else {
  68. System.out.println("Job作业执行成功!");
  69. }
  70. }
  71.  
  72. }

(5)运行main方法,提交作业

出现异常:

  1. Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
由于作业是在本地(Windows)跑的,因此,这里遇到一个本地IO读写权限的问题,具体代码可以见NativeIO这个Java类的源码,在此处:
 

将源代码全部拷贝出来,在项目下新建一个同包名同类名称的文件如下:

打开后,修改代码如下(去掉验证):

(6)再次运行main方法,提交作业

 

再次出现异常:

  1. org.apache.hadoop.security.AccessControlException:
  2.  
  3. Permission denied: user=Administrator, access=WRITE,inode="/":root:supergroup:drwxr-xr-x

意思是再说,我当前使用的user是Windows下的Administrator,但是在Hadoop的HDFS文件系统中,没有这个用户,因此,我想用Administrator这个用户向HDFS文件系统Write的时候出现权限不足的异常,因为HDFS文件系统根目录下的文件对其他用户来说,不具备w和r的权限

原本把mapreduce程序打包放在集群中跑是不用担心用户的hdfs权限问题的,但是,我一开始说了,我不想那么麻烦,无非就是Hadoop开启了HDFS文件系统的权限验证功能,我给它关了(开放)不就行了,因此,我决定直接在hdfs-site.xml配置文件里进行权限验证的修改,添加内容如下:

  1. <property>
  2. <name>dfs.permissions</name>
  3. <value>false</value>
  4. </property>

保存后,重启Hadoop集群

先stop,再start

 

(7)再次运行main方法,提交作业

  1. 16:55:44.385 [main] INFO org.apache.hadoop.mapreduce.Job - map 100% reduce 100%
  2. 16:55:44.385 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.getTaskCompletionEvents(Job.java:670)
  3. 16:55:44.385 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:320)
  4. 16:55:44.386 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:320)
  5. 16:55:44.386 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.getTaskCompletionEvents(Job.java:670)
  6. 16:55:44.386 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:320)
  7. 16:55:44.386 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:320)
  8. 16:55:44.387 [main] INFO org.apache.hadoop.mapreduce.Job - Job job_local539916280_0001 completed successfully
  9. 16:55:44.388 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.getCounters(Job.java:758)
  10. 16:55:44.407 [main] INFO org.apache.hadoop.mapreduce.Job - Counters: 35
  11. File System Counters
  12. FILE: Number of bytes read=560
  13. FILE: Number of bytes written=573902
  14. FILE: Number of read operations=0
  15. FILE: Number of large read operations=0
  16. FILE: Number of write operations=0
  17. HDFS: Number of bytes read=46
  18. HDFS: Number of bytes written=24
  19. HDFS: Number of read operations=13
  20. HDFS: Number of large read operations=0
  21. HDFS: Number of write operations=4
  22. Map-Reduce Framework
  23. Map input records=3
  24. Map output records=12
  25. Map output bytes=72
  26. Map output materialized bytes=102
  27. Input split bytes=112
  28. Combine input records=0
  29. Combine output records=0
  30. Reduce input groups=6
  31. Reduce shuffle bytes=102
  32. Reduce input records=12
  33. Reduce output records=6
  34. Spilled Records=24
  35. Shuffled Maps =1
  36. Failed Shuffles=0
  37. Merged Map outputs=1
  38. GC time elapsed (ms)=3
  39. Total committed heap usage (bytes)=605028352
  40. Shuffle Errors
  41. BAD_ID=0
  42. CONNECTION=0
  43. IO_ERROR=0
  44. WRONG_LENGTH=0
  45. WRONG_MAP=0
  46. WRONG_REDUCE=0
  47. File Input Format Counters
  48. Bytes Read=23
  49. File Output Format Counters
  50. Bytes Written=24
  51. 16:55:44.407 [main] DEBUG org.apache.hadoop.security.UserGroupInformation - PrivilegedAction as:Administrator (auth:SIMPLE) from:org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:320)
  52. Job作业执行成功!
 

ok,至此,本地执行mapreduce作业已经完成,接下来就是查看我们要的结果了

(8)利用Java HDFS API,打开/output/part-r-00000文件内容,输出到控制台

 
  1. a b c d
  2. e f a c
  3. a c b f

七、GitHub项目地址

 

Java HDFS API ,实现文件的存储和访问 并附带MapReduce作业,本地提交作业至集群实现Word Count的计算

Java --本地提交MapReduce作业至集群☞实现 Word Count的更多相关文章

  1. Win7下无法提交MapReduce Job到集群环境(转)

    一. 对hadoop eclipse plugin认识不足 http://zy19982004.iteye.com/blog/2024467曾经说到我最hadoop eclipse plugin作用的 ...

  2. 本地idea开发mapreduce程序提交到远程hadoop集群执行

    https://www.codetd.com/article/664330 https://blog.csdn.net/dream_an/article/details/84342770 通过idea ...

  3. Storm系列(三):创建Maven项目打包提交wordcount到Storm集群

    在上一篇博客中,我们通过Storm.Net.Adapter创建了一个使用Csharp编写的Storm Topology - wordcount.本文将介绍如何编写Java端的程序以及如何发布到测试的S ...

  4. spark使用idea以client模式提交应用到standalone集群

    使用idea以client方式提交代码到standalone集群非常简单. 1.首先有一个部署好且已经启动的standalone集群 --------------------------------- ...

  5. MapReduce Service更换集群外部时钟源,仅需10步

    摘要:MapReduce Service 集群使用NTP进行时钟同步.本文简要介绍了MapReduce Service集群NTP机制及NTP的配置方式. 本文分享自华为云社区<MapReduce ...

  6. 提交第一个spark作业到集群运行

    写在前面 接触spark有一段时间了,但是一直都没有真正意义上的在集群上面跑自己编写的代码.今天在本地使用scala编写一个简单的WordCount程序.然后,打包提交到集群上面跑一下... 在本地使 ...

  7. 在windows远程提交任务给Hadoop集群(Hadoop 2.6)

    我使用3台Centos虚拟机搭建了一个Hadoop2.6的集群.希望在windows7上面使用IDEA开发mapreduce程序,然后提交的远程的Hadoop集群上执行.经过不懈的google终于搞定 ...

  8. Eclipse提交任务至Hadoop集群遇到的问题

    环境:Windows8.1,Eclipse 用Hadoop自带的wordcount示例 hadoop2.7.0 hadoop-eclipse-plugin-2.7.0.jar //Eclipse的插件 ...

  9. 使用IDEA远程向伪分布式搭建的Hadoop提交MapReduce作业

    环境 VirtualBox 6.1 IntelliJ IDEA 2020.1.1 Ubuntu-18.04.4-live-server-amd64 jdk-8u251-linux-x64 hadoop ...

随机推荐

  1. 用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯

    最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 ...

  2. matlab绘图(详细)(全面)

    Matlab绘图 强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到所需图形,这类函数称为高层绘图函数.此外,M ...

  3. java原生文件打包

    一.背景 前端时间,自己做的项目需要打包功能,不想再引外部的jar包 便用java.util.zip做了下该功能 二.适用场景 生成多个word.excel.xml等文件,并要求打包下载的情形 例:项 ...

  4. oracle 12c使用dblink克隆pdb

    Multitenant : Hot Clone a Remote PDB or Non-CDB in Oracle Database 12c Release 2 (12.2)https://oracl ...

  5. IOS AFN请求 总结

    一.2大管理对象 1.AFHTTPRequestOperationManager* 对NSURLConnection的封装 2.AFHTTPSessionManager* 对NSURLSession的 ...

  6. 每日linux命令之kill

    1.命令格式: kill[参数][进程号] 2.命令功能: 发送指定的信号到相应进程.不指定型号将发送SIGTERM(15)终止指定进程.如果任无法终止该程序可用“-KILL” 参数,其发送的信号为S ...

  7. 2018.10.6 Hibernate配置文件详解-------ORM元数据配置 &&& hibernate主配置文件

    ORM既然是实体与关系数据库的映射,那就需要建立实体和关系数据库之间的基础数据,也可以称为元数据.简单的说就是表示类与表.列与属性(get.set方法)等等之间对应关系的数据. Customer.hb ...

  8. caffe 学习(1) —— Classification: Instant Recognition with Caffe

    学习地址http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb 1.安装m ...

  9. 【luogu P1972 [SDOI2009]HH的项链】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1972 真是不懂为什么要卡莫队! #include <cmath> #include <cs ...

  10. LINQ to XML简介

    我们的配置文件使用XML存储信息.ADO.NET的DataSet(利用扩展方法)可以方便的将数据保存(或加载)为XML..NET特有的XML API,如XmlReader/XmlWriter类.微端提 ...