我有一个使用Kafka Logs并将其写入HDFS的Apache Apex应用程序。
DAG非常简单,有一个Kafka Consumer(20个2 GB内存供运营商使用)通过流连接到" MyWriter扩展了AbstractFileOutputOperator"。
问题: 1.我一直看到Writer多次重复写入相同大小和相同数据的.tmp文件。我已经尝试增加写入操作员内存,增加了Writer等的分区数量。仍然这个问题不断发生。
我尝试添加/删除requestFinalize给MyWriter。还是同样的问题。
@Override
public void endWindow()
{
if (null != fileName) {
requestFinalize(fileName);
}
super.endWindow();
}
这是我的properties.xml的一个子集
<property>
<name>dt.attr.STREAMING_WINDOW_SIZE_MILLIS</name>
<value>1000</value>
</property>
<property>
<name>dt.application.myapp.operator.*.attr.APPLICATION_WINDOW_COUNT</name>
<value>60</value>
</property>
<property>
<name>dt.application.myapp.operator.*.attr.CHECKPOINT_WINDOW_COUNT</name>
<value>60</value>
</property>
<property>
<name>dt.application.myapp.operator.myWriter.attr.PARTITIONER</name>
<value>com.datatorrent.common.partitioner.StatelessPartitioner:20</value>
</property>
<property>
<name>dt.application.myapp.operator.myWriter.prop.maxLength</name>
<value>1000000000</value> <!-- 1 GB File -->
</property>
这是我能从运营商的dt.log获得的堆栈跟踪: 操作员可能在不同的contianers中重新部署,抛出此异常并继续写入重复文件。
java.lang.RuntimeException: java.io.FileNotFoundException: File does not exist: /kafkaconsumetest/inventoryCount/nested/trial2/1471489200000_1471489786800_161.0.1471489802786.tmp
at com.datatorrent.lib.io.fs.AbstractFileOutputOperator.setup(AbstractFileOutputOperator.java:418)
at com.datatorrent.lib.io.fs.AbstractFileOutputOperator.setup(AbstractFileOutputOperator.java:112)
at com.datatorrent.stram.engine.Node.setup(Node.java:187)
at com.datatorrent.stram.engine.StreamingContainer.setupNode(StreamingContainer.java:1309)
at com.datatorrent.stram.engine.StreamingContainer.access$100(StreamingContainer.java:130)
at com.datatorrent.stram.engine.StreamingContainer$2.run(StreamingContainer.java:1388)
Caused by: java.io.FileNotFoundException: File does not exist: /kafkaconsumetest/inventoryCount/nested/trial2/1471489200000_1471489786800_161.0.1471489802786.tmp
at org.apache.hadoop.hdfs.DistributedFileSystem$19.doCall(DistributedFileSystem.java:1219)
at org.apache.hadoop.hdfs.DistributedFileSystem$19.doCall(DistributedFileSystem.java:1211)
at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1211)
at com.datatorrent.lib.io.fs.AbstractFileOutputOperator.setup(AbstractFileOutputOperator.java:411)
... 5 more
2016-08-17 22:17:01,108 INFO com.datatorrent.stram.engine.StreamingContainer: Undeploy request: [161, 177]
2016-08-17 22:17:01,116 INFO com.datatorrent.stram.engine.StreamingContainer: Undeploy complete.
2016-08-17 22:17:02,121 INFO com.datatorrent.stram.engine.StreamingContainer: Waiting for pending request.
2016-08-17 22:17:02,625 INFO com.datatorrent.stram.engine.StreamingContainer: Waiting for pending request.
2016-08-17 22:17:03,129 INFO com.datatorrent.stram.engine.StreamingContainer: Waiting for pending request.
答案 0 :(得分:1)
基本运算符的代码位于以下链接中,并在中引用 评论如下: https://github.com/apache/apex-malhar/blob/master/library/src/main/java/com/datatorrent/lib/io/fs/AbstractFileOutputOperator.java
通过将最大文件大小设置为1GB,您可以自动启用滚动文件;相关领域是:
Z=[X11/Y1 X21/X11/Y1 X31/X11/Y1;X12/Y2 X22/Y2 X32/Y2;X13/Y3 X23/Y3 X33/Y3]
如果前者的值小于默认值protected Long maxLength = Long.MAX_VALUE;
protected transient boolean rollingFile = false;
,则后者在setup()
方法中设置为true。
启用滚动文件后,文件终结会自动完成,因此您不应该致电Long.MAX_VALUE
。
其次,在requestFinalize()
类中,删除MyWriter
覆盖,并确保在endWindow()
方法中创建包含运算符ID的所需文件名,并返回此文件名setup()
覆盖;这可以确保多个分区程序不会相互踩踏。例如:
getFileName()
文件基本名称(上面代码中的@NotNull
private String fileName; // current base file name
private transient String fName; // per partition file name
@Override
public void setup(Context.OperatorContext context)
{
// create file name for this partition by appending the operator id to
// the base name
//
long id = context.getId();
fName = fileName + "_p" + id;
super.setup(context);
LOG.debug("Leaving setup, fName = {}, id = {}", fName, id);
}
@Override
protected String getFileName(Long[] tuple)
{
return fName;
}
)可以直接在代码中设置,也可以从XML文件中的属性初始化(您还需要为它添加一个getter和setter)
您可以在以下位置查看此类用法的示例: https://github.com/DataTorrent/examples/tree/master/tutorials/fileOutput
其他一些建议:
fileName
属性的XML)并确保一切按预期工作。这将消除任何与分区无关的问题。如果可能的话,还要将最大文件大小减小到2K或4K,这样测试就更容易了。