- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写自定义 InputFormat(具体来说,org.apache.hadoop.mapred.FileInputFormat
的子类)、OutputFormat 和 SerDe,用于通过 Apache Hive 读取的二进制文件。 并非二进制文件中的所有记录都具有相同的大小。
我发现 Hive 的默认 InputFormat CombineHiveInputFormat 没有将 getSplits
委托(delegate)给我的自定义 InputFormat 的实现,这会导致所有输入文件按常规 128MB 边界拆分。这样做的问题是这个拆分可能在记录的中间,所以除了第一个之外的所有拆分很可能看起来有损坏的数据。
我已经找到了一些解决方法,但我对其中任何一个都不满意。
一种解决方法是:
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
当使用 HiveInputFormat
而不是 CombineHiveInputFormat
时,对 getSplits
的调用被正确地委托(delegate)给了我的 InputFormat,一切都很好。但是,我想让其他用户可以轻松使用我的 InputFormat、OutputFormat 等,因此我宁愿不必经历这些。此外,如果可能的话,我希望能够利用组合拆分。
还有一个解决方法是创建一个 StorageHandler
。但是,我不想这样做,因为这使得所有由 StorageHandler 支持的表都不是本地的(因此所有 reducer 都写入一个文件,不能 LOAD DATA
到表中,以及其他细节我想从 native 表中保留)。
最后,我可以让我的 InputFormat 实现 CombineHiveInputFormat.AvoidSplitCombination
绕过大部分 CombineHiveInputFormat,但这仅在 Hive 1.0 中可用,我希望我的代码能够与早期版本的 Hive 一起使用(至少回到 0.12)。
我在这里的 Hive bug 跟踪器中提交了一张票,以防这种行为是无意的:https://issues.apache.org/jira/browse/HIVE-9771
有没有人编写过自定义 FileInputFormat
来覆盖 getSplits
以便与 Hive 一起使用?让 Hive 将调用委托(delegate)给您必须克服的 getSplits
是否遇到过任何问题?
最佳答案
通常在这种情况下,您不理会拆分,以便您可以获得 block 的数据局部性,并让您的 RecordReader
了解如何从 block 中的第一条记录开始读取(拆分)并读入下一个 block ,其中最终记录未在拆分的确切结束处结束。这需要进行一些远程读取,但这是正常的,而且通常非常少。
TextInputFormat
/LineRecordReader
执行此操作 - 它使用换行符来分隔记录,因此一条记录自然可以跨越两个 block 。它将遍历到拆分中的第一条记录,而不是从第一个字符开始,并且在最后一条记录上,如果需要,它将读入下一个 block 以读取完整数据。
Where LineRecordReader
starts the split by seeking past the current partial record.
Where LineRecordReader
ends the split by reading past the end of the current block.
希望这有助于指导您自定义代码的设计。
关于java - 自定义 InputFormat.getSplits() 从未在 Hive 中调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29133275/
我是 Hadoop 的新手,我正在尝试学习它并遇到了 InputFormat 的两个版本。 org/apache/hadoop/mapred/InputFormat org/apache/hadoop
我正在尝试创建一个仅生成数据而无需从外部读取数据的InputFormat。它从配置中读取关闭前要生成多少数据。这是为了帮助在非测试环境中分析OutputFormat。不幸的是,我找不到有关使用生成器I
尽管这是一个更笼统的问题,但我无法在此处找到有关特定情况的详细帮助。我有大量大文件(每个平均 2GB)。这些文件包含以自定义格式编码的条目,必须由另一个库读取以解析为单独的条目。现在我想用 MapRe
我有一个自定义的 MyInputFormat 可以处理 multi-lined inputs 的记录边界问题.但是当我将 MyInputFormat 放入我的 UDF 加载函数时。如下: import
我在 Hadoop 上开始使用我的第一个 map-reduce 代码时遇到问题。我从“Hadoop:权威指南”中复制了以下代码,但我无法在我的单节点 Hadoop 安装上运行它。 我的代码片段: 主要
我需要为 Hadoop MapReduce 应用程序实现自定义(服务)输入源。我 google 和 SO 发现继续进行的一种方法是实现自定义 InputFormat。对吗? 显然根据http://ha
假设我有两个文件,我想以不同的格式进行映射。一个是序列文件,另一个是纯文本文件。有没有办法分别为每个指定一个-inputFormat?或者我应该做些什么来映射两者? 最佳答案 这就是 Multiple
我正在使用 Hadoop,我必须创建自定义 InputFormat。 为此,我覆盖了 InputFormat 和 RecordReader 类,就像解释的那样 here 我想访问作业的配置(在运行作业
我正在尝试将键值数据库集成到 Spark 中并有一些问题。我是 Spark 初学者,阅读了很多书并运行了一些示例,但什么也没有复杂。 场景: 我正在使用小型 hdfs 集群将传入消息存储在数据库中。集
我正在为 Spark 开发一个文件解析器,它基本上可以一次读取 n 行,并将所有这些行作为数据帧中的一行放置。 我知道我需要使用 InputFormat 来尝试指定这一点,但我在 Python 中找不
我的 hadoop 作业需要知道每条记录的输入路径。 例如,假设我在 S3 对象集合上运行一个作业: s3://bucket/file1 s3://bucket/file2 s3://bucket/f
我正在尝试探索 Apache Spark,作为其中的一部分,我想自定义 InputFormat。就我而言,我想阅读 xml文件并转换每次出现的 到新记录。 我确实写了定制TextInputFormat
我想编写一个可以处理文本和 zip 文件的 MapReduce 应用程序。为此,我想使用不同的输入格式,一种用于文本,另一种用于 zip。有可能吗? 最佳答案 从@ChrisWhite 的回答中扩展一
我开发了一个 map-reduce 程序。我编写了自定义 RecordReader 和 InputFormat 类。 我正在使用 MR Unit 和 Mockito 对 mapper 和 reduce
考虑一个正在运行的 Hadoop 作业,其中自定义 InputFormat 需要向驱动程序类(即具有启 Action 业),从其覆盖的 getSplits() 方法中,使用新的 mapreduce A
我目前正在尝试将自定义 InputSplit 和 RecordReader 与 Apache Spark 的 SparkContext hadoopRDD() 函数结合使用。 我的问题如下: Inpu
我正在编写自定义 InputFormat(具体来说,org.apache.hadoop.mapred.FileInputFormat 的子类)、OutputFormat 和 SerDe,用于通过 Ap
我有一个应用程序需要读取一个文件,该文件是 ArrayList 的序列化结果。(ArrayList,此列表中有 50000 条记录,大小:20MB)我不知道如何将数据读入 hadoop 平台。我只是觉
我需要通过 Spark 处理一个 .warc 文件,但我似乎无法找到一种直接的方法。我宁愿使用 Python 而不是通过 wholeTextFiles() 将整个文件读入 RDD(因为整个文件将在单个
我正在做一个项目,使用cassandra 1.2,hadoop 1.2 我已经创建了我的普通 cassandra 映射器和缩减器,但我想创建我自己的输入格式类,它将从 cassandra 读取记录,我
我是一名优秀的程序员,十分优秀!