hadoop 一些使用上的记录(ATCO)
2013-07-05 15:11
113 查看
1、启用多线程运行map
//设置MAP处理类为MutithreadedMapper
job.setMapperClass(MutithreadedMapper.class);
//设置MutithreadedMapper的线程数(建议使用配置)
MultithreadedMapper.setNumberOfThreads(job,10)
2、按行划分MAP,即实现输入文件按行划分,每N行一个MAP
//设置JOB的格式化输入类为NLineInputFormat
job.setInputFormatClass(NLineInputFormat.class)
//设置每N行为一个MAP,当然,这个数据最好使用计算的方法去得出,因为不然输入一个大文件会导致MAP很大,会导致占用整个集群资源,如限制最多只能占用N个MAP,当计算出来的MAP大于最大能占用MAP时,以最大可占用MAP数平分其行数
job.getConfiguration().set(NLineInputFormat.LINES_PER_MAP,"500");
3、将输出忽略KEY值(即输出时不带有KEY值,直接为每行一个VALUE)
这样的输出其实最简单的就是在输出时KEY值使用NullWritable.get()作类型即可,如:
context.write(NullWritable.get(),new Text("aaa"));
也可以重写格式化输出类。
4、输出时按情况使用不同的文件名输出结果
这种情况也可以重写格式化输出类实现。
这里说一种简单的方法:
1)、先在提交JOB之前,设置多行输出别名,设置其别名,输出类型,Key类型,value类型
MultipleOutputs.addNameOutput(job,"corpInfo",TextOutputFormat.class,Text.class,Text.class);
MultipleOutputs.setCounterEnabled(job,true);//重设别名输出后,其计算器要设置才能显示输出数
注:设置的别名只是标识输出格式,key格式,value格式的一个类变量。即表示,如果你要输出的文件有多种不同的格式标识,则设置多个别名以标示输出格式。
2)、在map中声明输出
private MultipleOutputs outs;
3)在map的setup方法中实例化输出类:
@Override
protected void setup(Context context){
outs=new MultipleOutputs(context);
}
4)在map的cleanup方法中关闭输出类:
public void cleanup(Context context) throws IOException,InterruptedException{
super.cleanup(Context);
outs.close;
}
5)在map中使用
outs.write("corpInfo",NullWritable.get(),new Text("aaa"),"result");
参数为:输入别名,KEY,VALUE,文件名
当要输出的数据其输出格式都一致时,可以用相同的别名进行输出成不同的文件名,文件名一般会加一些后缀,一般为机器节点标识值,如result0001
注:上面是MAP的输出,reduce也是一样的:声明输出类,实例化,使用
5、关于输入输出编码
hadoop源代码中涉及编码问题时都是写死的utf-8,但是不少情况下,也会遇到输入文件和输出文件需要GBK编码的情况。
输入文件为GBK,则只需在mapper或reducer程序中读取Text时,使用new String(text.getBytes(), 0, text.getLength(), encoding)进行一下转码即可正常读出。
输出文件为GBK,则重写TextOutputFormat类,如public class GBKFileOutputFormat<K, V> extends FileOutputFormat<K,V>,
把TextOutputFormat的源码拷过来,然后把里面写死的utf-8编码改成GBK编码。最后,在run程序中,设置job.setOutputFormatClass(GBKFileOutputFormat.class);
//设置MAP处理类为MutithreadedMapper
job.setMapperClass(MutithreadedMapper.class);
//设置MutithreadedMapper的线程数(建议使用配置)
MultithreadedMapper.setNumberOfThreads(job,10)
2、按行划分MAP,即实现输入文件按行划分,每N行一个MAP
//设置JOB的格式化输入类为NLineInputFormat
job.setInputFormatClass(NLineInputFormat.class)
//设置每N行为一个MAP,当然,这个数据最好使用计算的方法去得出,因为不然输入一个大文件会导致MAP很大,会导致占用整个集群资源,如限制最多只能占用N个MAP,当计算出来的MAP大于最大能占用MAP时,以最大可占用MAP数平分其行数
job.getConfiguration().set(NLineInputFormat.LINES_PER_MAP,"500");
3、将输出忽略KEY值(即输出时不带有KEY值,直接为每行一个VALUE)
这样的输出其实最简单的就是在输出时KEY值使用NullWritable.get()作类型即可,如:
context.write(NullWritable.get(),new Text("aaa"));
也可以重写格式化输出类。
4、输出时按情况使用不同的文件名输出结果
这种情况也可以重写格式化输出类实现。
这里说一种简单的方法:
1)、先在提交JOB之前,设置多行输出别名,设置其别名,输出类型,Key类型,value类型
MultipleOutputs.addNameOutput(job,"corpInfo",TextOutputFormat.class,Text.class,Text.class);
MultipleOutputs.setCounterEnabled(job,true);//重设别名输出后,其计算器要设置才能显示输出数
注:设置的别名只是标识输出格式,key格式,value格式的一个类变量。即表示,如果你要输出的文件有多种不同的格式标识,则设置多个别名以标示输出格式。
2)、在map中声明输出
private MultipleOutputs outs;
3)在map的setup方法中实例化输出类:
@Override
protected void setup(Context context){
outs=new MultipleOutputs(context);
}
4)在map的cleanup方法中关闭输出类:
public void cleanup(Context context) throws IOException,InterruptedException{
super.cleanup(Context);
outs.close;
}
5)在map中使用
outs.write("corpInfo",NullWritable.get(),new Text("aaa"),"result");
参数为:输入别名,KEY,VALUE,文件名
当要输出的数据其输出格式都一致时,可以用相同的别名进行输出成不同的文件名,文件名一般会加一些后缀,一般为机器节点标识值,如result0001
注:上面是MAP的输出,reduce也是一样的:声明输出类,实例化,使用
5、关于输入输出编码
hadoop源代码中涉及编码问题时都是写死的utf-8,但是不少情况下,也会遇到输入文件和输出文件需要GBK编码的情况。
输入文件为GBK,则只需在mapper或reducer程序中读取Text时,使用new String(text.getBytes(), 0, text.getLength(), encoding)进行一下转码即可正常读出。
输出文件为GBK,则重写TextOutputFormat类,如public class GBKFileOutputFormat<K, V> extends FileOutputFormat<K,V>,
把TextOutputFormat的源码拷过来,然后把里面写死的utf-8编码改成GBK编码。最后,在run程序中,设置job.setOutputFormatClass(GBKFileOutputFormat.class);
相关文章推荐
- 使用SQL遇到的一些问题记录
- Java项目中使用log记录日志的一些总结
- 使用 Clipper 库的一些问题记录
- 记录一些BCB6的使用心得
- autolayout使用中的一些坑记录
- 记录一些使用LLDB调试的命令
- Eclipse和Tomcat使用过程的一些配置、错误等的总结记录
- [项目过程中所遇到的各种问题记录]ORM篇——使用NHibernate配置对象实体的一些小问题
- mongodb一些使用技巧或注意事项记录
- 【hadoop摸索系列】记录使用libhdfs访问hdfs的关键问题
- Nutch1.7学习使用一些错误记录--持续记录
- Linux 一些基本指令简单使用记录
- 记录使用SeekBar遇到的一些错误
- 记录一些makefile 的规则、变量函数使用
- 关于hadoop的一些记录
- Ashx中使用jQuery.Ajax方法的一些记录
- ELK Stack搭建和使用中的一些小记录
- Eclipse和Tomat使用过程的一些配置、错误等的总结记录
- [项目过程中所遇到的各种问题记录]ORM篇——使用NHibernate配置对象实体的一些小问题 22
- 实战hadoop海量数据处理系列02 番外篇: 在linux上使用hql执行工具 | hive排错记录