网络计算技术实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
$ bin/hadoop jar wc.jar WordCount /user/joe/wordcount/input /user/joe/wordcount/output 输出:
$ bin/hdfs dfs -cat /user/joe/wordcount/output/part-r-00000 Bye 1 Goodbye 1 Hadoop 2 Hello 2 World 2
< Bye, 1> < Goodbye, 1> < Hadoop, 2> < Hello, 2> < World, 2>
Main方法指定了各方面的工作,例如输入/输出路径(通过命令
行),键/值类型,输入/输出格式等。然后调用job.waitforcompletion提 交工作和监测其进展。
我们将学到更多关于Job, InputFormat, OutputFormat以及其他接口和类方面的内容,
行处理。
关于HBase MapReduce 读/写
首先创建配置信息和作业对象,设置作业的类。这些和正常的 mapreduce一样,唯一不一样的就是数据源的说明部分, TableMapReduceUtil的initTableMapperJob和initTableReducerJob方法来实 现。
数据输入源是hbase的inputTable表,执行mapper.class进行map过 程,输出的key/value类型是 ImmutableBytesWritable和Put类型,最后一 个参数是作业对象。需要指出的是需要声明一个扫描读入对象scan,进 行表扫描读取数 据用,其中scan可以配置参数,这里为了例子简单不再 详述。 数据输出目标是hbase的outputTable表,输出执行的reduce过程是 reducer.class类,操作的作业目标是job。与map比 缺少输出类型的标 注,因为他们不是必要的,看过源代码就知道mapreduce的 TableRecordWriter中write(key,value) 方法中,key值是没有用到的。value 只能是Put或者Delete两种类型,write方法会自行判断并不用用户指明
实验二 HBase MapReduce
HBase – Hadoop Database,是一个高可靠性、高性能、面向列、可 伸缩的分布式存储系统,利用HBase源自文库术可在廉价PC Server上搭建起大 规模结构化存储集群。
MapReduce 调用 HBase 进行特殊的处理,这样能够充分结合 HBase 分布式大型数据库和MapReduce 并行计算的优点。
关于HBase MapReduce 汇总到 HBase
使用HBase 作为源和目标的MapReduce,计算一个表中值的个数, 并将汇总的计数输出到另一个表。
名的目录。
使用者可以通过-files 和 –archives选项用“#”为文件和档案指定一个
不同的符号名称。
例如,bin/hadoop jar hadoop-mapreduce-examples-<ver>.jar
wordcount -files dir1/dict.txt#dict1,dir2/dict.txt#dict2 -archives
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
Mapper的实现,通过map方法,一次执行一行程序,
由指定
textinputformat提供。然后将每一行通过stringtokenizer用空格分开,并
实验一 WordCount
实例:WordCount v1.0
在我们进入细节之前,让我们通过一个MapReduce应用程序的例子 来理解它们是如何工作的。Workcount是一个统计在给定的输入集中每 个单词出现次数的简单应用程序。
这个应该程序需要本地独立的,或伪分布模式,或完全分布式 Hadoop安装。 源代码: 用法: 假设环境变量按如下设置:
会在后面的教程中涉及。
附:程序流程图:
得到对象job的最终参数 IntWritable() map() StringTokenizer()
) IntWritable() reduce ()
) 得到对象job的初始参数
addInputPath(job, new Path(args[0])) setOutputKeyClass(Text.class) setReducerClass(IntSumReducer.class) 开始 main Configuration() getInstance(conf, "word count") setJarByClass(WordCount.class) setMapperClass(TokenizerMapper.class) setOutputPath(job, new Path(args[1])) exit(job.waitForCompletion(true) ? 0 : 1) 结束 得到对象job的最终参数 IntWritable() map() StringTokenizer()
exit(job.waitForCompletion(true) ? 0 : 1) 结束
setOutputValueClass(IntWritable.class) setOutputValueClass(IntWritable.class) setCombinerClass(IntSumReducer.class) setCombinerClass(IntSumReducer.class)
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
StringTokenizer itr = new StringTokenizer(value.toString());
Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } Reducer的实现,通过reduce方法把变量相加,是每个键的出现次数 (这个例子里的i.e.单词)。 因此这个工作的输出是:
发表一个键值对的< <word>,1>。
对给定的样本输入第一组键值对:
< Hello, 1>
< World, 1>
< Bye, 1>
< World, 1>
第二组键值对:
< Hello, 1>
< Hadoop, 1> < Goodbye, 1> < Hadoop, 1>
我们将会为一个给定的工作学习更多关于map方法衍生数量的问 题,这一点将会在后面的教程中提到。
job.setCombinerClass(IntSumReducer.class); WordCount还指定了一个combiner。因此,对键进行排序后,每个
map方法的输出通过本地组合(与减速器按工作配置一样)进行本地聚 集。 第一次执行map输出: < Bye, 1> < Hello, 1> < World, 2> 第二次执行map输出: < Goodbye, 1> < Hadoop, 2> < Hello, 1> public void reduce(Text key, Iterable<IntWritable> values,
mytar.tgz#tgzdir input output这里的文件dir1/dict.txt 和 dir2/dict.txt可以分
别通过符号名称dict1 和 dict2被任务访问。压缩文档mytar.tgz将被替代
并且解压缩到一个以"tgzdir"命名的目录。
WordCount应用程序时非常简单的。
$ bin/hdfs dfs -ls /user/joe/wordcount/input/ /user/joe/wordcount/input/file01 /user/joe/wordcount/input/file02 $ bin/hdfs dfs -cat /user/joe/wordcount/input/file01 Hello World Bye World $ bin/hdfs dfs -cat /user/joe/wordcount/input/file02 Hello Hadoop Goodbye Hadoop 运行应用程序:
可以看出,MyMapper继承的是hbase中提供的TableMapper类,其 实这个类也是继承的MapReduce类。后边跟的两个泛型参数指定类型是 mapper输 出的数据类型,该类型必须继承自Writable类,例如可能用到 的put和delete就可以。需要注意的是要和initTableMapperJob 方法指定 的数据类型一直。该过程会自动从指定hbase表内一行一行读取数据进
应用程序可以指定一个以逗号分隔的路径,这将是目前使用的选项
文件的任务的当前工作目录列表。libjars选项允许应用程序添加jars到类
路径。档案选项允许他们通过逗号分隔档案列表作为参数。这些档案是
未归档的档案名称并且是一个与当前工作目录中创建的任务的链接。命
令指南中有关于命令行选项的更多细节。
用-libjars, -files 和 –archive运行 wordcount示例:
) IntWritable() reduce ()
) 得到对象job的初始参数
addInputPath(job, new Path(args[0])) setOutputKeyClass(Text.class) setReducerClass(IntSumReducer.class) 开始 main Configuration() getInstance(conf, "word count") setJarByClass(WordCount.class) setMapperClass(TokenizerMapper.class) setOutputPath(job, new Path(args[1]))
bin/hadoop jar hadoop-mapreduce-examples-<ver>.jar wordcount -files
cachefile.txt -libjars mylib.jar -archives myarchive.zip input output
这里的myarchive.zip将被替代并且解压缩到一个以"myarchive.zip"命
关于HBase MapReduce 读取
此程序是以从hbase中的表作为数据源读取为例,程序中涉及到MyMapper.class: public class MyMapper extends TableMapper<Text, LongWritable> { public void map(ImmutableBytesWritable row, Result value, Context context) throws InterruptedException, IOException { // process data for the row from the Result instance.
export JAVA_HOME=/usr/java/default export PATH=$JAVA_HOME/bin:$PATH export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar 编译 WordCount.java 和create a jar: 假设: /user/joe/wordcount/input – 在HDFS中输入目录 /user/joe/wordcount/output -在HDFS中输出目录 用示例文本文件作为输入:
相关文档
最新文档