Hadoop 集群 ( 第 9 期 ) MapReduce 初级案例 1 数据去重 数据去重 主要是为了掌握和利用并行化思想来对数据进行有意义的筛选 统计大 数据集上的数据种类个数 从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据 去重 下面就进入这个实例的 MapReduce 程序设计 1.

Size: px
Start display at page:

Download "Hadoop 集群 ( 第 9 期 ) MapReduce 初级案例 1 数据去重 数据去重 主要是为了掌握和利用并行化思想来对数据进行有意义的筛选 统计大 数据集上的数据种类个数 从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据 去重 下面就进入这个实例的 MapReduce 程序设计 1."

Transcription

1 细细品味 Hadoop Hadoop 集群 ( 第 9 期 ) 精华集锦 csaxp 虾皮工作室 年 6 月 4 日

2 Hadoop 集群 ( 第 9 期 ) MapReduce 初级案例 1 数据去重 数据去重 主要是为了掌握和利用并行化思想来对数据进行有意义的筛选 统计大 数据集上的数据种类个数 从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据 去重 下面就进入这个实例的 MapReduce 程序设计 1.1 实例描述 对数据文件中的数据进行去重 数据文件中的每行都是一个数据 样例输入如下所示 : 1)file1: a b c d a b c c 2)file2: b a b d a c d c 样例输出如下所示 : a b a 河北工业大学 软件工程与理论实验室编辑 : 虾皮 1

3 b b c d a b c c d 1.2 设计思路 数据去重的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次 我们自然而然会想到将同一个数据的所有记录都交给一台 reduce 机器, 无论这个数据出现多少次, 只要在最终结果中输出一次就可以了 具体就是 reduce 的输入应该以数据作为 key, 而对 value-list 则没有要求 当 reduce 接收到一个 <key,value-list> 时就直接将 key 复制到输出的 key 中, 并将 value 设置成空值 在 MapReduce 流程中,map 的输出 <key,value> 经过 shuffle 过程聚集成 <key,value-list> 后会交给 reduce 所以从设计好的 reduce 输入可以反推出 map 的输出 key 应为数据,value 任意 继续反推,map 输出数据的 key 为数据, 而在这个实例中每个数据代表输入文件中的一行内容, 所以 map 阶段要完成的任务就是在采用 Hadoop 默认的作业输入方式之后, 将 value 设置为 key, 并直接输出 ( 输出中的 value 任意 ) map 中的结果经过 shuffle 过程之后交给 reduce reduce 阶段不会管每个 key 有多少个 value, 它直接将输入的 key 复制为输出的 key, 并输出就可以了 ( 输出中的 value 被设置成空了 ) 1.3 程序代码 程序代码如下所示 : package com.hebut.mr; import java.io.ioexception; 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; import org.apache.hadoop.util.genericoptionsparser; 河北工业大学 软件工程与理论实验室编辑 : 虾皮 2

4 public class Dedup { //map 将输入中的 value 复制到输出数据的 key 上, 并直接输出 public static class Map extends Mapper<Object,Text,Text,Text>{ private static Text line=new Text();// 每行数据 // 实现 map 函数 public void map(object key,text value,context context) throws IOException,InterruptedException{ line=value; context.write(line, new Text("")); //reduce 将输入中的 key 复制到输出数据的 key 上, 并直接输出 public static class Reduce extends Reducer<Text,Text,Text,Text>{ // 实现 reduce 函数 public void reduce(text key,iterable<text> values,context context) throws IOException,InterruptedException{ context.write(key, new Text("")); public static void main(string[] args) throws Exception{ Configuration conf = new Configuration(); // 这句话很关键 conf.set("mapred.job.tracker", " :9001"); String[] ioargs=new String[]{"dedup_in","dedup_out"; String[] otherargs = new GenericOptionsParser(conf, ioargs).getremainingargs(); if (otherargs.length!= 2) { System.err.println("Usage: Data Deduplication <in> <out>"); System.exit(2); Job job = new Job(conf, "Data Deduplication"); job.setjarbyclass(dedup.class); // 设置 Map Combine 和 Reduce 处理类 job.setmapperclass(map.class); 河北工业大学 软件工程与理论实验室编辑 : 虾皮 3

5 job.setcombinerclass(reduce.class); job.setreducerclass(reduce.class); // 设置输出类型 job.setoutputkeyclass(text.class); job.setoutputvalueclass(text.class); // 设置输入和输出目录 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true)? 0 : 1); 1.4 代码结果 1) 准备测试数据 通过 Eclipse 下面的 DFS Locations 在 /user/hadoop 目录下创建输入文件 dedup_in 文件夹 ( 备注 : dedup_out 不需要创建 ) 如图 所示, 已经成功创建 图 创建 dedup_in 图 上传 file*.txt 然后在本地建立两个 txt 文件, 通过 Eclipse 上传到 /user/hadoop/dedup_in 文件夹中, 两个 txt 文件的内容如 实例描述 那两个文件一样 如图 所示, 成功上传之后 从 SecureCRT 远处查看 Master.Hadoop 的也能证实我们上传的两个文件 查看两个文件的内容如图 所示 : 河北工业大学 软件工程与理论实验室编辑 : 虾皮 4

6 图 文件 file*.txt 内容 2) 查看运行结果这时我们右击 Eclipse 的 DFS Locations 中 /user/hadoop 文件夹进行刷新, 这时会发现多出一个 dedup_out 文件夹, 且里面有 3 个文件, 然后打开双其 part-r 文件, 会在 Eclipse 中间把内容显示出来 如图 所示 图 运行结果 此时, 你可以对比一下和我们之前预期的结果是否一致 2 数据排序 数据排序 是许多实际任务执行时要完成的第一项工作, 比如学生成绩评比 数据建 立索引等 这个实例和数据去重类似, 都是先对原始数据进行初步处理, 为进一步的数据 操作打好基础 下面进入这个示例 河北工业大学 软件工程与理论实验室编辑 : 虾皮 5

7 2.1 实例描述 对输入文件中数据进行排序 输入文件中的每行内容均为一个数字, 即一个数据 要求在输出中每行有两个间隔的数字, 其中, 第一个代表原始数据在原始数据集中的位次, 第二个代表原始数据 样例输入 : 1)file1: )file2: )file3: 样例输出 : 河北工业大学 软件工程与理论实验室编辑 : 虾皮 6

8 设计思路 这个实例仅仅要求对输入数据进行排序, 熟悉 MapReduce 过程的读者会很快想到在 MapReduce 过程中就有排序, 是否可以利用这个默认的排序, 而不需要自己再实现具体的排序呢? 答案是肯定的 但是在使用之前首先需要了解它的默认排序规则 它是按照 key 值进行排序的, 如果 key 为封装 int 的 IntWritable 类型, 那么 MapReduce 按照数字大小对 key 排序, 如果 key 为封装为 String 的 Text 类型, 那么 MapReduce 按照字典顺序对字符串排序 了解了这个细节, 我们就知道应该使用封装 int 的 IntWritable 型数据结构了 也就是在 map 中将读入的数据转化成 IntWritable 型, 然后作为 key 值输出 (value 任意 ) reduce 拿到 <key,value-list> 之后, 将输入的 key 作为 value 输出, 并根据 value-list 中元素的个数决定输出的次数 输出的 key( 即代码中的 linenum) 是一个全局变量, 它统计当前 key 的位次 需要注意的是这个程序中没有配置 Combiner, 也就是在 MapReduce 过程中不使用 Combiner 这主要是因为使用 map 和 reduce 就已经能够完成任务了 2.3 程序代码 程序代码如下所示 : package com.hebut.mr; import java.io.ioexception; 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; import org.apache.hadoop.util.genericoptionsparser; public class Sort { //map 将输入中的 value 化成 IntWritable 类型, 作为输出的 key public static class Map extends Mapper<Object,Text,IntWritable,IntWritable>{ 河北工业大学 软件工程与理论实验室编辑 : 虾皮 7

9 private static IntWritable data=new IntWritable(); // 实现 map 函数 public void map(object key,text value,context context) throws IOException,InterruptedException{ String line=value.tostring(); data.set(integer.parseint(line)); context.write(data, new IntWritable(1)); //reduce 将输入中的 key 复制到输出数据的 key 上, // 然后根据输入的 value list 中元素的个数决定 key 的输出次数 // 用全局 linenum 来代表 key 的位次 public static class Reduce extends Reducer<IntWritable,IntWritable,IntWritable,IntWritable>{ private static IntWritable linenum = new IntWritable(1); // 实现 reduce 函数 public void reduce(intwritable key,iterable<intwritable> values, Context context) throws IOException,InterruptedException{ for(intwritable val:values){ context.write(linenum, key); linenum = new IntWritable(linenum.get()+1); public static void main(string[] args) throws Exception{ Configuration conf = new Configuration(); // 这句话很关键 conf.set("mapred.job.tracker", " :9001"); String[] ioargs=new String[]{"sort_in","sort_out"; String[] otherargs = new GenericOptionsParser(conf, ioargs).getremainingargs(); if (otherargs.length!= 2) { System.err.println("Usage: Data Sort <in> <out>"); System.exit(2); 河北工业大学 软件工程与理论实验室编辑 : 虾皮 8

10 Job job = new Job(conf, "Data Sort"); job.setjarbyclass(sort.class); // 设置 Map 和 Reduce 处理类 job.setmapperclass(map.class); job.setreducerclass(reduce.class); // 设置输出类型 job.setoutputkeyclass(intwritable.class); job.setoutputvalueclass(intwritable.class); // 设置输入和输出目录 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true)? 0 : 1); 2.4 代码结果 1) 准备测试数据 通过 Eclipse 下面的 DFS Locations 在 /user/hadoop 目录下创建输入文件 sort_in 文件夹 ( 备注 : sort_out 不需要创建 ) 如图 所示, 已经成功创建 图 创建 sort_in 图 上传 file*.txt 然后在本地建立三个 txt 文件, 通过 Eclipse 上传到 /user/hadoop/sort_in 文件夹中, 三个 txt 文件的内容如 实例描述 那三个文件一样 如图 所示, 成功上传之后 从 SecureCRT 远处查看 Master.Hadoop 的也能证实我们上传的三个文件 河北工业大学 软件工程与理论实验室编辑 : 虾皮 9

11 查看两个文件的内容如图 所示 : 图 文件 file*.txt 内容 2) 查看运行结果这时我们右击 Eclipse 的 DFS Locations 中 /user/hadoop 文件夹进行刷新, 这时会发现多出一个 sort_out 文件夹, 且里面有 3 个文件, 然后打开双其 part-r 文件, 会在 Eclipse 中间把内容显示出来 如图 所示 图 运行结果 3 平均成绩 平均成绩 主要目的还是在重温经典 WordCount 例子, 可以说是在基础上的微变 化版, 该实例主要就是实现一个计算学生平均成绩的例子 河北工业大学 软件工程与理论实验室编辑 : 虾皮 10

12 3.1 实例描述 对输入文件中数据进行就算学生平均成绩 输入文件中的每行内容均为一个学生的姓名和他相应的成绩, 如果有多门学科, 则每门学科为一个文件 要求在输出中每行有两个间隔的数据, 其中, 第一个代表学生的姓名, 第二个代表其平均成绩 样本输入 : 1)math: 张三 88 李四 99 王五 66 赵六 77 2)china: 张三 78 李四 89 王五 96 赵六 67 3)english: 张三 80 李四 82 王五 84 赵六 86 样本输出 : 张三 82 李四 90 王五 82 赵六 设计思路 计算学生平均成绩是一个仿 WordCount 例子, 用来重温一下开发 MapReduce 程序的流程 程序包括两部分的内容 :Map 部分和 Reduce 部分, 分别实现了 map 和 reduce 的功能 Map 处理的是一个纯文本文件, 文件中存放的数据时每一行表示一个学生的姓名和他相应一科成绩 Mapper 处理的数据是由 InputFormat 分解过的数据集, 其中 InputFormat 的作用是将数据集切割成小数据集 InputSplit, 每一个 InputSlit 将由一个 Mapper 负责处理 此外,InputFormat 中还提供了一个 RecordReader 的实现, 并将一个 InputSplit 解析成 <key,value> 河北工业大学 软件工程与理论实验室编辑 : 虾皮 11

13 对提供给了 map 函数 InputFormat 的默认值是 TextInputFormat, 它针对文本文件, 按行将文本切割成 InputSlit, 并用 LineRecordReader 将 InputSplit 解析成 <key,value> 对,key 是行在文本中的位置,value 是文件中的一行 Map 的结果会通过 partion 分发到 Reducer,Reducer 做完 Reduce 操作后, 将通过以格式 OutputFormat 输出 Mapper 最终处理的结果对 <key,value>, 会送到 Reducer 中进行合并, 合并的时候, 有相同 key 的键 / 值对则送到同一个 Reducer 上 Reducer 是所有用户定制 Reducer 类地基础, 它的输入是 key 和这个 key 对应的所有 value 的一个迭代器, 同时还有 Reducer 的上下文 Reduce 的结果由 Reducer.Context 的 write 方法输出到文件中 3.3 程序代码 程序代码如下所示 : package com.hebut.mr; import java.io.ioexception; import java.util.iterator; 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.longwritable; 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.input.textinputformat; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; import org.apache.hadoop.mapreduce.lib.output.textoutputformat; import org.apache.hadoop.util.genericoptionsparser; public class Score { public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { // 实现 map 函数 public void map(longwritable key, Text value, Context context) throws IOException, InterruptedException { // 将输入的纯文本文件的数据转化成 String String line = value.tostring(); 河北工业大学 软件工程与理论实验室编辑 : 虾皮 12

14 // 将输入的数据首先按行进行分割 StringTokenizer tokenizerarticle = new StringTokenizer(line, "\n"); // 分别对每一行进行处理 while (tokenizerarticle.hasmoreelements()) { // 每行按空格划分 StringTokenizer tokenizerline = new StringTokenizer( tokenizerarticle.nexttoken()); String strname = tokenizerline.nexttoken();// 学生姓名部分 String strscore = tokenizerline.nexttoken();// 成绩部分 Text name = new Text(strName); int scoreint = Integer.parseInt(strScore); // 输出姓名和成绩 context.write(name, new IntWritable(scoreInt)); public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> { // 实现 reduce 函数 public void reduce(text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; int count = 0; Iterator<IntWritable> iterator = values.iterator(); while (iterator.hasnext()) { sum += iterator.next().get();// 计算总分 count++;// 统计总的科目数 int average = (int) sum / count;// 计算平均成绩 context.write(key, new IntWritable(average)); public static void main(string[] args) throws Exception { 河北工业大学 软件工程与理论实验室编辑 : 虾皮 13

15 Configuration conf = new Configuration(); // 这句话很关键 conf.set("mapred.job.tracker", " :9001"); String[] ioargs = new String[] { "score_in", "score_out" ; String[] otherargs = new GenericOptionsParser(conf, ioargs).getremainingargs(); if (otherargs.length!= 2) { System.err.println("Usage: Score Average <in> <out>"); System.exit(2); Job job = new Job(conf, "Score Average"); job.setjarbyclass(score.class); // 设置 Map Combine 和 Reduce 处理类 job.setmapperclass(map.class); job.setcombinerclass(reduce.class); job.setreducerclass(reduce.class); // 设置输出类型 job.setoutputkeyclass(text.class); job.setoutputvalueclass(intwritable.class); // 将输入的数据集分割成小数据块 splites, 提供一个 RecordReder 的实现 job.setinputformatclass(textinputformat.class); // 提供一个 RecordWriter 的实现, 负责数据输出 job.setoutputformatclass(textoutputformat.class); // 设置输入和输出目录 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true)? 0 : 1); 3.4 代码结果 1) 准备测试数据 通过 Eclipse 下面的 DFS Locations 在 /user/hadoop 目录下创建输入文件 score_in 文件夹 ( 备注 : score_out 不需要创建 ) 如图 所示, 已经成功创建 河北工业大学 软件工程与理论实验室编辑 : 虾皮 14

16 图 创建 score_in 图 上传三门分数 然后在本地建立三个 txt 文件, 通过 Eclipse 上传到 /user/hadoop/score_in 文件夹中, 三个 txt 文件的内容如 实例描述 那三个文件一样 如图 所示, 成功上传之后 备注 : 文本文件的编码为 UTF-8, 默认为 ANSI, 可以另存为时选择, 不然中文会出现乱码 从 SecureCRT 远处查看 Master.Hadoop 的也能证实我们上传的三个文件 查看三个文件的内容如图 所示 : 图 三门成绩的内容 河北工业大学 软件工程与理论实验室编辑 : 虾皮 15

17 2) 查看运行结果这时我们右击 Eclipse 的 DFS Locations 中 /user/hadoop 文件夹进行刷新, 这时会发现多出一个 score_out 文件夹, 且里面有 3 个文件, 然后打开双其 part-r 文件, 会在 Eclipse 中间把内容显示出来 如图 所示 图 运行结果 4 单表关联 前面的实例都是在数据上进行一些简单的处理, 为进一步的操作打基础 单表关联 这个实例要求从给出的数据中寻找所关心的数据, 它是对原始数据所包含信息的挖掘 下 面进入这个实例 4.1 实例描述 实例中给出 child-parent( 孩子 父母 ) 表, 要求输出 grandchild-grandparent( 孙子 爷奶 ) 表 样例输入如下所示 file: child Tom Tom Jone Jone Lucy Lucy Jack Jack Terry Terry Philip parent Lucy Jack Lucy Jack Mary Ben Alice Jesse Alice Jesse Terry 河北工业大学 软件工程与理论实验室编辑 : 虾皮 16

18 Philip Mark Mark Alma Terry Alma 家族树状关系谱 : 样例输出如下所示 file: 图 家族谱 grandchild Tom Tom Jone Jone Tom Tom Jone Jone Philip Philip Mark Mark grandparent Alice Jesse Alice Jesse Mary Ben Mary Ben Alice Jesse Alice Jesse 4.2 设计思路 分析这个实例, 显然需要进行单表连接, 连接的是左表的 parent 列和右表的 child 列, 且左表和右表是同一个表 连接结果中除去连接的两列就是所需要的结果 grandchild--grandparent 表 要用 MapReduce 解决这个实例, 首先应该考虑如何实现表的自连接 ; 其次就是连接列的设置 ; 最后是结果的整理 考虑到 MapReduce 的 shuffle 过程会将相同的 key 会连接在一起, 所以可以将 map 结果的 key 设置成待连接的列, 然后列中相同的值就自然会连接在一起了 再与最开始的分析联系起来 : 要连接的是左表的 parent 列和右表的 child 列, 且左表和右表是同一个表, 所以在 map 河北工业大学 软件工程与理论实验室编辑 : 虾皮 17

19 阶段将读入数据分割成 child 和 parent 之后, 会将 parent 设置成 key,child 设置成 value 进行输出, 并作为左表 ; 再将同一对 child 和 parent 中的 child 设置成 key,parent 设置成 value 进行输出, 作为右表 为了区分输出中的左右表, 需要在输出的 value 中再加上左右表的信息, 比如在 value 的 String 最开始处加上字符 1 表示左表, 加上字符 2 表示右表 这样在 map 的结果中就形成了左表和右表, 然后在 shuffle 过程中完成连接 reduce 接收到连接的结果, 其中每个 key 的 value-list 就包含了 grandchild--grandparent 关系 取出每个 key 的 value-list 进行解析, 将左表中的 child 放入一个数组, 右表中的 parent 放入一个数组, 然后对两个数组求笛卡尔积就是最后的结果了 4.3 程序代码 程序代码如下所示 package com.hebut.mr; import java.io.ioexception; import java.util.*; 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; import org.apache.hadoop.util.genericoptionsparser; public class STjoin { public static int time = 0; /* * map 将输出分割 child 和 parent, 然后正序输出一次作为右表, * 反序输出一次作为左表, 需要注意的是在输出的 value 中必须 * 加上左右表的区别标识 */ public static class Map extends Mapper<Object, Text, Text, Text> { // 实现 map 函数 public void map(object key, Text value, Context context) throws IOException, InterruptedException { 河北工业大学 软件工程与理论实验室编辑 : 虾皮 18

20 String childname = new String();// 孩子名称 String parentname = new String();// 父母名称 String relationtype = new String();// 左右表标识 // 输入的一行预处理文本 StringTokenizer itr=new StringTokenizer(value.toString()); String[] values=new String[2]; int i=0; while(itr.hasmoretokens()){ values[i]=itr.nexttoken(); i++; if (values[0].compareto("child")!= 0) { childname = values[0]; parentname = values[1]; // 输出左表 relationtype = "1"; context.write(new Text(values[1]), new Text(relationtype + "+"+ childname + "+" + parentname)); // 输出右表 relationtype = "2"; context.write(new Text(values[0]), new Text(relationtype + "+"+ childname + "+" + parentname)); public static class Reduce extends Reducer<Text, Text, Text, Text> { // 实现 reduce 函数 public void reduce(text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { // 输出表头 if (0 == time) { context.write(new Text("grandchild"), new Text("grandparent")); time++; int grandchildnum = 0; 河北工业大学 软件工程与理论实验室编辑 : 虾皮 19

21 String[] grandchild = new String[10]; int grandparentnum = 0; String[] grandparent = new String[10]; Iterator ite = values.iterator(); while (ite.hasnext()) { String record = ite.next().tostring(); int len = record.length(); int i = 2; if (0 == len) { continue; // 取得左右表标识 char relationtype = record.charat(0); // 定义孩子和父母变量 String childname = new String(); String parentname = new String(); // 获取 value list 中 value 的 child while (record.charat(i)!= '+') { childname += record.charat(i); i++; i = i + 1; // 获取 value list 中 value 的 parent while (i < len) { parentname += record.charat(i); i++; // 左表, 取出 child 放入 grandchildren if ('1' == relationtype) { grandchild[grandchildnum] = childname; grandchildnum++; // 右表, 取出 parent 放入 grandparent if ('2' == relationtype) { grandparent[grandparentnum] = parentname; grandparentnum++; 河北工业大学 软件工程与理论实验室编辑 : 虾皮 20

22 // grandchild 和 grandparent 数组求笛卡尔儿积 if (0!= grandchildnum && 0!= grandparentnum) { for (int m = 0; m < grandchildnum; m++) { for (int n = 0; n < grandparentnum; n++) { // 输出结果 context.write(new Text(grandchild[m]), new Text( grandparent[n])); public static void main(string[] args) throws Exception { Configuration conf = new Configuration(); // 这句话很关键 conf.set("mapred.job.tracker", " :9001"); String[] ioargs = new String[] { "STjoin_in", "STjoin_out" ; String[] otherargs = new GenericOptionsParser(conf, ioargs).getremainingargs(); if (otherargs.length!= 2) { System.err.println("Usage: Single Table Join <in> <out>"); System.exit(2); Job job = new Job(conf, "Single Table Join"); job.setjarbyclass(stjoin.class); // 设置 Map 和 Reduce 处理类 job.setmapperclass(map.class); job.setreducerclass(reduce.class); // 设置输出类型 job.setoutputkeyclass(text.class); job.setoutputvalueclass(text.class); // 设置输入和输出目录 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true)? 0 : 1); 河北工业大学 软件工程与理论实验室编辑 : 虾皮 21

23 4.4 代码结果 1) 准备测试数据 通过 Eclipse 下面的 DFS Locations 在 /user/hadoop 目录下创建输入文件 STjoin_in 文件夹 ( 备注 : STjoin_out 不需要创建 ) 如图 所示, 已经成功创建 图 创建 STjoin_in 图 上传 child-parent 表 然后在本地建立一个 txt 文件, 通过 Eclipse 上传到 /user/hadoop/stjoin_in 文件夹中, 一个 txt 文件的内容如 实例描述 那个文件一样 如图 所示, 成功上传之后 从 SecureCRT 远处查看 Master.Hadoop 的也能证实我们上传的文件, 显示其内容如图 所示 : 图 表 child-parent 内容 河北工业大学 软件工程与理论实验室编辑 : 虾皮 22

24 2) 运行详解 (1)Map 处理 : map 函数输出结果如下所示 child parent 忽略此行 Tom Lucy <Lucy,1+Tom+Lucy> <Tom,2+Tom+Lucy > Tom Jack <Jack,1+Tom+Jack> <Tom,2+Tom+Jack> Jone Lucy <Lucy,1+Jone+Lucy> <Jone,2+Jone+Lucy> Jone Jack <Jack,1+Jone+Jack> <Jone,2+Jone+Jack> Lucy Mary <Mary,1+Lucy+Mary> <Lucy,2+Lucy+Mary> Lucy Ben <Ben,1+Lucy+Ben> <Lucy,2+Lucy+Ben> Jack Alice <Alice,1+Jack+Alice> <Jack,2+Jack+Alice> Jack Jesse <Jesse,1+Jack+Jesse> <Jack,2+Jack+Jesse> Terry Alice <Alice,1+Terry+Alice> <Terry,2+Terry+Alice> Terry Jesse <Jesse,1+Terry+Jesse> <Terry,2+Terry+Jesse> Philip Terry <Terry,1+Philip+Terry> <Philip,2+Philip+Terry> Philip Alma <Alma,1+Philip+Alma> <Philip,2+Philip+Alma> Mark Terry <Terry,1+Mark+Terry> <Mark,2+Mark+Terry> Mark Alma <Alma,1+Mark+Alma> <Mark,2+Mark+Alma> (2)Shuffle 处理在 shuffle 过程中完成连接 map 函数输出 排序结果 shuffle 连接 <Lucy,1+Tom+Lucy> <Tom,2+Tom+Lucy> <Jack,1+Tom+Jack> <Tom,2+Tom+Jack> <Lucy,1+Jone+Lucy> <Jone,2+Jone+Lucy> <Alice,1+Jack+Alice> <Alice,1+Terry+Alice> <Alma,1+Philip+Alma> <Alma,1+Mark+Alma> <Ben,1+Lucy+Ben> <Jack,1+Tom+Jack> <Alice,1+Jack+Alice, 1+Terry+Alice, 1+Philip+Alma, 1+Mark+Alma > <Ben,1+Lucy+Ben> <Jack,1+Tom+Jack, 河北工业大学 软件工程与理论实验室编辑 : 虾皮 23

25 <Jack,1+Jone+Jack> <Jone,2+Jone+Jack> <Mary,1+Lucy+Mary> <Lucy,2+Lucy+Mary> <Ben,1+Lucy+Ben> <Lucy,2+Lucy+Ben> <Alice,1+Jack+Alice> <Jack,2+Jack+Alice> <Jesse,1+Jack+Jesse> <Jack,2+Jack+Jesse> <Alice,1+Terry+Alice> <Terry,2+Terry+Alice> <Jesse,1+Terry+Jesse> <Terry,2+Terry+Jesse> <Terry,1+Philip+Terry> <Philip,2+Philip+Terry> <Alma,1+Philip+Alma> <Philip,2+Philip+Alma> <Terry,1+Mark+Terry> <Mark,2+Mark+Terry> <Alma,1+Mark+Alma> <Mark,2+Mark+Alma> <Jack,1+Jone+Jack> <Jack,2+Jack+Alice> <Jack,2+Jack+Jesse> <Jesse,1+Jack+Jesse> <Jesse,1+Terry+Jesse> <Jone,2+Jone+Lucy> <Jone,2+Jone+Jack> <Lucy,1+Tom+Lucy> <Lucy,1+Jone+Lucy> <Lucy,2+Lucy+Mary> <Lucy,2+Lucy+Ben> <Mary,1+Lucy+Mary> <Mark,2+Mark+Terry> <Mark,2+Mark+Alma> <Philip,2+Philip+Terry> <Philip,2+Philip+Alma> <Terry,2+Terry+Alice> <Terry,2+Terry+Jesse> <Terry,1+Philip+Terry> <Terry,1+Mark+Terry> <Tom,2+Tom+Lucy> <Tom,2+Tom+Jack> 1+Jone+Jack, 2+Jack+Alice, 2+Jack+Jesse > <Jesse,1+Jack+Jesse, 1+Terry+Jesse > <Jone,2+Jone+Lucy, 2+Jone+Jack> <Lucy,1+Tom+Lucy, 1+Jone+Lucy, 2+Lucy+Mary, 2+Lucy+Ben> <Mary,1+Lucy+Mary, 2+Mark+Terry, 2+Mark+Alma> <Philip,2+Philip+Terry, 2+Philip+Alma> <Terry,2+Terry+Alice, 2+Terry+Jesse, 1+Philip+Terry, 1+Mark+Terry> <Tom,2+Tom+Lucy, 2+Tom+Jack> (3)Reduce 处理首先由语句 0!= grandchildnum && 0!= grandparentnum 得知, 只要在 value-list 中没有左表或者右表, 则不会做处理, 可以根据这条规则去除无效的 shuffle 连接 无效的 shuffle 连接 <Alice,1+Jack+Alice, 1+Terry+Alice, 1+Philip+Alma, 1+Mark+Alma > <Ben,1+Lucy+Ben> <Jesse,1+Jack+Jesse, 1+Terry+Jesse > <Jone,2+Jone+Lucy, 2+Jone+Jack> <Mary,1+Lucy+Mary, 2+Mark+Terry, 2+Mark+Alma> <Philip,2+Philip+Terry, 2+Philip+Alma> <Tom,2+Tom+Lucy, 2+Tom+Jack> 有效的 shuffle 连接 <Jack,1+Tom+Jack, 1+Jone+Jack, 2+Jack+Alice, 2+Jack+Jesse > <Lucy,1+Tom+Lucy, 1+Jone+Lucy, 2+Lucy+Mary, 2+Lucy+Ben> <Terry,2+Terry+Alice, 2+Terry+Jesse, 1+Philip+Terry, 1+Mark+Terry> 河北工业大学 软件工程与理论实验室编辑 : 虾皮 24

26 然后根据下面语句进一步对有效的 shuffle 连接做处理 // 左表, 取出 child 放入 grandchildren if ('1' == relationtype) { grandchild[grandchildnum] = childname; grandchildnum++; // 右表, 取出 parent 放入 grandparent if ('2' == relationtype) { grandparent[grandparentnum] = parentname; grandparentnum++; 针对一条数据进行分析 : <Jack,1+Tom+Jack, 1+Jone+Jack, 2+Jack+Alice, 2+Jack+Jesse > 分析结果 : 左表用 字符 1 表示, 右表用 字符 2 表示, 上面的 <key,value-list> 中的 key 表示左表与右表的连接键 而 value-list 表示以 key 连接的左表与右表的相关数据 根据上面针对左表与右表不同的处理规则, 取得两个数组的数据如下所示 : grandchild grandparent Tom Jone(grandchild[grandchildnum] = childname;) Alice Jesse(grandparent[grandparentnum] = parentname;) 然后根据下面语句进行处理 for (int m = 0; m < grandchildnum; m++) { for (int n = 0; n < grandparentnum; n++) { context.write(new Text(grandchild[m]), new Text(grandparent[n])); 处理结果如下面所示 : Tom Jesse Tom Alice Jone Jesse Jone Alice Tom Jone Jesse Alice 河北工业大学 软件工程与理论实验室编辑 : 虾皮 25

27 其他的有效 shuffle 连接处理都是如此 3) 查看运行结果这时我们右击 Eclipse 的 DFS Locations 中 /user/hadoop 文件夹进行刷新, 这时会发现多出一个 STjoin_out 文件夹, 且里面有 3 个文件, 然后打开双其 part-r 文件, 会在 Eclipse 中间把内容显示出来 如图 所示 图 运行结果 5 多表关联 多表关联和单表关联类似, 它也是通过对原始数据进行一定的处理, 从其中挖掘出关心 的信息 下面进入这个实例 5.1 实例描述 输入是两个文件, 一个代表工厂表, 包含工厂名列和地址编号列 ; 另一个代表地址表, 包含地址名列和地址编号列 要求从输入数据中找出工厂名和地址名的对应关系, 输出 工厂名 地址名 表 样例输入如下所示 1)factory: factoryname addressed Beijing Red Star 1 Shenzhen Thunder 3 Guangzhou Honda 2 Beijing Rising 1 Guangzhou Development Bank 2 Tencent 3 Back of Beijing 1 2)address: 河北工业大学 软件工程与理论实验室编辑 : 虾皮 26

28 addressid addressname 1 Beijing 2 Guangzhou 3 Shenzhen 4 Xian 样例输出如下所示 factoryname addressname Back of Beijing Beijing Beijing Red Star Beijing Beijing Rising Beijing Guangzhou Development Bank Guangzhou Guangzhou Honda Guangzhou Shenzhen Thunder Shenzhen Tencent Shenzhen 5.2 设计思路 多表关联和单表关联相似, 都类似于数据库中的自然连接 相比单表关联, 多表关联的左右表和连接列更加清楚 所以可以采用和单表关联的相同的处理方式,map 识别出输入的行属于哪个表之后, 对其进行分割, 将连接的列值保存在 key 中, 另一列和左右表标识保存在 value 中, 然后输出 reduce 拿到连接结果之后, 解析 value 内容, 根据标志将左右表内容分开存放, 然后求笛卡尔积, 最后直接输出 这个实例的具体分析参考单表关联实例 下面给出代码 5.3 程序代码 程序代码如下所示 : package com.hebut.mr; import java.io.ioexception; import java.util.*; 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; 河北工业大学 软件工程与理论实验室编辑 : 虾皮 27

29 import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.fileinputformat; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; import org.apache.hadoop.util.genericoptionsparser; public class MTjoin { public static int time = 0; /* * 在 map 中先区分输入行属于左表还是右表, 然后对两列值进行分割, * 保存连接列在 key 值, 剩余列和左右表标志在 value 中, 最后输出 */ public static class Map extends Mapper<Object, Text, Text, Text> { // 实现 map 函数 public void map(object key, Text value, Context context) throws IOException, InterruptedException { String line = value.tostring();// 每行文件 String relationtype = new String();// 左右表标识 // 输入文件首行, 不处理 if (line.contains("factoryname") == true line.contains("addressed") == true) { return; // 输入的一行预处理文本 StringTokenizer itr = new StringTokenizer(line); String mapkey = new String(); String mapvalue = new String(); int i = 0; while (itr.hasmoretokens()) { // 先读取一个单词 String token = itr.nexttoken(); // 判断该地址 ID 就把存到 values[0] if (token.charat(0) >= '0' && token.charat(0) <= '9') { mapkey = token; if (i > 0) { relationtype = "1"; else { relationtype = "2"; continue; 河北工业大学 软件工程与理论实验室编辑 : 虾皮 28

30 // 存工厂名 mapvalue += token + " "; i++; // 输出左右表 context.write(new Text(mapkey), new Text(relationtype + "+" + mapvalue)); /* * reduce 解析 map 输出, 将 value 中数据按照左右表分别保存, * 然后求出笛卡尔积, 并输出 */ public static class Reduce extends Reducer<Text, Text, Text, Text> { // 实现 reduce 函数 public void reduce(text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { // 输出表头 if (0 == time) { context.write(new Text("factoryname"), new Text("addressname")); time++; int factorynum = 0; String[] factory = new String[10]; int addressnum = 0; String[] address = new String[10]; Iterator ite = values.iterator(); while (ite.hasnext()) { String record = ite.next().tostring(); int len = record.length(); int i = 2; if (0 == len) { continue; // 取得左右表标识 河北工业大学 软件工程与理论实验室编辑 : 虾皮 29

31 char relationtype = record.charat(0); // 左表 if ('1' == relationtype) { factory[factorynum] = record.substring(i); factorynum++; // 右表 if ('2' == relationtype) { address[addressnum] = record.substring(i); addressnum++; // 求笛卡尔积 if (0!= factorynum && 0!= addressnum) { for (int m = 0; m < factorynum; m++) { for (int n = 0; n < addressnum; n++) { // 输出结果 context.write(new Text(factory[m]), new Text(address[n])); public static void main(string[] args) throws Exception { Configuration conf = new Configuration(); // 这句话很关键 conf.set("mapred.job.tracker", " :9001"); String[] ioargs = new String[] { "MTjoin_in", "MTjoin_out" ; String[] otherargs = new GenericOptionsParser(conf, ioargs).getremainingargs(); if (otherargs.length!= 2) { System.err.println("Usage: Multiple Table Join <in> <out>"); System.exit(2); Job job = new Job(conf, "Multiple Table Join"); 河北工业大学 软件工程与理论实验室编辑 : 虾皮 30

32 job.setjarbyclass(mtjoin.class); // 设置 Map 和 Reduce 处理类 job.setmapperclass(map.class); job.setreducerclass(reduce.class); // 设置输出类型 job.setoutputkeyclass(text.class); job.setoutputvalueclass(text.class); // 设置输入和输出目录 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true)? 0 : 1); 5.4 代码结果 1) 准备测试数据 通过 Eclipse 下面的 DFS Locations 在 /user/hadoop 目录下创建输入文件 MTjoin_in 文件夹 ( 备注 : MTjoin_out 不需要创建 ) 如图 所示, 已经成功创建 图 创建 MTjoin_in 图 上传两个数据表 然后在本地建立两个 txt 文件, 通过 Eclipse 上传到 /user/hadoop/mtjoin_in 文件夹中, 两个 txt 文件的内容如 实例描述 那两个文件一样 如图 所示, 成功上传之后 从 SecureCRT 远处查看 Master.Hadoop 的也能证实我们上传的两个文件 河北工业大学 软件工程与理论实验室编辑 : 虾皮 31

33 图 两个数据表的内容 2) 查看运行结果这时我们右击 Eclipse 的 DFS Locations 中 /user/hadoop 文件夹进行刷新, 这时会发现多出一个 MTjoin_out 文件夹, 且里面有 3 个文件, 然后打开双其 part-r 文件, 会在 Eclipse 中间把内容显示出来 如图 所示 图 运行结果 6 倒排索引 倒排索引 是文档检索系统中最常用的数据结构, 被广泛地应用于全文搜索引擎 它主要是用来存储某个单词 ( 或词组 ) 在一个文档或一组文档中的存储位置的映射, 即提供了一种根据内容来查找文档的方式 由于不是根据文档来确定文档所包含的内容, 而是进行相反的操作, 因而称为倒排索引 (Inverted Index) 6.1 实例描述 通常情况下, 倒排索引由一个单词 ( 或词组 ) 以及相关的文档列表组成, 文档列表中的 文档或者是标识文档的 ID 号, 或者是指文档所在位置的 URL, 如图 所示 河北工业大学 软件工程与理论实验室编辑 : 虾皮 32

34 图 倒排索引结构从图 可以看出, 单词 1 出现在 { 文档 1, 文档 4, 文档 13, 中, 单词 2 出现在 { 文档 3, 文档 5, 文档 15, 中, 而单词 3 出现在 { 文档 1, 文档 8, 文档 20, 中 在实际应用中, 还需要给每个文档添加一个权值, 用来指出每个文档与搜索内容的相关度, 如图 所示 图 添加权重的倒排索引最常用的是使用词频作为权重, 即记录单词在文档中出现的次数 以英文为例, 如图 所示, 索引文件中的 MapReduce 一行表示 : MapReduce 这个单词在文本 T0 中出现过 1 次,T1 中出现过 1 次,T2 中出现过 2 次 当搜索条件为 MapReduce is Simple 时, 对应的集合为 :{T0,T1,T2 {T0,T1 {T0,T1={T0,T1, 即文档 T0 和 T1 包含了所要索引的单词, 而且只有 T0 是连续的 图 倒排索引示例更复杂的权重还可能要记录单词在多少个文档中出现过, 以实现 TF-IDF(Term Frequency-Inverse Document Frequency) 算法, 或者考虑单词在文档中的位置信息 ( 单词是否出现在标题中, 反映了单词在文档中的重要性 ) 等 样例输入如下所示 河北工业大学 软件工程与理论实验室编辑 : 虾皮 33

35 1)file1: MapReduce is simple 2)file2: MapReduce is powerful is simple 3)file3: Hello MapReduce bye MapReduce 样例输出如下所示 MapReduce is simple powerful Hello bye file1.txt:1;file2.txt:1;file3.txt:2; file1.txt:1;file2.txt:2; file1.txt:1;file2.txt:1; file2.txt:1; file3.txt:1; file3.txt:1; 6.2 设计思路 实现 倒排索引 只要关注的信息为 : 单词 文档 URL 及词频, 如图 3-11 所示 但是在实现过程中, 索引文件的格式与图 会略有所不同, 以避免重写 OutPutFormat 类 下面根据 MapReduce 的处理过程给出倒排索引的设计思路 1)Map 过程首先使用默认的 TextInputFormat 类对输入文件进行处理, 得到文本中每行的偏移量及其内容 显然,Map 过程首先必须分析输入的 <key,value> 对, 得到倒排索引中需要的三个信息 : 单词 文档 URL 和词频, 如图 所示 <0, MapReduce is simple > Map MapReduce file1.txt 1 is file1.txt 1 simple file1.txt 1 <0, MapReduce is powerful is simple > Map MapReduce file2.txt 1 is file2.txt 1 powerful file2.txt 1 is file2.txt 1 simple file2.txt 1 <0, Hello MapReduce bye MapReduce > Map Hello file3.txt 1 MapReduce file3.txt 1 bye file3.txt 1 MapReduce file3.txt 1 图 Map 过程输入 / 输出 河北工业大学 软件工程与理论实验室编辑 : 虾皮 34

36 这里存在两个问题 : 第一,<key,value> 对只能有两个值, 在不使用 Hadoop 自定义数据类型的情况下, 需要根据情况将其中两个值合并成一个值, 作为 key 或 value 值 ; 第二, 通过一个 Reduce 过程无法同时完成词频统计和生成文档列表, 所以必须增加一个 Combine 过程完成词频统计 这里讲单词和 URL 组成 key 值 ( 如 MapReduce:file1.txt ), 将词频作为 value, 这样做的好处是可以利用 MapReduce 框架自带的 Map 端排序, 将同一文档的相同单词的词频组成列表, 传递给 Combine 过程, 实现类似于 WordCount 的功能 2)Combine 过程经过 map 方法处理后,Combine 过程将 key 值相同的 value 值累加, 得到一个单词在文档在文档中的词频, 如图 所示 如果直接将图 所示的输出作为 Reduce 过程的输入, 在 Shuffle 过程时将面临一个问题 : 所有具有相同单词的记录 ( 由单词 URL 和词频组成 ) 应该交由同一个 Reducer 处理, 但当前的 key 值无法保证这一点, 所以必须修改 key 值和 value 值 这次将单词作为 key 值,URL 和词频组成 value 值 ( 如 file1.txt:1 ) 这样做的好处是可以利用 MapReduce 框架默认的 HashPartitioner 类完成 Shuffle 过程, 将相同单词的所有记录发送给同一个 Reducer 进行处理 MapReduce:file1.txt list(1) is:file1.txt list(1) simple:file1.txt list(1) Combine MapReduce:file1.txt 1 is:file1.txt 1 simple:file1.txt 1 MapReduce:file2.txt list(1) is:file2.txt list(1,1) powerful:file2.txt list(1) simple:file2.txt list(1) Combine MapReduce:file2.txt 1 is:file2.txt 2 powerful:file2.txt 1 simple:file2.txt 1 Hello:file3.txt list(1) MapReduce:file3.txt list(1,1) bye:file3.txt list(1) Combine Hello:file3.txt 1 MapReduce:file3.txt 2 bye:file3.txt 1 图 Combine 过程输入 / 输出 3)Reduce 过程经过上述两个过程后,Reduce 过程只需将相同 key 值的 value 值组合成倒排索引文件所需的格式即可, 剩下的事情就可以直接交给 MapReduce 框架进行处理了 如图 所示 索引文件的内容除分隔符外与图 解释相同 4) 需要解决的问题本实例设计的倒排索引在文件数目上没有限制, 但是单词文件不宜过大 ( 具体值与默认 HDFS 块大小及相关配置有关 ), 要保证每个文件对应一个 split 否则, 由于 Reduce 过程没有进一步统计词频, 最终结果可能会出现词频未统计完全的单词 可以通过重写 InputFormat 类将每个文件为一个 split, 避免上述情况 或者执行两次 MapReduce, 第一次 MapReduce 用于统计词频, 第二次 MapReduce 用于生成倒排索引 除此之外, 还可以利用复合键值对等实现包含更多信息的倒排索引 河北工业大学 软件工程与理论实验室编辑 : 虾皮 35

37 图 Reduce 过程输入 / 输出 6.3 程序代码 程序代码如下所示 : package com.hebut.mr; 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.input.filesplit; import org.apache.hadoop.mapreduce.lib.output.fileoutputformat; import org.apache.hadoop.util.genericoptionsparser; public class InvertedIndex { public static class Map extends Mapper<Object, Text, Text, Text> { private Text keyinfo = new Text(); // 存储单词和 URL 组合 private Text valueinfo = new Text(); // 存储词频 private FileSplit split; // 存储 Split 对象 河北工业大学 软件工程与理论实验室编辑 : 虾皮 36

38 // 实现 map 函数 public void map(object key, Text value, Context context) throws IOException, InterruptedException { // 获得 <key,value> 对所属的 FileSplit 对象 split = (FileSplit) context.getinputsplit(); StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasmoretokens()) { // key 值由单词和 URL 组成, 如 MapReduce:file1.txt // 获取文件的完整路径 // keyinfo.set(itr.nexttoken()+":"+split.getpath().tostring()); // 这里为了好看, 只获取文件的名称 int splitindex = split.getpath().tostring().indexof("file"); keyinfo.set(itr.nexttoken() + ":" + split.getpath().tostring().substring(splitindex)); // 词频初始化为 1 valueinfo.set("1"); context.write(keyinfo, valueinfo); public static class Combine extends Reducer<Text, Text, Text, Text> { private Text info = new Text(); // 实现 reduce 函数 public void reduce(text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { // 统计词频 int sum = 0; for (Text value : values) { sum += Integer.parseInt(value.toString()); int splitindex = key.tostring().indexof(":"); // 重新设置 value 值由 URL 和词频组成 河北工业大学 软件工程与理论实验室编辑 : 虾皮 37

39 info.set(key.tostring().substring(splitindex + 1) + ":" + sum); // 重新设置 key 值为单词 key.set(key.tostring().substring(0, splitindex)); context.write(key, info); public static class Reduce extends Reducer<Text, Text, Text, Text> { private Text result = new Text(); // 实现 reduce 函数 public void reduce(text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { // 生成文档列表 String filelist = new String(); for (Text value : values) { filelist += value.tostring() + ";"; result.set(filelist); context.write(key, result); public static void main(string[] args) throws Exception { Configuration conf = new Configuration(); // 这句话很关键 conf.set("mapred.job.tracker", " :9001"); String[] ioargs = new String[] { "index_in", "index_out" ; String[] otherargs = new GenericOptionsParser(conf, ioargs).getremainingargs(); if (otherargs.length!= 2) { System.err.println("Usage: Inverted Index <in> <out>"); System.exit(2); Job job = new Job(conf, "Inverted Index"); 河北工业大学 软件工程与理论实验室编辑 : 虾皮 38

40 job.setjarbyclass(invertedindex.class); // 设置 Map Combine 和 Reduce 处理类 job.setmapperclass(map.class); job.setcombinerclass(combine.class); job.setreducerclass(reduce.class); // 设置 Map 输出类型 job.setmapoutputkeyclass(text.class); job.setmapoutputvalueclass(text.class); // 设置 Reduce 输出类型 job.setoutputkeyclass(text.class); job.setoutputvalueclass(text.class); // 设置输入和输出目录 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true)? 0 : 1); 6.4 代码结果 1) 准备测试数据 通过 Eclipse 下面的 DFS Locations 在 /user/hadoop 目录下创建输入文件 index_in 文件夹 ( 备注 : index_out 不需要创建 ) 如图 所示, 已经成功创建 图 创建 index_in 图 上传 file*.txt 河北工业大学 软件工程与理论实验室编辑 : 虾皮 39

41 然后在本地建立三个 txt 文件, 通过 Eclipse 上传到 /user/hadoop/index_in 文件夹中, 三个 txt 文件的内容如 实例描述 那三个文件一样 如图 所示, 成功上传之后 从 SecureCRT 远处查看 Master.Hadoop 的也能证实我们上传的三个文件 图 三个 file*.txt 的内容 2) 查看运行结果这时我们右击 Eclipse 的 DFS Locations 中 /user/hadoop 文件夹进行刷新, 这时会发现多出一个 index_out 文件夹, 且里面有 3 个文件, 然后打开双其 part-r 文件, 会在 Eclipse 中间把内容显示出来 如图 所示 图 运行结果 河北工业大学 软件工程与理论实验室编辑 : 虾皮 40

42 编者简介 基本信息姓名 : 解耀伟性别 : 男 笔 名 : 虾皮 民 族 : 汉 学 历 : 研究生 专 业 : 计算机应用技术 电子信箱 : xieyaowei1986@163.com 学校 : 河北工业大学 (211 工程 ) 求职意向 希望在 IT 行业从事软件研发等工作 编程语言 Java C# C ExtJS Flex 汇编 PHP VB, 熟练程度由左到右逐级减弱 个人经历 大学期间 1) 担任职务 : 学生会生活部部长 生活委员 团支书 2) 获得奖项 : 二等奖学金 (2 次 ) 三好学生(1 次 ) 研究生期间 1) 担任职务 : 班长 2) 获得奖项 : 优秀班干部 (1 次 ) 工作经历 实验室项目 : 国家 863 计划项目 1 项 ; 国家技术基础专项 2 项 ; 河北省技术专项 1 项 研究生课题 : 基于 Hadoop 分布式搜索引擎研究 个人评价 性格开朗, 善于与人沟通, 上进心强, 品德优秀, 吃苦耐劳, 喜欢团队合作, 能积极服从上级的安排 寄言 相信您的信任与我的能力将为我们带来共同的成功

43 参考文献 感谢以下文章的编写作者, 没有你们的铺路, 我或许会走得很艰难, 参考不分先后, 贡 献同等珍贵 1 Hadoop 实战 陆嘉恒 机械工业出版社 2 实战 Hadoop 刘鹏 电子工业出版社

目录 1 本期内容 数据去重 实例描述 设计思路 程序代码 代码结果 数据排序 实例描述 设计思路 程序代码.

目录 1 本期内容 数据去重 实例描述 设计思路 程序代码 代码结果 数据排序 实例描述 设计思路 程序代码. 细细品味 Hadoop Hadoop 集群 ( 第 9 期 ) 精华集锦 csaxp http://www.xiapistudio.com/ 2012 年 3 月 9 日 目录 1 本期内容... 2 1.1 数据去重... 2 1.1.1 实例描述... 2 1.1.2 设计思路... 3 1.1.3 程序代码... 3 1.1.4 代码结果... 5 1.2 数据排序... 7 1.2.1 实例描述...

More information

Hadoop 集 群 ( 第 6 期 ) WordCount 运 行 详 解 1 MapReduce 理 论 简 介 1.1 MapReduce 编 程 模 型 MapReduce 采 用 分 而 治 之 的 思 想, 把 对 大 规 模 数 据 集 的 操 作, 分 发 给 一 个 主 节 点 管

Hadoop 集 群 ( 第 6 期 ) WordCount 运 行 详 解 1 MapReduce 理 论 简 介 1.1 MapReduce 编 程 模 型 MapReduce 采 用 分 而 治 之 的 思 想, 把 对 大 规 模 数 据 集 的 操 作, 分 发 给 一 个 主 节 点 管 细 细 品 味 Hadoop Hadoop 集 群 ( 第 6 期 ) 精 华 集 锦 csaxp 虾 皮 工 作 室 http://www.cnblogs.com/xia520pi/ 2012 年 5 月 15 日 Hadoop 集 群 ( 第 6 期 ) WordCount 运 行 详 解 1 MapReduce 理 论 简 介 1.1 MapReduce 编 程 模 型 MapReduce 采

More information

三种方法实现Hadoop(MapReduce)全局排序(1)

三种方法实现Hadoop(MapReduce)全局排序(1) 三种方法实现 Hadoop(MapReduce) 全局排序 () 三种方法实现 Hadoop(MapReduce) 全局排序 () 我们可能会有些需求要求 MapReduce 的输出全局有序, 这里说的有序是指 Key 全局有序 但是我们知道,MapReduce 默认只是保证同一个分区内的 Key 是有序的, 但是不保证全局有序 基于此, 本文提供三种方法来对 MapReduce 的输出进行全局排序

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

目录 1 本期内容 MapReduce 理论简介 MapReduce 编程模型 MapReduce 处理过程 运行 WordCount 程序 准备工作 运行例子

目录 1 本期内容 MapReduce 理论简介 MapReduce 编程模型 MapReduce 处理过程 运行 WordCount 程序 准备工作 运行例子 细细品味 Hadoop Hadoop 集群 ( 第 6 期 ) 精华集锦 csaxp http://www.xiapistudio.com/ 2012 年 3 月 1 日 目录 1 本期内容... 2 1.1 MapReduce 理论简介... 2 1.1.1 MapReduce 编程模型... 2 1.1.2 MapReduce 处理过程... 2 1.2 运行 WordCount 程序... 3

More information

Java ¿ª·¢ 2.0: Óà Hadoop MapReduce ½øÐдóÊý¾Ý·ÖÎö

Java ¿ª·¢ 2.0: Óà Hadoop MapReduce ½øÐдóÊý¾Ý·ÖÎö 中 文 登 录 ( 或 注 册 ) 技 术 主 题 软 件 下 载 社 区 技 术 讲 座 搜 索 developerworks developerworks 技 术 主 题 Java technology 文 档 库 Java 开 发 2.0: 用 Hadoop MapReduce 进 行 大 数 据 分 析 成 堆 的 数 据 如 何 变 成 信 息 金 矿 Andrew Glover, 作 家

More information

三种方法实现Hadoop(MapReduce)全局排序(2)

三种方法实现Hadoop(MapReduce)全局排序(2) 三种方法实现 Hadoop(MapReduce) 全局排序 (2) 我在前面的文章介绍了 MapReduce 中两种全排序的方法及其实现 但是上面的两种方法都是有很大的局限性 : 方法一在数据量很大的时候会出现 OOM 问题 ; 方法二虽然能够将数据分散到多个 Reduce 中, 但是问题也很明显 : 我们必须手动地找到各个 Reduce 的分界点, 尽量使得分散到每个 Reduce 的数据量均衡

More information

目录 1 本期内容 Hadoop 开发环境简介 Hadoop 集群简介 Windows 开发简介 Hadoop Eclipse 简介和使用 Eclipse 插件介绍 Hadoo

目录 1 本期内容 Hadoop 开发环境简介 Hadoop 集群简介 Windows 开发简介 Hadoop Eclipse 简介和使用 Eclipse 插件介绍 Hadoo 细细品味 Hadoop Hadoop 集群 ( 第 7 期 ) 精华集锦 csaxp http://www.xiapistudio.com/ 2012 年 3 月 3 日 目录 1 本期内容... 2 1.1 Hadoop 开发环境简介... 2 1.1.1 Hadoop 集群简介... 2 1.1.2 Windows 开发简介... 2 1.2 Hadoop Eclipse 简介和使用... 2

More information

Hadoop&Spark解决二次排序问题(Hadoop篇)

Hadoop&Spark解决二次排序问题(Hadoop篇) Hadoop&Spark 解决二次排序问题 (Spark 篇 ) 问题描述 二次排序就是 key 之间有序, 而且每个 Key 对应的 value 也是有序的 ; 也就是对 MapReduce 的输出 (KEY, Value(v 1,v 2,v 3,...,v n )) 中的 Value(v 1,v 2,v 3,...,v n ) 值进行排序 ( 升序或者降序 ), 使得 Value(s 1,s 2,s

More information

关于天云趋势 天云趋势由宽带资本和趋势科技共同投资成立于 2010 年 3 月 趋势科技是 Hadoop 的重度使用者 : 2006 年开始使用, 用于处理网页和邮件服务器评级 五个数据中心, 近 1000 个节点, 最大集群约 500 台服务器 日均处理 3.6T 日志数据 亚洲最早, 也是最大的

关于天云趋势 天云趋势由宽带资本和趋势科技共同投资成立于 2010 年 3 月 趋势科技是 Hadoop 的重度使用者 : 2006 年开始使用, 用于处理网页和邮件服务器评级 五个数据中心, 近 1000 个节点, 最大集群约 500 台服务器 日均处理 3.6T 日志数据 亚洲最早, 也是最大的 TCloud Computing Hadoop 开发者培训 关于天云趋势 天云趋势由宽带资本和趋势科技共同投资成立于 2010 年 3 月 趋势科技是 Hadoop 的重度使用者 : 2006 年开始使用, 用于处理网页和邮件服务器评级 五个数据中心, 近 1000 个节点, 最大集群约 500 台服务器 日均处理 3.6T 日志数据 亚洲最早, 也是最大的代码贡献者 HBase 0.92 新功能的主要开发者

More information

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO CHAPTER 使用 Hadoop 打造自己的雲 8 8.3 測試 Hadoop 雲端系統 4 Nodes Hadoop Map Reduce Hadoop WordCount 4 Nodes Hadoop Map/Reduce $HADOOP_HOME /home/ hadoop/hadoop-0.20.2 wordcount echo $ mkdir wordcount $ cd wordcount

More information

7521,WARD,SALESMAN,7698,22-2 月 -81,1250,500, ,JONES,MANAGER,7839,02-4 月 -81,2975,, ,MARTIN,SALESMAN,7698,28-9 月 -81,1250,1400, ,BLAK

7521,WARD,SALESMAN,7698,22-2 月 -81,1250,500, ,JONES,MANAGER,7839,02-4 月 -81,2975,, ,MARTIN,SALESMAN,7698,28-9 月 -81,1250,1400, ,BLAK MapReduce 应用案例 本文版权归作者和博客园共有, 欢迎转载, 但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接, 博主为石山园, 博客地址为 http://www.cnblogs.com/shishanyuan 该系列课程是应邀实验楼整理编写的, 这里需要赞一下实验楼提供了学习的新方式, 可以边看博客边上机实验, 课程地址为 https://www.shiyanlou.com/courses/237

More information

MapReduce

MapReduce MapReduce 陳威宇 Review Hadoop Hdfs Datanode Namenode files / blocks Data locality ( 在地運算 ) 2 Outline What is MapReduce Process flow Yarn Configuration Java programing 3 MapReduce Introduction Objective :

More information

前 言

前    言 分布式计算框架 MapReduce 本章重点 : MapReduce 编程模型 使用 MapReduce 开发常用的功能 本章目标 : 了解 MapReduce 是什么掌握 MapReduce 编程模型掌握 MapReduce 中常见核心 API 的编程掌握使用 MapReduce 开发常用的功能 Hadoop&Spark 大数据开发实战 本章任务 学习本章, 需要完成以下 个工作任务 请记录下来学习过程中所遇到的问题,

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

Microsoft Word - 第4章 MapReduce分布式计算框架.doc

Microsoft Word - 第4章 MapReduce分布式计算框架.doc 第 4 章 MapReduce 分布式计算框架 学习目标 u 理解 MapReduce 的核心思想 u 掌握 MapReduce 的编程模型 u 掌握 MapReduce 的工作原理 u 掌握 MapReduce 常见编程组件的使用 MapReduce 是 Hadoop 系统核心组件之一, 它是一种可用于大数据并行处理的计算模型 框架和平台, 主要解决海量数据的计算, 是目前分布式计算模型中应用较为广泛的一种,

More information

Microsoft PowerPoint - hbase_program(0201).ppt

Microsoft PowerPoint - hbase_program(0201).ppt TSMC 教育訓練課程 HBase Programming < V 0.20 > 王耀聰陳威宇 Jazz@nchc.org.tw waue@nchc.org.tw Outline HBase 程式編譯方法 HBase 程式設計 常用的 HBase API 說明實做 I/O 操作搭配 Map Reduce 運算 其他用法補充 其他專案 2 HBase 程式編譯方法 此篇介紹兩種編譯與執行 HBase

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

JavaIO.PDF

JavaIO.PDF O u t p u t S t ream j a v a. i o. O u t p u t S t r e a m w r i t e () f l u s h () c l o s e () public abstract void write(int b) throws IOException public void write(byte[] data) throws IOException

More information

Mac Java import com.apple.mrj.*;... public class MyFirstApp extends JFrame implements ActionListener, MRJAboutHandler, MRJQuitHandler {... public MyFirstApp() {... MRJApplicationUtils.registerAboutHandler(this);

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

投影片 1

投影片 1 Map-Reduce Programming 王耀聰陳威宇 jazz@nchc.org.tw waue@nchc.org.tw 國家高速網路與計算中心 (NCHC) 自由軟體實驗室 Outline 概念 程式基本框架及執行步驟方法 範例一 : Hadoop 的 Hello World => Word Count 說明 動手做 範例二 : 進階版 => Word Count 2 說明 動手做 2 程式基本框架

More information

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) 09 (File Processes) 9-1 9-2 (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) Java Servlet 9-1 Servlet (File Processes) Client Servlet Servlet Java Java (Stream)

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc Java C++ Pascal C# C# if if if for while do while foreach while do while C# 3.1.1 ; 3-1 ischeck Test() While ischeck while static bool ischeck = true; public static void Test() while (ischeck) ; ischeck

More information

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入 100 年 特 種 考 試 地 方 政 府 公 務 人 員 考 試 試 題 等 別 : 三 等 考 試 類 科 : 資 訊 處 理 科 目 : 系 統 分 析 與 設 計 一 請 參 考 下 列 旅 館 管 理 系 統 的 使 用 案 例 圖 (Use Case Diagram) 撰 寫 預 約 房 間 的 使 用 案 例 規 格 書 (Use Case Specification), 繪 出 入

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

More information

编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行

编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行 编写简单的 Mapreduce 程序并部署在 Hadoop2.2.0 上运行 经过几天的折腾, 终于配置好了 Hadoop2.2.0( 如何配置在 Linux 平台部署 Hadoop 请参见本博客 在 Fedora 上部署 Hadoop2.2.0 伪分布式平台 ), 今天主要来说说怎么在 Hadoop2.2.0 伪分布式上面运行我们写好的 Mapreduce 程序 先给出这个程序所依赖的 Maven

More information

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址   access_token=access_token (http 停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 https://webapi.zego.im/cgi/stop-mix? access_token=access_token (https://webapi.zego.im/cgi/stop-mix? access_token=access_token)

More information

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj Message Transition 5-1 5-2 DataInputStream Class 5-3 DataOutputStream Class 5-4 PrintStream Class 5-5 (Message Transition) (Exercises) Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

Hadoop 的 MapReduce API 提 供 自 動 的 平 行 化 與 工 作 分 配 容 錯 特 性 狀 態 監 控 工 具 一 個 乾 淨 的 抽 象 化 (abstration) 供 程 式 設 計 師 使 用 97

Hadoop 的 MapReduce API 提 供 自 動 的 平 行 化 與 工 作 分 配 容 錯 特 性 狀 態 監 控 工 具 一 個 乾 淨 的 抽 象 化 (abstration) 供 程 式 設 計 師 使 用 97 Hadoop 程 式 設 計 五 開 發 Hadoop Map/Reduce 程 式 設 計 者 只 需 要 解 決 真 實 的 問 題, 架 構 面 留 給 MapReduce 96 Hadoop 的 MapReduce API 提 供 自 動 的 平 行 化 與 工 作 分 配 容 錯 特 性 狀 態 監 控 工 具 一 個 乾 淨 的 抽 象 化 (abstration) 供 程 式 設 計

More information

PowerPoint Presentation

PowerPoint Presentation Oracle 大数据连接器 Hadoop 与 Oracle 数据库集成 罗海雄资深技术顾问 1 版权所有 2011,Oracle 和 / 或其分支机构 保留所有权利 以下内容旨在概述产品的总体发展方向 该内容仅供参考, 不可纳入任何合同 该信息不承诺提供任何资料 代码或功能, 并且不应该作为制定购买决策的依据 描述的有关 Oracle 产品的任何特性或功能的开发 发行和时间规划均由 Oracle 自行决定

More information

Microsoft Word - 第4章 MapReduce分布式计算框架 -教学设计.doc

Microsoft Word - 第4章 MapReduce分布式计算框架 -教学设计.doc 传智播客 Hadoop 大数据技术原理与应用 教学设计 课程名称 : Hadoop 大数据技术原理与应用授课年级 : 20xx 年级授课学期 : 20xx 学年第一学期教师姓名 : 某某老师 2019 年 9 月 1 日 北京市昌平区建材城西路金燕龙办公楼一层电话 :400-618-4000 1 课题 名称 第 4 章 MapReduce 分布式计算框架 计划学 时 8 课时 内容分析教学目标及基本要求教学重点教学难点教学方式

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Fortran Algol Pascal Modula-2 BCPL C Simula SmallTalk C++ Ada Java C# C Fortran 5.1 message A B 5.2 1 class Vehicle subclass Car object mycar public class Vehicle extends Object{ public int WheelNum

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

untitled

untitled How to using M-Power Report API M-Power Report API 力 了 M-Power Report -- Java (Library) M-Power Report API 行 Java M-Power Report M-Power Report API ( 30 ) PDF/HTML/CSV/XLS JPEG/PNG/SVG 料 料 OutputStream

More information

CHAPTER VC#

CHAPTER VC# 1. 2. 3. 4. CHAPTER 2-1 2-2 2-3 2-4 VC# 2-5 2-6 2-7 2-8 Visual C# 2008 2-1 Visual C# 0~100 (-32768~+32767) 2 4 VC# (Overflow) 2-1 2-2 2-1 2-1.1 2-1 1 10 10!(1 10) 2-3 Visual C# 2008 10! 32767 short( )

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

Spark读取Hbase中的数据

Spark读取Hbase中的数据 Spark 读取 Hbase 中的数据 Spark 和 Flume-ng 整合, 可以参见本博客 : Spark 和 Flume-ng 整合 使用 Spark 读取 HBase 中的数据 如果想及时了解 Spark Hadoop 或者 Hbase 相关的文章, 欢迎关注微信公共帐号 :iteblog_hadoop 大家可能都知道很熟悉 Spark 的两种常见的数据读取方式 ( 存放到 RDD 中 ):(1)

More information

untitled

untitled 1 Outline 料 類 說 Tang, Shih-Hsuan 2006/07/26 ~ 2006/09/02 六 PM 7:00 ~ 9:30 聯 ives.net@gmail.com www.csie.ntu.edu.tw/~r93057/aspnet134 度 C# 力 度 C# Web SQL 料 DataGrid DataList 參 ASP.NET 1.0 C# 例 ASP.NET 立

More information

数据结构与算法 - Python基础

数据结构与算法 - Python基础 Python 教材及课件 课件及作业见网址 xpzhang.me 1 1. Python 2. 3. (list) (tuple) 4. (dict) (set) 5. 6. 7. 2 Python Python 3 Python 4 Python 1, 100, -8080, 0,... 0x 0-9, a-f 0 xff00, 0 xa432bf 5 1.24, 3.14, -9.80,...

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

untitled

untitled 1 Outline 類别 欄 (1) 類 類 狀 更 易 類 理 若 類 利 來 利 using 來 namespace 類 ; (2) namespace IBM class Notebook namespace Compaq class Notebook 類别 類 來 類 列 欄 (field) (property) (method) (event) 類 例 立 來 車 類 類 立 車 欄 料

More information

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new ListView 自訂排版 主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new int[]{r.drawable.dog1, R.drawable.dog2,

More information

untitled

untitled 1 .NET 利 [] [] 來 說 切 切 理 [] [ ] 來 說 拉 類 類 [] [ ] 列 連 Web 行流 來 了 不 不 不 流 立 行 Page 類 Load 理 Response 類 Write 料 Redirect URL Response.Write("!! ives!!"); Response.Redirect("WebForm2.aspx"); (1) (2) Web Form

More information

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B 25 9 2008 9 M ICROEL ECTRON ICS & COMPU TER Vol. 25 No. 9 September 2008 J ava 1,2, 1,2, 1,2 (1, 330022 ; 2, 330022) :,. Apla - Java,,.. : PAR ;Apla - Java ; ;CMP ; : TP311 : A : 1000-7180 (2008) 09-0018

More information

Hadoop_Jordan

Hadoop_Jordan 大数据 Hadoop 平台 Jordan Li 08/08/2016 Agenda Hadoop 平台核心架构 HDFS 主要概念 架构与运行机制 演示 :HDFS 常用命令 & 配置 Yarn 主要概念 架构与运行机制 演示 :Yarn 常用命令 & 配置 Mapreduce 编程入门 & 演示 Mapreduce 调优 & 最佳实践 Hadoop Benchmark 性能测试 Hadoop 简介

More information

untitled

untitled 4.1AOP AOP Aspect-oriented programming AOP 來說 AOP 令 理 Cross-cutting concerns Aspect Weave 理 Spring AOP 來 AOP 念 4.1.1 理 AOP AOP 見 例 來 例 錄 Logging 錄 便 來 例 行 留 錄 import java.util.logging.*; public class HelloSpeaker

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

untitled

untitled 1 MSDN Library MSDN Library 量 例 參 列 [ 說 ] [] [ 索 ] [] 來 MSDN Library 了 類 類 利 F1 http://msdn.microsoft.com/library/ http://msdn.microsoft.com/library/cht/ Object object 參 類 都 object 參 object Boxing 參 boxing

More information

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 语 言 程 序 设 计 郑 莉 胡 家 威 编 著 清 华 大 学 逸 夫 图 书 馆 北 京 内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌 握 语

More information

全国计算机技术与软件专业技术资格(水平)考试

全国计算机技术与软件专业技术资格(水平)考试 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2008 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 ) 试 题 一 ( 共 15 分 ) 阅 读 以 下 说 明 和 流 程 图, 填 补 流 程 图 中 的 空 缺 (1)~(9), 将 解 答 填 入 答 题 纸 的 对 应 栏 内 [ 说 明

More information

Day1-hadoop_ _v1

Day1-hadoop_ _v1 王耀聰陳威宇 jazz@nchc.org.tw waue@nchc.org.tw 課程大綱 (1) 第一天 09:30~10:20 介紹課程與 Hadoop 簡介 10:20~10:30 休息 10:30~12:00 Hadoop 生態系簡介實作一 :Hadoop Streaming 範例操作 12:00~13:00 午餐 13:00~15:00 開發輔助工具 Eclipse Map Reduce

More information

// 获取并集 // set1.addall(set2); // 获取交集 set1.retainall(set2); // 打印操作结果 set1.foreach(o -> System.out.println(o)); 运行结果如图 6-1 所示 图 6-1 运行结果 三 案例总结 1 Coll

// 获取并集 // set1.addall(set2); // 获取交集 set1.retainall(set2); // 打印操作结果 set1.foreach(o -> System.out.println(o)); 运行结果如图 6-1 所示 图 6-1 运行结果 三 案例总结 1 Coll 第 6 章集合 案例 6-1 Collection 单列集合的操作 一 案例描述 1 考核知识点编号 :063006002~063006008 063006018 名称 :Collection 单列集合 Arrays 工具类 2 练习目标 掌握 Collection 单列集合方法的使用 3 需求分析 Collection 是所有单列集合的根接口, 在 Collection 中定义了单列集合 (List

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Hadoop 生 态 技 术 在 阿 里 全 网 商 品 搜 索 实 战 阿 里 巴 巴 - 王 峰 自 我 介 绍 真 名 : 王 峰 淘 宝 花 名 : 莫 问 微 博 : 淘 莫 问 2006 年 硕 士 毕 业 后 加 入 阿 里 巴 巴 集 团 淘 及 搜 索 事 业 部 ( 高 级 技 术 与 家 ) 目 前 负 责 搜 索 离 线 系 统 团 队 技 术 方 向 : 分 布 式 计 算

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检 2016 年 上 半 年 软 件 设 计 师 考 试 真 题 ( 下 午 题 ) 下 午 试 题 试 题 一 ( 共 15 分 ) 阅 读 下 列 说 明 和 图, 回 答 问 题 1 至 问 题 4, 将 解 答 填 入 答 题 纸 的 对 应 栏 内 说 明 某 会 议 中 心 提 供 举 办 会 议 的 场 地 设 施 和 各 种 设 备, 供 公 司 与 各 类 组 织 机 构 租 用 场

More information

06-4.indd

06-4.indd 1 02 07 13 16 20 28 33 38 42 46 48 51 57 64 65 65 66 67 68 2 3 4 5 6 7 8 9 10 11 12 13 LL T : 14 LL T 15 16 扫描电子显微镜成像模拟的 MPI 及 OpenMP 并行化 17 18 19 20 21 22 ~ ~ ~ 23 24 ~ ~ ~ ~ ~ ~ ~ 25 26 27 28 29 图 3

More information

untitled

untitled 1 Outline ArrayList 類 列類 串類 類 類 例 理 MSDN Library MSDN Library 量 例 參 列 [ 說 ] [] [ 索 ] [] 來 MSDN Library 了 類 類 利 F1 http://msdn.microsoft.com/library/ http://msdn.microsoft.com/library/cht/ Object object

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题 2009 年 3 月 全 国 计 算 机 等 级 考 试 笔 试 试 卷 二 级 Java 语 言 程 序 设 计 ( 考 试 时 间 90 分 钟, 满 分 100 分 ) 一 选 择 题 ( 每 题 2 分, 共 70 分 ) 下 列 各 题 A) B) C) D) 四 个 选 项 中, 只 有 一 个 选 项 是 正 确 的 请 将 正 确 选 项 填 涂 在 答 题 卡 相 应 位 置 上,

More information

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票 复习 创建对象 构造函数 函数重载 : 函数 = 函数名 + 参数列表 public class MyType { int i; double d; char c; void set(double x)

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

《大话设计模式》第一章

《大话设计模式》第一章 第 1 章 代 码 无 错 就 是 优? 简 单 工 厂 模 式 1.1 面 试 受 挫 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜

More information

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2 Chapter 02 變數與運算式 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.2 2.2.1 2.2.2 2.2.3 type 2.2.4 2.3 2.3.1 print 2.3.2 input 2.4 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 + 2.4.6 Python Python 2.1 2.1.1 a p p l e b e a r c 65438790

More information

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 1 CARDGAME 1 CardGame 题目描述 桌上有一叠牌, 从第一张牌 ( 即位于顶面的牌 ) 开始从上往下依次编号为 1~n 当至少还剩两张牌时进行以下操作 : 把第一张牌扔掉, 然后把新的第一张放到整叠牌的最后 请模拟这个过程, 依次输出每次扔掉的牌以及最后剩下的牌的编号 输入 输入正整数 n(n

More information

实验报告 实验题目 Java 实验 (1) 实验目的 学习 Java 语言的编程 实验准备 直接从网上或从上传作业的网站上下载并安装 JDK

实验报告 实验题目 Java 实验 (1) 实验目的 学习 Java 语言的编程 实验准备 直接从网上或从上传作业的网站上下载并安装 JDK 实验题目 Java 实验 (1) 实验目的 学习 Java 语言的编程 实验准备 直接从网上或从上传作业的网站上下载并安装 JDK http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html 预备知识 (1) 常量定义 final int LEVEL_NUM = 1000; (2)

More information

Guava学习之CharSequenceReader

Guava学习之CharSequenceReader CharSequenceReader 类是以 CharSequence 的形式读取字符 CharSequenceReader 类继承自 Reader 类, 除了 remaining() hasremaining() 以及 checkopen() 函数之后, 其他的函数都是重写 Reader 类中的函数 CharSequenceReader 类声明没有用 public 关键字, 所以我们暂时还不能调用这个类

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii 前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time

More information

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 JAVA 程 序 设 计 ( 肆 ) 徐 东 / 数 学 系 使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款 使 用 Java class 代 表 保 险 箱 public class SaveBox 类 名 类 类 体 实 现 封 装 性 使 用 class SaveBox 代 表 保

More information

untitled

untitled 1 LinkButton LinkButton 連 Button Text Visible Click HyperLink HyperLink 來 立 連 Text ImageUrl ( ) NavigateUrl 連 Target 連 _blank _parent frameset _search _self 連 _top 例 sample2-a1 易 連 private void Page_Load(object

More information

untitled

untitled 1 行 行 行 行.NET 行 行 類 來 行 行 Thread 類 行 System.Threading 來 類 Thread 類 (1) public Thread(ThreadStart start ); Name 行 IsAlive 行 行狀 Start 行 行 Suspend 行 Resume 行 行 Thread 類 (2) Sleep 行 CurrentThread 行 ThreadStart

More information

使用Apache Beam读写HDFS上的文件

使用Apache Beam读写HDFS上的文件 Apache Beam( 原名 Google DataFlow) 是 Google 在 2016 年 2 月份贡献给 Apache 基金会的 Apache 孵化项目, 被认为是继 MapReduce,GFS 和 BigQuery 等之后,Google 在大数据处理领域对开源社区的又一个非常大的贡献 Apache Beam 的主要目标是统一批处理和流处理的编程范式, 为无限, 乱序,web-scale

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

培 训 机 构 介 绍 中 科 普 开 是 国 内 首 家 致 力 于 IT 新 技 术 领 域 的 领 航 者, 专 注 于 云 计 算 大 数 据 物 联 网 移 动 互 联 网 技 术 的 培 训, 也 是 国 内 第 一 家 开 展 Hadoop 云 计 算 的 培

培 训 机 构 介 绍  中 科 普 开 是 国 内 首 家 致 力 于 IT 新 技 术 领 域 的 领 航 者, 专 注 于 云 计 算 大 数 据 物 联 网 移 动 互 联 网 技 术 的 培 训, 也 是 国 内 第 一 家 开 展 Hadoop 云 计 算 的 培 Hadoop 2.0 培 训 Hadoop 2.0Training Hadoop 2.0 运 维 与 开 发 实 战 培 训 邀 请 函 培 训 机 构 介 绍 www.zkpk.org 中 科 普 开 是 国 内 首 家 致 力 于 IT 新 技 术 领 域 的 领 航 者, 专 注 于 云 计 算 大 数 据 物 联 网 移 动 互 联 网 技 术 的 培 训, 也 是 国 内 第 一 家 开

More information

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information