2013-01-09

今天完成的最大的一件事情就是 hadoop 相关程序搬迁。本来我在办公区的机房找了5台服务器自建了一个 hadoop 集群。然后听说公司的数据平台部门有hadoop集群可开放出来用,于是我赶紧搬家啊!!办公区机房的那些服务器连UPS都没有,几乎每次遇到假期都会断电。

程序都好改。改改配置文件,改一改路径名就可以了。但是最头疼的是数据怎么搬过去? 新的hadoop集群是采用kerberos认证,而老的(我自建的)没有开身份认证。我本来想写个程序完成这个事情,从一个流读,然后写入另一个流,不经过临时文件。后来发现不行,在单个进程中做不到。org.apache.hadoop.security.UserGroupInformation 这个类有一个boolean类型的静态变量useKerberos。true就代表走kerberos认证,false就用操作系统当前的用户不经什么身份检查直接访问服务。

可恨的是,这个类还专门写了一个叫做ensureInitialized的函数保证useKerberos这个变量只被初始化一次。

private static synchronized void ensureInitialized() {
    if (!isInitialized) {
      initialize(new Configuration());
    }
}

无奈。还是写shell脚本hadoop dfs -get/-put吧。200KB/s的传输速度真让我难忍。

然后就是安装hive和hcatalog。我现在是自己用protocol buffers来管理数据的结构信息,自己手写pig的loader。我在考虑要不要转移给hive和hcatalog去做这件事情。它们很容易帮我做好按日期分区查询。

有一点我没明白。假如我现在是在shell下用kinit找KDC要的ticket。那么在这个ticket到期的时候,谁来刷新这个ticket呢?1.0.4的hadoop的配置文件中我没有找到填keytab的地方。郁闷。

update: 2013-01-10

shell下kinit取得的ticket默认只有1天的有效期。如果crontab中的程序依赖于这个,那么就很糟。在java程序的main函数的开头用 org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab( username, keytabFile); 可解决此问题。

此博客中的热门博文

少写代码,多读别人写的代码

在windows下使用llvm+clang

tensorflow distributed runtime初窥