现在位置: 首页 > admin发表的所有文章
  • 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 = writeOldSplits(jConf, jobSubmitDir); } return maps; } 执行文件分片,并得到需要的 map 数目 1 ......
阅读全文
  • 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(MyJob.MyReducer.class); // Submit the job, then poll for progress until the job is complete Job......
阅读全文
  • 10月
  • 30日
黄专家专栏 ⁄ 共 1725字 评论关闭
一般情况下,程序出现 segmentation fault,可以有多种方法 debug,利用 log 能找出程序 90% 以上的 bug,剩下的简单一点可以采取二分法注释掉代码或者祭起 gdb 这个大杀器。但是有的时候,gbd 给出的 crash 上下文其实并不是真正发生问题的第一现场,在多线程程序设计中,这种情景会让 bug 的追查陷入误区。 介绍一个内存 debug 的工具, electric-fence。 我手头的版本是 2.1.13。 electric-fence 的原理是重写 malloc(3) 和 free(3), 多分配一个 page 在用户需要的内存空间之后,并且利用函数 mprotect(2) 将这个 page 写保护。......
阅读全文
  • 10月
  • 30日
黄专家专栏 ⁄ 共 2170字 评论关闭
简单说,所谓原子操作是指不会被打断的操作,这种”打断”在操作系统层面,一般是指线程间的上下文切换。假设,一个线程对一个共享的变量写入一个 值,那么另一个观察这个变量的线程,要么看到原值,要么看到新值,不会看到一种中间状态,这种中间状态可以简单理解为部分写入(torn write)。 转到程序设计层面,如果你用C/C++写入或者读取一个变量,这个操作是原子的吗? 答案是:不一定。 假设我们有一个 64bit 的共享变量, store 函数表示写入这个变量一个值 1 2 3 4 uint64 var; void store() { var = 0x100000000......
阅读全文
  • 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 main() { Foo(10); std::map<std::string> m; } 隐式的(implicit)实例化在使用模......
阅读全文
  • 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.Application.<init>(Application.java:103) at org.apache.hadoop.mapred.pipes.PipesMapRunn......
阅读全文
有的时候,我们在 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 26 27 option java_package = "com.hackerlight.proto"; option java_outer_classname = "Protobuf......
阅读全文
  • 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 <boost/function/function2.hpp> # endif # if BOOST_FUNCTION_MAX_ARGS >= 3 # include <b......
阅读全文
  • 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, param) 首先看看 BOOST_PP_ENUM_PARAMS_M 的作用 宏2: 1 #define BOOST_PP_REPEAT BOOST_P......
阅读全文
  • 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 _Tp value = __v; typedef _Tp value_type; typedef integral_constant<_Tp, __v> type; ......
阅读全文
  • 10月
  • 30日
黄专家专栏 ⁄ 共 1016字 评论关闭
Octopress 是一个静态博客系统,在我的 VPS 上搭建了这个 Blog 后,每一次写新的日志就需要在本机生成静态页面再通过 rsync 同步到服务器,这是个繁琐的过程,主要在于本机上也要安装 ruby 环境和 Octopress。如果在其他受限的环境下就只能存储编写的 markdown 文件,存储待以后发布或者 ssh 到 VPS 上发布,这是个比较恶心的过程。 Git 是一个分布式版本控制工具,如果 Blog 存储在 git 服务器上,那么就将版本和存储结合在一起,版本控制的天然优势也可以被 Blog 系统所利用,任意回退到某一个时间的状态就很容易实现。本文就将 O......
阅读全文
  • 03月
  • 14日
综合评论关闭