我用Java编写了一个UDF,我将其导出为Jar,然后在我的PySpark代码中使用它。
public class MyCustomLogic implements UDF1<WrappedArray<String>,String[]>,Serializable
{
private static final BigAIModel model = MyFactory.Loadmodel();
@Override
public String[] call(WrappedArray<String> rawTexts) {
int length = rawTexts.length();
String[] result = new String[length];
// iterate over rawTexts and for each text
{
result[i] = model.ConvertText(rawText);
}
}
}
虽然我通过概要分析观察到的一件事是,当此代码在具有8个具有16个核心的工作程序的集群中运行时,udf函数需要更长的时间才能在1000个字符串的数组上执行,然后在集群中16名工人和8个核心。
是因为static model
对象由每个工作程序中的所有执行者共享吗?并且由于上下文切换而需要更长的时间才能完成UDF?
如何优化UDF并提高性能?