一. 倒排索引(多job串联

1. 需求分析

有大量的文本(文档、网页),需要建立搜索索引

  1. xyg pingping
  2. xyg ss
  3. xyg ss

a.txt

  1. xyg pingping
  2. xyg pingping
  3. pingping ss

b.txt

  1. xyg ss
  2. xyg pingping

c.txt

(1)第一次预期输出结果

  1. xyg--a.txt
  2. xyg--b.txt
  3. xyg--c.txt
  4. pingping--a.txt
  5. pingping--b.txt
  6. pingping--c.txt
  7. ss--a.txt
  8. ss--b.txt
  9. ss--c.txt

(2)第二次预期输出结果

  1. xyg c.txt--> b.txt--> a.txt-->
  2. pingping c.txt--> b.txt--> a.txt-->
  3. ss c.txt--> b.txt--> a.txt-->

2. 第一次处理

(1)第一次处理,编写OneIndexMapper

  1. package com.xyg.mapreduce.index;
  2. import java.io.IOException;
  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. import org.apache.hadoop.mapreduce.lib.input.FileSplit;
  8.  
  9. public class OneIndexMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  10.  
  11. Text k = new Text();
  12.  
  13. @Override
  14. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  15. // 1 获取切片名称
  16. FileSplit inputSplit = (FileSplit) context.getInputSplit();
  17. String name = inputSplit.getPath().getName();
  18.  
  19. // 2 获取1行
  20. String line = value.toString();
  21.  
  22. // 3 截取
  23. String[] words = line.split(" ");
  24.  
  25. // 4 把每个单词和切片名称关联起来
  26. for (String word : words) {
  27. k.set(word + "--" + name);
  28.  
  29. context.write(k, new IntWritable());
  30. }
  31. }
  32. }

(2)第一次处理,编写OneIndexReducer

  1. package com.xyg.mapreduce.index;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.IntWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Reducer;
  6.  
  7. public class OneIndexReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
  8.  
  9. @Override
  10. protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  11.  
  12. int count = ;
  13. // 累加和
  14. for(IntWritable value: values){
  15. count +=value.get();
  16. }
  17.  
  18. // 写出
  19. context.write(key, new IntWritable(count));
  20. }
  21. }

(3)第一次处理,编写OneIndexDriver

  1. package com.xyg.mapreduce.index;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  4. import org.apache.hadoop.io.IntWritable;
  5. import org.apache.hadoop.io.Text;
  6. import org.apache.hadoop.mapreduce.Job;
  7. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  8. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  9.  
  10. public class OneIndexDriver {
  11.  
  12. public static void main(String[] args) throws Exception {
  13.  
  14. args = new String[] { "e:/inputoneindex", "e:/output5" };
  15.  
  16. Configuration conf = new Configuration();
  17.  
  18. Job job = Job.getInstance(conf);
  19. job.setJarByClass(OneIndexDriver.class);
  20.  
  21. job.setMapperClass(OneIndexMapper.class);
  22. job.setReducerClass(OneIndexReducer.class);
  23.  
  24. job.setMapOutputKeyClass(Text.class);
  25. job.setMapOutputValueClass(IntWritable.class);
  26.  
  27. job.setOutputKeyClass(Text.class);
  28. job.setOutputValueClass(IntWritable.class);
  29.  
  30. FileInputFormat.setInputPaths(job, new Path(args[]));
  31. FileOutputFormat.setOutputPath(job, new Path(args[]));
  32.  
  33. job.waitForCompletion(true);
  34. }
  35. }

(4)查看第一次输出结果

  1. xyg--a.txt
  2. xyg--b.txt
  3. xyg--c.txt
  4. pingping--a.txt
  5. pingping--b.txt
  6. pingping--c.txt
  7. ss--a.txt
  8. ss--b.txt
  9. ss--c.txt

3. 第二次处理

(1)第二次处理,编写TwoIndexMapper

  1. package com.xyg.mapreduce.index;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.LongWritable;
  4. import org.apache.hadoop.io.Text;
  5. import org.apache.hadoop.mapreduce.Mapper;
  6.  
  7. public class TwoIndexMapper extends Mapper<LongWritable, Text, Text, Text>{
  8. Text k = new Text();
  9. Text v = new Text();
  10.  
  11. @Override
  12. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  13.  
  14. // 1 获取1行数据
  15. String line = value.toString();
  16.  
  17. // 2用“--”切割
  18. String[] fields = line.split("--");
  19.  
  20. k.set(fields[]);
  21. v.set(fields[]);
  22.  
  23. // 3 输出数据
  24. context.write(k, v);
  25. }
  26. }

(2)第二次处理,编写TwoIndexReducer

  1. package com.xyg.mapreduce.index;
  2. import java.io.IOException;
  3. import org.apache.hadoop.io.Text;
  4. import org.apache.hadoop.mapreduce.Reducer;
  5. public class TwoIndexReducer extends Reducer<Text, Text, Text, Text> {
  6.  
  7. @Override
  8. protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  9. // xyg a.txt 3
  10. // xyg b.txt 2
  11. // xyg c.txt 2
  12.  
  13. // xyg c.txt-->2 b.txt-->2 a.txt-->3
  14.  
  15. StringBuilder sb = new StringBuilder();
  16.  
  17. for (Text value : values) {
  18. sb.append(value.toString().replace("\t", "-->") + "\t");
  19. }
  20.  
  21. context.write(key, new Text(sb.toString()));
  22. }
  23. }

(3)第二次处理,编写TwoIndexDriver

  1. package com.xyg.mapreduce.index;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.Path;
  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. public class TwoIndexDriver {
  10.  
  11. public static void main(String[] args) throws Exception {
  12.  
  13. args = new String[] { "e:/inputtwoindex", "e:/output6" };
  14.  
  15. Configuration config = new Configuration();
  16. Job job = Job.getInstance(config);
  17.  
  18. job.setMapperClass(TwoIndexMapper.class);
  19. job.setReducerClass(TwoIndexReducer.class);
  20.  
  21. job.setMapOutputKeyClass(Text.class);
  22. job.setMapOutputValueClass(Text.class);
  23.  
  24. job.setOutputKeyClass(Text.class);
  25. job.setOutputValueClass(Text.class);
  26.  
  27. FileInputFormat.setInputPaths(job, new Path(args[]));
  28. FileOutputFormat.setOutputPath(job, new Path(args[]));
  29.  
  30. System.exit(job.waitForCompletion(true) ? : );
  31. }
  32. }

(4)第二次查看最终结果

  1. xyg c.txt--> b.txt--> a.txt-->
  2. pingping c.txt--> b.txt--> a.txt-->
  3. ss c.txt--> b.txt--> a.txt-->

二. MapReduce 多 Job 串联

1. 需求

一个稍复杂点的处理逻辑往往需要多个 MapReduce 程序串联处理,多 job 的串联可以借助 MapReduce 框架的 JobControl 实现

2. 实例

以下有两个 MapReduce 任务,分别是 Flow 的 SumMR 和 SortMR,其中有依赖关系:SumMR 的输出是 SortMR 的输入,所以 SortMR 的启动得在 SumMR 完成之后

  1. Configuration conf1 = new Configuration();
  2. Configuration conf2 = new Configuration();
  3.  
  4. Job job1 = Job.getInstance(conf1);
  5. Job job2 = Job.getInstance(conf2);
  6.  
  7. job1.setJarByClass(MRScore3.class);
  8. job1.setMapperClass(MRMapper3_1.class);
  9. //job.setReducerClass(ScoreReducer3.class);
  10.  
  11. job1.setMapOutputKeyClass(IntWritable.class);
  12. job1.setMapOutputValueClass(StudentBean.class);
  13. job1.setOutputKeyClass(IntWritable.class);
  14. job1.setOutputValueClass(StudentBean.class);
  15.  
  16. job1.setPartitionerClass(CoursePartitioner2.class);
  17.  
  18. job1.setNumReduceTasks(4);
  19.  
  20. Path inputPath = new Path("D:\\MR\\hw\\work3\\input");
  21. Path outputPath = new Path("D:\\MR\\hw\\work3\\output_hw3_1");
  22.  
  23. FileInputFormat.setInputPaths(job1, inputPath);
  24. FileOutputFormat.setOutputPath(job1, outputPath);
  25.  
  26. job2.setMapperClass(MRMapper3_2.class);
  27. job2.setReducerClass(MRReducer3_2.class);
  28.  
  29. job2.setMapOutputKeyClass(IntWritable.class);
  30. job2.setMapOutputValueClass(StudentBean.class);
  31. job2.setOutputKeyClass(StudentBean.class);
  32. job2.setOutputValueClass(NullWritable.class);
  33.  
  34. Path inputPath2 = new Path("D:\\MR\\hw\\work3\\output_hw3_1");
  35. Path outputPath2 = new Path("D:\\MR\\hw\\work3\\output_hw3_end");
  36.  
  37. FileInputFormat.setInputPaths(job2, inputPath2);
  38. FileOutputFormat.setOutputPath(job2, outputPath2);
  39.  
  40. JobControl control = new JobControl("Score3");
  41. ControlledJob aJob = new ControlledJob(job1.getConfiguration());
  42. ControlledJob bJob = new ControlledJob(job2.getConfiguration());
  43. // 设置作业依赖关系
  44. bJob.addDependingJob(aJob);
  45. control.addJob(aJob);
  46. control.addJob(bJob);
  47. Thread thread = new Thread(control);
  48. thread.start();
  49. while(!control.allFinished()) {
  50. thread.sleep(1000);
  51. }
  52. System.exit(0);

三. MapReduce 全局计数器

1.MapReduce计数器概念

计数器是用来记录job的执行进度和状态的。它的作用可以理解为日志。我们可以在程序的某个位置插入计数器,记录数据或者进度的变化情况。

2.MapReduce计数器作用

MapReduce 计数器(Counter)为我们提供一个窗口,用于观察 MapReduce Job 运行期的各种细节数据。对MapReduce性能调优很有帮助,MapReduce性能优化的评估大部分都是基于这些 Counter 的数值表现出来的。

3.MapReduce内置计数器分类

MapReduce 自带了许多默认Counter,现在我们来分析这些默认 Counter 的含义,方便大家观察 Job 结果,如输入的字节数、输出的字节数、Map端输入/输出的字节数和条数、Reduce端的输入/输出的字节数和条数等。下面我们只需了解这些内置计数器,知道计数器组名称(groupName)和计数器名称(counterName),以后使用计数器会查找groupName和counterName即可。

1、任务计数器

在任务执行过程中,任务计数器采集任务的相关信息,每个作业的所有任务的结果会被聚集起来。例如,MAP_INPUT_RECORDS 计数器统计每个map任务输入记录的总数,并在一个作业的所有map任务上进行聚集,使得最终数字是整个作业的所有输入记录的总数。任务计数器由其关联任务维护,并定期发送给TaskTracker,再由TaskTracker发送给 JobTracker。因此,计数器能够被全局地聚集。下面我们分别了解各种任务计数器。

1)MapReduce 任务计数器

MapReduce 任务计数器的 groupName为org.apache.hadoop.mapreduce.TaskCounter,它包含的计数器如下表所示

计数器名称

说明

map 输入的记录数(MAP_INPUT_RECORDS)

作业中所有 map 已处理的输入记录数。每次 RecorderReader 读到一条记录并将其传给 map 的 map() 函数时,该计数器的值增加。

map 跳过的记录数(MAP_SKIPPED_RECORDS)

作业中所有 map 跳过的输入记录数。

map 输入的字节数(MAP_INPUT_BYTES)

作业中所有 map 已处理的未经压缩的输入数据的字节数。每次 RecorderReader 读到一条记录并 将其传给 map 的 map() 函数时,该计数器的值增加

分片split的原始字节数(SPLIT_RAW_BYTES)

由 map 读取的输入-分片对象的字节数。这些对象描述分片元数据(文件的位移和长度),而不是分片的数据自身,因此总规模是小的

map 输出的记录数(MAP_OUTPUT_RECORDS)

作业中所有 map 产生的 map 输出记录数。每次某一个 map 的Context 调用 write() 方法时,该计数器的值增加

map 输出的字节数(MAP_OUTPUT_BYTES)

作业中所有 map 产生的 未经压缩的输出数据的字节数。每次某一个 map 的 Context 调用 write() 方法时,该计数器的值增加。

map 输出的物化字节数(MAP_OUTPUT_MATERIALIZED_BYTES)

map 输出后确实写到磁盘上的字节数;若 map 输出压缩功能被启用,则会在计数器值上反映出来

combine 输入的记录数(COMBINE_INPUT_RECORDS)

作业中所有 Combiner(如果有)已处理的输入记录数。Combiner 的迭代器每次读一个值,该计数器的值增加。

combine 输出的记录数(COMBINE_OUTPUT_RECORDS)

作业中所有 Combiner(如果有)已产生的输出记录数。每当一个 Combiner 的 Context 调用 write() 方法时,该计数器的值增加。

reduce 输入的组(REDUCE_INPUT_GROUPS)

作业中所有 reducer 已经处理的不同的码分组的个数。每当某一个 reducer 的 reduce() 被调用时,该计数器的值增加。

reduce 输入的记录数(REDUCE_INPUT_RECORDS)

作业中所有 reducer 已经处理的输入记录的个数。每当某个 reducer 的迭代器读一个值时,该计数器的值增加。如果所有 reducer 已经处理完所有输入, 则该计数器的值与计数器 “map 输出的记录” 的值相同

reduce 输出的记录数(REDUCE_OUTPUT_RECORDS)

作业中所有 map 已经产生的 reduce 输出记录数。每当某一个 reducer 的 Context 调用 write() 方法时,该计数器的值增加。

reduce 跳过的组数(REDUCE_SKIPPED_GROUPS)

作业中所有 reducer 已经跳过的不同的码分组的个数。

reduce 跳过的记录数(REDUCE_SKIPPED_RECORDS)

作业中所有 reducer 已经跳过输入记录数。

reduce 经过 shuffle 的字节数(REDUCE_SHUFFLE_BYTES)

shuffle 将 map 的输出数据复制到 reducer 中的字节数。

溢出的记录数(SPILLED_RECORDS)

作业中所有 map和reduce 任务溢出到磁盘的记录数

CPU 毫秒(CPU_MILLISECONDS)

总计的 CPU 时间,以毫秒为单位,由/proc/cpuinfo获取

物理内存字节数(PHYSICAL_MEMORY_BYTES)

一个任务所用物理内存的字节数,由/proc/cpuinfo获取

虚拟内存字节数(VIRTUAL_MEMORY_BYTES)

一个任务所用虚拟内存的字节数,由/proc/cpuinfo获取

有效的堆字节数(COMMITTED_HEAP_BYTES)

在 JVM 中的总有效内存量(以字节为单位),可由Runtime().getRuntime().totaoMemory()获取。

GC 运行时间毫秒数(GC_TIME_MILLIS)

在任务执行过程中,垃圾收集器(garbage collection)花费的时间(以毫秒为单位), 可由 GarbageCollector MXBean.getCollectionTime()获取;该计数器并未出现在1.x版本中。

由 shuffle 传输的 map 输出数(SHUFFLED_MAPS)

有 shuffle 传输到 reducer 的 map 输出文件数。

失败的 shuffle 数(SHUFFLE_MAPS)

在 shuffle 过程中,发生拷贝错误的 map 输出文件数,该计数器并没有包含在 1.x 版本中。

被合并的 map 输出数

在 shuffle 过程中,在 reduce 端被合并的 map 输出文件数,该计数器没有包含在 1.x 版本中。

2)文件系统计数器

文件系统计数器的 groupName为org.apache.hadoop.mapreduce.FileSystemCounter,它包含的计数器如下表所示

  

计数器名称

说明

文件系统的读字节数(BYTES_READ)

由 map 和 reduce 等任务在各个文件系统中读取的字节数,各个文件系统分别对应一个计数器,可以是 Local、HDFS、S3和KFS等。

文件系统的写字节数(BYTES_WRITTEN)

由 map 和 reduce 等任务在各个文件系统中写的字节数。

3)FileInputFormat 计数器

FileInputFormat 计数器的 groupName为org.apache.hadoop.mapreduce.lib.input.FileInputFormatCounter,它包含的计数器如下表所示,计数器名称列的括号()内容即为counterName

计数器名称

说明

读取的字节数(BYTES_READ)

由 map 任务通过 FileInputFormat 读取的字节数。

4)FileOutputFormat 计数器

FileOutputFormat 计数器的 groupName为org.apache.hadoop.mapreduce.lib.input.FileOutputFormatCounter,它包含的计数器如下表所示

计数器名称

说明

写的字节数(BYTES_WRITTEN)

由 map 任务(针对仅含 map 的作业)或者 reduce 任务通过 FileOutputFormat 写的字节数。

2、作业计数器

作业计数器由 JobTracker(或者 YARN)维护,因此无需在网络间传输数据,这一点与包括 “用户定义的计数器” 在内的其它计数器不同。这些计数器都是作业级别的统计量,其值不会随着任务运行而改变。 作业计数器计数器的 groupName为org.apache.hadoop.mapreduce.JobCounter,它包含的计数器如下表所示

计数器名称

说明

启用的map任务数(TOTAL_LAUNCHED_MAPS)

启动的map任务数,包括以“推测执行” 方式启动的任务。

启用的 reduce 任务数(TOTAL_LAUNCHED_REDUCES)

启动的reduce任务数,包括以“推测执行” 方式启动的任务。

失败的map任务数(NUM_FAILED_MAPS)

失败的map任务数。

失败的 reduce 任务数(NUM_FAILED_REDUCES)

失败的reduce任务数。

数据本地化的 map 任务数(DATA_LOCAL_MAPS)

与输入数据在同一节点的 map 任务数。

机架本地化的 map 任务数(RACK_LOCAL_MAPS)

与输入数据在同一机架范围内、但不在同一节点上的 map 任务数。

其它本地化的 map 任务数(OTHER_LOCAL_MAPS)

与输入数据不在同一机架范围内的 map 任务数。由于机架之间的宽带资源相对较少,Hadoop 会尽量让 map 任务靠近输入数据执行,因此该计数器值一般比较小。

map 任务的总运行时间(SLOTS_MILLIS_MAPS)

map 任务的总运行时间,单位毫秒。该计数器包括以推测执行方式启动的任务。

reduce 任务的总运行时间(SLOTS_MILLIS_REDUCES)

reduce任务的总运行时间,单位毫秒。该值包括以推测执行方式启动的任务。

在保留槽之后,map任务等待的总时间(FALLOW_SLOTS_MILLIS_MAPS)

在为 map 任务保留槽之后所花费的总等待时间,单位是毫秒。

在保留槽之后,reduce 任务等待的总时间(FALLOW_SLOTS_MILLIS_REDUCES)

在为 reduce 任务保留槽之后,花在等待上的总时间,单位为毫秒。

4.计数器的该如何使用

下面我们来介绍如何使用计数器。

1、定义计数器

1)枚举声明计数器

  1. // 自定义枚举变量Enum
  2. Counter counter = context.getCounter(Enum enum)

2)自定义计数器

  1. / 自己命名groupNamecounterName
  2. Counter counter = context.getCounter(String groupName,String counterName)

2、为计数器赋值

1)初始化计数器

  1. counter.setValue(long value);// 设置初始值

 2)计数器自增

  1. counter.increment(long incr);// 增加计数

3、获取计数器的值

  1) 获取枚举计数器的值

  1. Configuration conf = new Configuration();
  2. Job job = new Job(conf, "MyCounter");
  3. job.waitForCompletion(true);
  4. Counters counters=job.getCounters();
  5. Counter counter=counters.findCounter(LOG_PROCESSOR_COUNTER.BAD_RECORDS_LONG);// 查找枚举计数器,假如Enum的变量为BAD_RECORDS_LONG
  6. long value=counter.getValue();//获取计数值

  2) 获取自定义计数器的值

  1. Configuration conf = new Configuration();
  2. Job job = new Job(conf, "MyCounter");
  3. job.waitForCompletion(true);
  4. Counters counters = job.getCounters();
  5. Counter counter=counters.findCounter("ErrorCounter","toolong");// 假如groupName为ErrorCounter,counterName为toolong
  6. long value = counter.getValue();// 获取计数值

  3) 获取内置计数器的值

  1. Configuration conf = new Configuration();
  2. Job job = new Job(conf, "MyCounter");
  3. job.waitForCompletion(true);
  4. Counters counters=job.getCounters();
  5. // 查找作业运行启动的reduce个数的计数器,groupName和counterName可以从内置计数器表格查询(前面已经列举有)
  6. Counter counter=counters.findCounter("org.apache.hadoop.mapreduce.JobCounter","TOTAL_LAUNCHED_REDUCES");// 假如groupName为org.apache.hadoop.mapreduce.JobCounter,counterName为TOTAL_LAUNCHED_REDUCES
  7. long value=counter.getValue();// 获取计数值

  4) 获取所有计数器的值

  1. Configuration conf = new Configuration();
  2. Job job = new Job(conf, "MyCounter");
  3. Counters counters = job.getCounters();
  4. for (CounterGroup group : counters) {
  5. for (Counter counter : group) {
  6. System.out.println(counter.getDisplayName() + ": " + counter.getName() + ": "+ counter.getValue());
  7. }
  8. }

Hadoop案例(四)倒排索引(多job串联)与全局计数器的更多相关文章

  1. Hadoop学习之路(十五)MapReduce的多Job串联和全局计数器

    MapReduce 多 Job 串联 需求 一个稍复杂点的处理逻辑往往需要多个 MapReduce 程序串联处理,多 job 的串联可以借助 MapReduce 框架的 JobControl 实现 实 ...

  2. hadoop系列四:mapreduce的使用(二)

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  3. WPF案例 (四) 模拟Windows7桌面任务栏

    原文:WPF案例 (四) 模拟Windows7桌面任务栏 这个程序模彷了Windows7的桌面任务栏,当在桌面上双击某个快捷方式时,将打开一个新的子界面,并且在任务栏里创建一个链接到此界面的任务栏图标 ...

  4. Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

    Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...

  5. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  6. MR案例:倒排索引

    1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value. 利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过 ...

  7. 马士兵hadoop第四课:Yarn和Map/Reduce配置启动和原理讲解(转)

    马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...

  8. Hadoop案例(十一)MapReduce的API使用

    一学生成绩---增强版 数据信息 computer,huangxiaoming,,,,,,, computer,xuzheng,,,,, computer,huangbo,,,, english,zh ...

  9. Hadoop案例(七)MapReduce中多表合并

    MapReduce中多表合并案例 一.案例需求 订单数据表t_order: id pid amount 1001 01 1 1002 02 2 1003 03 3 订单数据order.txt 商品信息 ...

随机推荐

  1. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) A 水 B stl C stl D 暴力 E 树状数组

    A. Unimodal Array time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  2. gdb常用命令小结

    用了这么长时间gdb, 总结下常用用法: http://note.youdao.com/noteshare?id=4a2d1a34624f7197d8e2304c4beb4578

  3. duilib CDateTimeUI 在Xp下的bug修复

    转自:http://my.oschina.net/u/343244/blog/370131 CDateTimeUI 的bug修复.修改CDateTimeWnd的HandleMessage方法 ? 1 ...

  4. 前端PHP入门-035-Session的实例

      登陆例子:(请注意一定要自己敲一遍,不要CV大法) 首先上一下成果图,激起同学们写的欲望,登录页如下: 点击登陆之后如下: 说明哦了,么问题.接下来自己实现一下. 首先数据库信息: 新建一个名为 ...

  5. 构造+分块思想 Codeforces Round #319 (Div. 1) C

    http://codeforces.com/contest/576/problem/C 题目大意: 给你一个曼哈顿距离的图,然后要求你找到一个链,链穿了所有的点 然后要求这链的长度<=25*10 ...

  6. 如何写出高性能SQL语句

    优化SQL查询:如何写出高性能SQL语句 1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生欀如一条SQL语句如果 ...

  7. datagrid导出数据

    //导出excel public function touzi_doExport() { $search=$_POST['search']; //接受前端传过来的数据 $this->succes ...

  8. 洛谷 Sorting a Three-Valued Sequence 三值的排序

    Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交换的 ...

  9. 【洛谷 P4219】 [BJOI2014]大融合(LCT)

    题目链接 维护子树信息向来不是\(LCT\)所擅长的,所以我没搞懂qwq 权当背背模板吧.Flash巨佬的blog里面写了虽然我没看懂. #include <cstdio> #define ...

  10. LOW逼三人组(二)----选择排序算法

    选择排序思路: 算法程序: def cal_time(func): # 装饰器 ,用来检测算法所执行的时间 def wrapper(*args,**kwargs): t1=time.time() re ...