Java 来自spark map函数的HTTP调用确保HttpClient的单个实例
我有一个数据集,我必须为数据集的每一行调用一个API。我正在为此使用映射函数。 在map函数中,我执行API调用并返回一个新对象 我可以通过为每个调用创建新的HttpClient来进行API调用Java 来自spark map函数的HTTP调用确保HttpClient的单个实例,java,apache-spark,httpclient,Java,Apache Spark,Httpclient,我有一个数据集,我必须为数据集的每一行调用一个API。我正在为此使用映射函数。 在map函数中,我执行API调用并返回一个新对象 我可以通过为每个调用创建新的HttpClient来进行API调用 HttpClient=newdefaulthttpclient()客户端已初始化并在映射函数中使用 然而,当我尝试使用Http客户机的单个实例时,我的API调用失败 java.lang.IllegalStateException:BasicClientConnManager的使用无效:连接仍已分配。请确
HttpClient=newdefaulthttpclient()代码>客户端已初始化并在映射函数中使用
然而,当我尝试使用Http客户机的单个实例时,我的API调用失败
java.lang.IllegalStateException:BasicClientConnManager的使用无效:连接仍已分配。请确保在分配另一个连接之前释放该连接。
我使用以下方法来确保HttpClient的单个对象
private static HttpClient httpClient;
public static HttpClient gethttpClient() {
if (httpClient == null) {
httpClient = new DefaultHttpClient();
}
return httpClient;
}
并调用gethttpClient()进行GetAPI调用。然而,它给出了上述错误
在java spark中,从map函数调用API的正确方法是什么。看起来您希望避免过度创建HttpClient对象,因此该方法但唯一的解决方法是在批上迭代行,并为每个批使用新的DefaultHttpClient()
。
dataset
的类型为org.apache.spark.sql.dataset
dataset.foreachPartition( dataSetBatch -> {
DefaultHttpClient http = new DefaultHttpClient();
if(dataSetBatch.hasNext()) {
dataSetBatch.next();
// invoke submit hhtp request here
}
http.close();
});