我有一个使用Apache Flink编写的应用程序。它实现了基于信息论的特征选择方法。对于方法 mRMR ,我有两个DataSet<>
s - 一个,比如 A ,包含所选要素,另一个包含 B ,包含所有其他功能。当我选择一项功能时,我会从 B 中删除该功能,并将其添加到 A 。因此,我首先计算类和功能之间的互信息,然后选择具有最大互信息的功能,并将其添加到 A 。然后我有一个cross()
函数来计算 A 和 B 中所有要素之间的互信息。通过这样做,我可以调整 B 中所有功能的互信息,并为 A 选择新功能。我这样做了很多次,直到我选择想要的功能数量。我使用以下命令提交作业:
~/Programs/flink-1.4.0/bin/flink run -c org.apache.flink.feast.Main target/flink-feast-1.0.jar --method mrmr --top 5 --input ~/Datasets/00388/data_copy.txt --label 0
--top 5
参数用于传递我希望程序选择的功能数量。在我的测试数据集中,我有1024个功能。
现在,当我想选择5个功能时,效果很好。当我尝试选择15个功能时,作业提交需要10分钟,当我尝试选择20个功能时,需要花费更多时间。这种行为是否正常?如果不是,我该怎么办?我怀疑cross()
函数,它是提交需要很长时间,而不是执行。我试图增加作业和任务管理器的堆大小,但问题仍然存在。
谢谢。
答案 0 :(得分:0)
我不知道您的cross()
函数是什么,但在Flink运行作业之前,它看起来像是使用top
的值将运算符添加到Flink Operators Graph中。
根据我的经验,如果提交作业需要很长时间,那是因为操作员图表太复杂,所以Flink需要更多时间来探索可以应用的所有可行优化
例: 这需要更少的时间发送
source -> map -> keyBy -> windows -> reduce -> sink
比以下的复杂工作
/->filter->flatMap-> keyBy -> windows -> reduce-\
/-->filter->flatMap-> keyBy -> windows -> reduce--\
source -> map --->filter->flatMap-> keyBy -> windows -> reduce---> join -> sink
\-->filter->flatMap-> keyBy -> windows -> reduce--/
\->filter->flatMap-> keyBy -> windows -> reduce-/