在"Big Data" Lambda Architecture book之后,我有一个传入的目录,里面装满了所有类型的Thift Data对象,并且定义了一个DataPailStructure pail.meta文件
我拍摄了这些数据的快照:
Pail snapshotPail = newDataPail.snapshot(PailFactory.snapshot);
传入的文件和元数据文件是重复的,pail.meta文件也有
structure: DataPailStructure
现在我想要粉碎这些数据,将其拆分为垂直分区。从本书开始,我创建了两个PailTap对象,一个用于Snapshot和SplitDataStructure,一个用于新的 Shredded 文件夹。
PailTap source = dataTap(PailFactory.snapshot);
PailTap sink = splitDataTap(PailFactory.shredded);
/ Shredded 文件夹中有一个包含structure: SplitDataPailStructure
的pail.meta文件
按照说明执行JCascalog查询以强制执行reducer:
Api.execute(sink, new Subquery(data).predicate(reduced, empty, data));
现在,在本地模式下,这很好用。在/ Shredded下创建了一个“临时”子文件夹,并使用预期的“1/1”结构进行垂直分区。在本地模式下,然后将其移至/ Shredded文件夹,我可以合并并合并到主服务器。
但是在Hadoop中运行,此时它失败了,出现错误:
cascading.tuple.TupleException: unable to sink into output identifier: /tmp/swa/shredded
...
Caused by: java.lang.IllegalArgumentException: 1/1/part-000000 is not valid with the pail structure {structure=com.hibu.pail.SplitDataPailStructure, args={}, format=SequenceFile} --> [1, _temporary, attempt_1393854491571_12900_r_000000_1, 1, 1] at com.backtype.hadoop.pail.Pail.checkValidStructure(Pail.java:563)
毋庸置疑,如果我将Shredded Sink结构类型更改为DataPailStructure,那么它工作正常,但这是一个相当无意义的操作,因为所有内容都与Incoming文件夹中的一样。现在没关系,因为我只使用一种数据类型,但这很快就会改变,我需要这个分区。
有什么想法吗?我最初不想在这里发布我的所有源代码,但我几乎肯定错过了一些东西。