kylin 使用单独hbase问题

背景

使用的是最新的 apache-kylin-1.6.0-hbase1.x-bin
Hadoop用的是2.8.0
HBase用的是 1.3.0

按照官方的文档配置了 kylin.hbase.cluster.fs 为hbase集群的namenode 地址
因为hbase的namenode 做了ha ,也在kylin_job_conf.xml 配置文件中hbase中hdfs 相关的配置也加了。

但是运行时间就是到hbase的namenode 中结果数据。

问题排查
看了代码,加载hadoop配置文件是在
HiveMRInput 类的

@Override
protected ExecuteResult doWork(ExecutableContext context) throws ExecuteException {
KylinConfig config = getCubeSpecificConfig();

try {
computeRowCount(config.getCliCommandExecutor());
Path rowCountFile = null;
Path rowCountFolder = new Path(getRowCountOutputDir());
FileSystem fs = FileSystem.get(rowCountFolder.toUri(), HadoopUtil.getCurrentConfiguration());

看了下 HadoopUtil.getCurrentConfiguration(),配置是从上下文获取的

public static Configuration getCurrentConfiguration() {
if (hadoopConfig.get() == null) {
Configuration conf = healSickConfig(new Configuration());
// do not cache this conf, or will affect following mr jobs
return conf;
}
Configuration conf = hadoopConfig.get();
return conf;
}

这个的上下文是通过 KylinMapper 来设置的


public class KylinMapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> extends Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
private static final Logger logger = LoggerFactory.getLogger(KylinMapper.class);

protected void bindCurrentConfiguration(Configuration conf) {
logger.info("The conf for current mapper will be " + System.identityHashCode(conf));
HadoopUtil.setCurrentConfiguration(conf);
}
}

在代码里面加了点日志。


logger.info("---- hadoop fs.defaultFS {}"
+ HadoopUtil.getCurrentConfiguration().get("fs.defaultFS"));
logger.info("---- hadoop dfs.nameservices {}"
+ HadoopUtil.getCurrentConfiguration().get("dfs.nameservices"));

发现获取的都是hbase的配置。
解决
懒的去找具体是什么地方出错了。直接自己改了代码,在HadoopUtil新增了一个方法

private static final Cache<String, Configuration> LOCAL_HADOOP_CONFIG = CacheBuilder.newBuilder().build();

// 本地的hadoop环境
private static final String LOCAL_CONFIG = "localConfig";
/**
* 加载本地的hadoop配置文件
*
* @return
*/
public static Configuration getLocalHadoopConfiguration() {

try {
return LOCAL_HADOOP_CONFIG.get(LOCAL_CONFIG, new Callable<Configuration>() {

@Override
public Configuration call() throws Exception {
Configuration configuration = new Configuration(false);

String hadoopConfDir = System.getenv("HADOOP_CONF_DIR");
logger.info("------ hadoopConfDir {} -------- ", hadoopConfDir);

configuration.addResource(new Path(hadoopConfDir + "/core-site.xml"));
configuration.addResource(new Path(hadoopConfDir + "/hdfs-site.xml"));
configuration.addResource(new Path(hadoopConfDir + "/mapred-site.xml"));
configuration.addResource(new Path(hadoopConfDir + "/yarn-site.xml"));

return configuration;
}
});
} catch (ExecutionException e) {
logger.error("load local hadoop config eror ");
}

throw new IllegalStateException("local hadoop config error ");

}

因为我的kylin是在hadoop的机器上运行的,所以直接这么改了。
运行了下,问题解决。

但是又遇见一个问题,Hadoop的计算节点不认识我的hbase namenode节点信息。
所以又需要把hbase的namenode信息配置到 hadoop集群的hdfs-site.xml 中。

总结
感觉kylin不是很严谨,这种问题应该很容易遇见,代码里面都没有检查。

发表评论

电子邮件地址不会被公开。 必填项已用*标注