现在位置: 首页 > 黄专家专栏 > 文章
2014年11月03日 黄专家专栏 ⁄ 共 4632字 评论关闭
文件分片 函数 1 2 3 4 5 6 7 8 9 10 private int writeSplits(org.apache.hadoop.mapreduce.JobContext job, Path jobSubmitDir) throws IOException, InterruptedException, ClassNotFoundException { JobConf jConf = (JobConf)job.getConfiguration(); int maps; if (jConf.getUseNewMapper()) { maps = writeNewSplits(job, jobSubmitDir); } else { maps = writeOldSpli...
阅读全文
2014年11月03日 黄专家专栏 ⁄ 共 4672字 评论关闭
整体流程 简单的代码就可以运行一个作业 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // Create a new JobConf JobConf job = new JobConf(new Configuration(), MyJob.class); // Specify various job-specific parameters job.setJobName("myjob"); job.setInputPath(new Path("in")); job.setOutputPath(new Path("out")); job.setMapperClass(MyJob.MyMapper.class); job.setReducerClass(My...
阅读全文
2014年10月30日 黄专家专栏 ⁄ 共 1725字 评论关闭
一般情况下,程序出现 segmentation fault,可以有多种方法 debug,利用 log 能找出程序 90% 以上的 bug,剩下的简单一点可以采取二分法注释掉代码或者祭起 gdb 这个大杀器。但是有的时候,gbd 给出的 crash 上下文其实并不是真正发生问题的第一现场,在多线程程序设计中,这种情景会让 bug 的追查陷入误区。 介绍一个内存 debug 的工具, electric-fence。 我手头的版本是 2.1.13。 electric-fence 的原理是重写 malloc(3) 和 ...
阅读全文
2014年10月30日 黄专家专栏 ⁄ 共 2170字 评论关闭
简单说,所谓原子操作是指不会被打断的操作,这种”打断”在操作系统层面,一般是指线程间的上下文切换。假设,一个线程对一个共享的变量写入一个 值,那么另一个观察这个变量的线程,要么看到原值,要么看到新值,不会看到一种中间状态,这种中间状态可以简单理解为部分写入(torn write)。 转到程序设计层面,如果你用C/C++写入或者读取一个变量,这个操作是原子的吗? 答案是:不一定。 假设我们有一个 64bit 的共享变量, sto...
阅读全文
2014年10月30日 黄专家专栏 ⁄ 共 1463字 评论关闭
讨论模板的显式实例化之前,先弄清楚什么是模板的实例化。 模板的实例化 : 指的是用具体的类型替代了模板参数的一个过程。这个过程的产物是一个模板的实例。 另外,只要在代码中正确使用模板,编译器会自动引发一个模板的实例化过程,这叫做隐式的(implicit)实例化。 例如: 1 2 3 4 5 6 7 8 9 10 11 #include<string> #include<map> template<class T> void Foo(T t) { } int ...
阅读全文
2014年10月30日 搜索技术, 黄专家专栏 ⁄ 共 2024字 评论关闭
现在用的 hadoop 的版本是 0.20.2-cdh3u6。 cdh 是 Cloudera 的开源版本。 使用 local 模式的时候,会出现几个错误,记录如下: 1. java.lang.NullPointerException 异常 1 2 3 4 5 6 7 java.lang.Exception: java.lang.NullPointerException at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:349) Caused by: java.lang.NullPointerException at org.apache.hadoop.mapred.pipes...
阅读全文
2014年10月30日 搜索技术, 黄专家专栏 ⁄ 共 3830字 评论关闭
有的时候,我们在 hadoop 上的输入可能不是一些基于行的文本,是希望自定义一些结构化的数据。这种情况,一般会选用工具将结构化的数据序列化成字节流,存储在磁盘上。然后在 maper 中读取进来,反序列化即可得到原来的数据。 我们使用 google protobuf 作为这种结构化的信息传递的工具。 首先可以先定义 person.proto 文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...
阅读全文
2014年10月30日 黄专家专栏 ⁄ 共 7168字 评论关闭
本文假设了解 boost::function 相关用法 首先需要包含的头文件为 boost/function.hpp 里面内容比较简单 1 2 3 4 5 6 7 8 9 10 11 # if BOOST_FUNCTION_MAX_ARGS >= 0 # include <boost/function/function0.hpp> # endif # if BOOST_FUNCTION_MAX_ARGS >= 1 # include <boost/function/function1.hpp> # endif # if BOOST_FUNCTION_MAX_ARGS >= 2 # include <boos...
阅读全文
2014年10月30日 黄专家专栏 ⁄ 共 1924字 评论关闭
boost 中包含了许多奇技淫巧的代码,这里分析宏的自身迭代 以这样的宏代码调用 1 BOOST_PP_ENUM_PARAMS(4, typename T) 它的宏展开为 1 typename T0 , typename T1 , typename T2 , typename T3 这在boost中被多用于简化代码量 比如 boos::function 中 下面来分析这类宏的具体实现 宏1: 1 #define BOOST_PP_ENUM_PARAMS(count, param) BOOST_PP_REPEAT(count, BOOST_PP_ENUM_PARAMS_M, pa...
阅读全文
2014年10月30日 黄专家专栏 ⁄ 共 1704字 评论关闭
模板函数的重载遵循SFINAE原则(substitution-failure-is-not-an-error):当一个模板函数的返回值或参数类型无效的时候,该实例不会参与重载解析,也不会导致编译错误。 所以常用 is_same enable_if 等 is_same 表示两个类型是否相同 一般来说代码是这样实现的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // stl 实现 4.1.2 template<typename _Tp, _Tp __v> struct integral_constant { static const ...
阅读全文