Hive读取CarbonData文件问题调试

1. 参考文档

https://github.com/apache/carbondata/blob/master/docs/hive-guide.md

2. 问题呈现

  1. select * from test_carbon;没有数据
  2. select count(1) from test_carbon;有值
  3. select distinct name from test_carbon 有值;

3. 调试步骤

  1. 由于hive读取carbon是使用的serde方式;社区单独把这块拿出来建成一个子项目,位于carbondata/integration/hive里面;前面读取时使用的carbondata整个集成包来测的,这时由于要多次编译代码,使用此子项目,依赖core,comman,hadoop这三个carbondata内的子项目。
  2. 依次编译这几个项目内,根据carbondata大牛(昆哥)的建议,开始往MapredCarbonInputFormat的getSplits方法内加日志,打印文件分片信息;调试后发现没有日志;
  3. 再接着看splitList size为0,最后加到getSplits第一行,还是没有日志;
  4. 早上一直没想通,后来看select 返回的速度,感觉特别快;确定肯定是不同的查询方式;猛然想起select limit好像不走mapreduce,就去查了,查到一个配置项:hive.fetch.task.conversion,默认值为minimal;从图片中可以看到,此配置值选项有三个,more,minimal,还有一个None,不使用此配置。首先设置为None,再select * from,值出来了;再设置剩下的两个都没有值;这个配置项控制是使用直接FetchTask还是启动mapreduce.此时问题已经解决。


    image.png
  5. 为了查看为什么这样,开始下载hive源码,配置远程调试,跟踪代码会发现是直接调用的FetchTask的fetch方法,里面有一步操作,会列出来表下面的文件,这块直接调用的FileSystem的子类DistributedFileSystem,中间没做处理,直接扫描的目录。carbondata的表目录结构是表下面没有文件,文件在Fact/Part0/segmentXXX/files,扫描的文件数量为0,故查不出来数据。


    image.png

    6.为了二次验证以上结论,把其中一个表的数据从segment里面拷贝到表根目录下面,立刻就能查出来结果。


    image.png

    image.png

你可能感兴趣的:(Hive读取CarbonData文件问题调试)