自定义inputformat.getsplits()从未在配置单元中调用

osh3o9ms  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(454)

我正在编写自定义inputformat(特别是 org.apache.hadoop.mapred.FileInputFormat ),outputformat和serde,用于通过apache配置单元读入的二进制文件。并非二进制文件中的所有记录都具有相同的大小。
我发现配置单元的默认输入格式combinehiveinputformat没有委托 getSplits 我的自定义inputformat的实现,它使所有的输入文件在常规的128mb边界上分割。这样做的问题是,此拆分可能位于记录的中间,因此除第一个拆分外,所有拆分都很可能出现损坏的数据。
我已经找到了一些解决办法,但我对其中任何一个都不满意。
解决方法之一是:

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;

使用时 HiveInputFormat 结束 CombineHiveInputFormat ,呼叫 getSplits 正确地委托给我的输入格式,一切正常。但是,我想让我的inputformat、outputformat等对其他用户容易使用,所以我不希望必须经历这些。另外,如果可能的话,我希望能够利用组合拆分。
另一个解决方法是创建 StorageHandler . 但是,我不希望这样做,因为这会使storagehandler支持的所有表都是非本机的(所以所有的reducer都写在一个文件中,不能这样做) LOAD DATA 以及其他我想从本地表中保留的nicity)。
最后,我可以实现我的inputformat CombineHiveInputFormat.AvoidSplitCombination 绕过大多数combinehiveinputformat,但这只在hive1.0中可用,我希望我的代码能够与hive的早期版本(至少回到0.12)一起工作。
我在这里的Hive虫子追踪器中提交了一张罚单,以防这种行为是无意的:https://issues.apache.org/jira/browse/hive-9771
有人写过风俗吗 FileInputFormat 它覆盖了 getSplits 与Hive一起使用?让hive把电话委托给你有什么困难吗 getSplits 你必须克服的?

shyt4zoc

shyt4zoc1#

通常在这种情况下,您可以不使用分割,这样您就可以获得块的数据位置,并且 RecordReader 了解如何从块(分割)中的第一条记录开始读取,以及如何读取到下一个块,其中最后一条记录没有在分割的确切结尾处结束。这需要一些远程读取,但这是正常的,通常非常小。 TextInputFormat / LineRecordReader 它使用换行符来分隔记录,因此一个记录可以跨越两个块。它将遍历到分割中的第一条记录,而不是从第一个字符开始,如果需要读取完整的数据,它将在最后一条记录上读入下一个块。
哪里 LineRecordReader 通过查找当前部分记录开始分割。
哪里 LineRecordReader 通过读取当前块的末尾结束拆分。
希望这有助于指导您的自定义代码的设计。

相关问题