我在自己的商店功能TestStorage中实现了一些逻辑。现在,我想在我的PIG脚本中多次调用此存储函数,并要求按顺序处理存储操作(!)。
一个例子:
STORE rows INTO 'dummy'
USING TestStorage;
STORE rows INTO 'dummy2'
USING TestStorage;
我认为PIG实际上是为每个商店操作启动两个线程。导致以下操作顺序:
Init TestStorage
Init TestStorage
Finished TestStorage
Finished TestStorage
如果我在本地模式下运行PIG脚本,我找到了一种方法。通过在我的TestStorage类中简单地使用ReentrentLock,我可以停止其中一个线程,直到另一个完成迭代遍历所有元组,给出了以下操作顺序:
Init TestStorage
Finished TestStorage
Init TestStorage
Finished TestStorage
然而,除了以上解决方案不是很好的事实,它不适用于我们的Hadoop集群:-(在我们的实时系统上,两个线程仍然并行工作。 也许这与存储函数在reducer任务中运行这一事实有关。
更新 我发现在一个reducer任务中,PIG迭代HDFS中的输入数据,并且每个元组将这个元组发送到第一个,然后发送到第二个存储实例。因此,两个商店运营将并行工作: - (
知道如何规避这个问题吗?例如,是否有一种方法可以将HDF中的文件用作第二次存储操作的输入?
提前致谢! 塞巴斯蒂安