Java 来自spark map函数的HTTP调用确保HttpClient的单个实例

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的使用无效:连接仍已分配。请确

我有一个数据集,我必须为数据集的每一行调用一个API。我正在为此使用映射函数。 在map函数中,我执行API调用并返回一个新对象

我可以通过为每个调用创建新的HttpClient来进行API调用

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();

        });