`
臻是二哥
  • 浏览: 188590 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Java技术分享
浏览量:0
社区版块
存档分类
最新评论

hadoop之用户定制

 
阅读更多
Hadoop提供了9中内置数据类型,分别为:
BooleanWritable
ByteWritable
IntWritable
LongWritable
FloatWritable
DoubleWritable
Text(使用UTF8格式存储的文本)
NullWritable(空值的时候使用)

当然,用户也可以自定义数据类型,自定义数据类型时,要实现Writable接口;如果自定义的数据作为key使用,还需要实现Comparable接口,在hadoop中,实现WritableComparable接口即可,WritableComparable继承自Writable和Comparable接口。
代码大概内容如下:
[color=orange]public class Point3D implements WritableComparable<Point3D>{
private float x,y,z;
public float getX(){return x;}
public float getY(){return y;}
public float getZ(){return z;}
public void readFields(DataInput in) throws IOException{
x=in.readFloat();
y=in.readFloat();
z=in.readFloat();

}
public void write(DataOutput out) throws IOException{
out.writeFloat(x);
out.writeFloat(y);
out.writeFloat(z);
}
public int compareTo(Point3D p){

return 1,0,-1;
}

}
学过java的人不难理解以上的代码。
[/color]
当然,hadoop还允许定制其他的内容,比如定制输入输出的格式,hadoop提供了丰富的内置数据输入格式,最常用的输入格式是TextInputFormat和KeyValueTextInputFormat
TextInputFormat是系统默认的输入格式,它能够将输入的内容以<K,V>的形式输出,读入一行时,输出的K为该行在文本中的偏移量,输出的V为该行的内容。
KeyValueInputFormat是一个常用的输入格式,可以将一个按照<K,V>格式存放的文本文件逐行读出,并解析为<K,V>
每个InputFormat都有两个任务,将输入文件转化为split集合以及将split转化为键值对。
查看InputFormat的API,他有两个函数getSplits(JobContext context)和createRecordReader(InputSplit split, TaskAttemptContext context)
因此自定制输入格式自然得自定义RecordReader。
查看RecordReader的API,主要有initialize(InputSplit split, TaskAttemptContext context),getCurrentKey(),getCurrentValue()等待我们去实现。
下面以一个不考虑词频的倒排索引为例,进行说明。为了能更细粒度的记录单词在文档中出现时的行位置信息,这里假定文档文件的标示就是文件名,单词在文档中的行位置信息就是该行在文档中的偏移量,则代码如下:
import org.apache.hadoop.*;
import org.apache.hadoop.mapreduce.*;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.mapreduce.lib.*;
import org.apache.hadoop.mapreduce.lib.input.*;
import org.apache.hadoop.mapreduce.lib.output.*;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.util.*;
import java.util.*;
import java.io.*;
import java.net.*;
public class InvertedIndex {
public static class MyInputFormat extends FileInputFormat<Text,Text>{
MyRecordReader mrr=new MyRecordReader();
public RecordReader<Text,Text> createRecordReader(InputSplit split,TaskAttemptContext context){
try{
mrr.initialize(split, context);
}
catch(Exception e){
e.printStackTrace();
}
return mrr;
}
}
public static class MyRecordReader extends RecordReader<Text,Text>{
String fileName;
LineRecordReader lrr=new LineRecordReader();
public Text getCurrentKey(){
return new Text(fileName+"@"+lrr.getCurrentKey());
}
public Text getCurrentValue(){
return lrr.getCurrentValue();
}
public void initialize(InputSplit split, TaskAttemptContext context) throws IOException,InterruptedException{
lrr.initialize(split, context);
fileName=((FileSplit)split).getPath().toString();
}
public float getProgress(){
return lrr.getProgress();
}
public void close()   throws IOException{
lrr.close();
}
public boolean nextKeyValue() throws IOException {
return lrr.nextKeyValue();
}
}

public static void main(String [] args) throws Exception
{
Configuration conf = new Configuration();
String[] otherArgs=new GenericOptionsParser(conf,args).getRemainingArgs();
if(otherArgs.length!=2){
System.err.println("error");
System.exit(1);
}
Job job=new Job(conf,"InvertedIndex");
    job.setJarByClass(InvertedIndex.class);

job.setInputFormatClass(MyInputFormat.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);
     
}
}


上面的例子仅仅是为了如何演示自定义输入格式,实际上倒排索引程序完全没必要这样做。另外,这个例子是基于FileInputFormat和LineRecordReader实现的,当然我们也可以自己去继承RecordReader和InputFormat类,具体参见API即可。
以上就是hadoop中自定义内容的一些用法,可以自定义数据类型,自定义输入格式,当然也可以自定义输出格式,在此不再赘述。

0
0
分享到:
评论
1 楼 hae 2014-11-04  
引用
以上就是hadoop中自定义内容的一些用法,可以自定义数据类型,自定义输入格式,当然野结衣自定义输出格式,在此不再赘述。

野结衣都出来了  看来博主也是个宅男啊 

相关推荐

    hadoop-2.7.2资源

    2. "hadoop-2.7.2-src.tar.gz" 这是Hadoop 2.7.2的源代码包,适合开发者或需要对Hadoop进行定制化修改的用户。通过源代码,用户可以理解Hadoop的工作原理,进行二次开发,或者根据特定环境编译适合的二进制版本。 ...

    Hadoop云服务之战

    ### Hadoop云服务之战 #### 为什么Apache Hadoop让人如此着迷? Apache Hadoop之所以能够吸引众多企业和开发者的关注,主要是因为它提供了一种强大的分布式计算框架,能够有效地处理大规模的数据集。这一特性使得...

    各个版本Hadoop,hadoop.dll以及winutils.exe文件下载大合集

    用户可以编译这个源码来创建适合自己环境的`winutils.exe`,或者根据需要定制某些功能。 在使用这些文件时,需要注意以下几点: 1. 确保下载的`hadoop.dll`和`winutils.exe`与你的Hadoop版本兼容。 2. 配置环境变量...

    Hadoop之电商广告数据分析系统的设计有实现

    Hadoop支持访问控制列表和身份验证机制,确保只有授权用户可以访问数据。同时,对敏感信息进行脱敏处理,避免泄露用户隐私。 总结来说,构建一个基于Hadoop的电商广告数据分析系统,涉及以下几个关键步骤:数据收集...

    Hadoop之电影推荐系统的设计与实现

    MapReduce是Hadoop的核心组件之一,它将大型任务拆分成一系列小的"map"任务,然后在分布式集群中并行执行,之后通过"reduce"任务汇总结果。在这个项目中,Map阶段可能会处理用户的电影评分和收藏数据,将这些数据...

    hadoop权威指南4和源码

    对于进阶用户,可以研究源码来定制Hadoop功能或解决特定场景下的问题。 总的来说,《Hadoop权威指南4》结合源码,是一套全面的学习资料,涵盖了从理论到实践的各个方面,对于想要深入理解Hadoop并利用其处理大数据...

    hadoop-3.2.0.tar.gz

    2. **HDFS(Hadoop Distributed File System)**:Hadoop的分布式文件系统是其核心组件之一。在3.2.0中,HDFS增强了数据复制的策略,提高了数据容错性和恢复速度。此外,它还优化了NameNode的性能,降低了元数据操作...

    hadoop-2.7.5.tar.gz原始安装包

    5. **配置文件**:压缩包内包含了大量的配置文件,如`core-site.xml`、`hdfs-site.xml`、`mapred-site.xml`和`yarn-site.xml`等,这些文件用于定义Hadoop的各种参数,用户可以根据自己的集群环境进行定制。...

    Hadoop 中的调度

    传统的Hadoop调度器采用的是First In First Out(FIFO)策略,即按作业提交的顺序分配资源,但这种方法并不适用于复杂的工作负载和多用户环境。 在2008年之前,Hadoop仅支持与JobTracker紧密耦合的单一调度器,这...

    hadoop2.6.4 eclipse插件

    这个“hadoop2.6.4 eclipse插件”是针对 Hadoop 2.6.4 版本定制的,由个人编译并经过测试,确保了其可用性。 Hadoop 插件的主要功能包括: 1. **项目配置**:插件允许用户在 Eclipse 中创建 Hadoop 项目,并提供...

    hadoop 安全设置guide

    观察每个用户在Navigator、Sentry和SQL等组件上的不同访问权限,以加深对Hadoop安全设置的理解。 总结来说,确保Hadoop集群的安全涉及多个层面,包括认证、授权、数据保护和数据治理。通过有效的安全管理,你可以...

    prometheus grafana 基于开源监控apache Hadoop模板大全

    模板通常包括了预定义的查询、面板和仪表盘,用户只需根据实际环境进行简单的定制,就可以快速搭建起一个直观的监控界面。 总结起来,这个“Apache Hadoop基于开源监控模板大全”为大数据管理员提供了一套完整的...

    Hadoop之外卖订单数据分析系统

    此外,还可以使用机器学习算法预测订单趋势、识别异常行为或进行用户聚类。 数据可视化是让非技术团队理解分析结果的关键步骤。我们可以借助工具如Tableau、Echarts或Hadoop生态内的Hue来创建直观的图表和仪表盘。...

    hadoop on k8s : What’s the ‘Hadoop-la’ about Kubernetes

    - 平台构建块而非完整解决方案:Kubernetes提供了基础的构建块,用户可以根据自己的需求搭建定制化的解决方案。 - 主要用途:无状态/微服务部署,但正在向有状态应用领域发展。 - **核心概念**: - **Pod**:...

    Hadoop入门学习文档

    - 对于深入理解Hadoop内部工作原理和定制特定功能而言,编译Hadoop源码是非常有益的。 - 需要具备一定的Java开发经验和构建工具(如Maven)的使用经验。 - 编译过程涉及配置环境、下载源码、构建项目等多个步骤。 ...

    hadoop2.7.6编译后的

    这些配置文件用于定制Hadoop集群的行为,比如数据存储位置、网络设置、安全性配置等。 4. **share**:这个目录下通常包含了Hadoop的共享资源,如文档、示例代码或库文件。例如,Hadoop的JAR文件可能会在这个目录下...

    hadoop毅哥的压缩包.7z

    用户可能下载这个来编译最新的LZO库,或者对代码进行修改和定制以适应特定需求。 基于以上信息,我们可以深入讲解以下几个Hadoop相关知识点: 1. **Hadoop架构**:Hadoop由两个主要部分组成,HDFS(Hadoop ...

    hadoop-2.7.6src.tar.gz的压缩包

    这个名为“hadoop-2.7.6src.tar.gz”的压缩包包含了Hadoop 2.7.6版本的源代码,对于开发者来说,这是一个宝贵的资源,可以深入理解Hadoop的内部工作原理并进行定制化开发。 Hadoop 2.7.6是Hadoop发展中的一个重要...

    hadoop-3.1.1-src.tar

    3. **跨命名空间快照**:Hadoop 3.1.1引入了跨命名空间的快照功能,允许用户在不同目录间创建和管理快照,这对于数据保护和恢复至关重要。 4. **网络堆栈优化**:对TCP/IP堆栈进行了调整,降低了网络延迟,提升了...

    hadoop-common-2.2.0-bin

    此外,二进制文件也可能会包括测试用例、文档和其他辅助工具,帮助用户理解和使用Hadoop Common。 在使用Hadoop Common时,开发人员需要注意以下几点: 1. **环境配置**:确保HADOOP_HOME环境变量已设置,并且其值...

Global site tag (gtag.js) - Google Analytics