HTTP-вызовы из функции карты искр, обеспечивающей единичный экземпляр HttpClient - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть набор данных, и я должен вызывать API для каждой строки набора данных. Я использую функцию карты для этого. Внутри функции map я выполняю вызов API и возвращаю новый объект.

Я могу выполнять вызовы API, создавая новый HttpClient для каждого вызова.

HttpClient client = new DefaultHttpClient(); клиент инициализируется и используется внутри функции карты,

Однако, когда я пытаюсь использовать один экземпляр Http Client, мои вызовы API завершаются с ошибкой.

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.Make sure to release the connection before allocating another one.

Я использую следующий подход для обеспечения единственного объекта HttpClient.

    private static HttpClient httpClient;
    public static HttpClient gethttpClient() {
        if (httpClient == null) {
            httpClient = new DefaultHttpClient();
        }
        return httpClient;
    }

И вызов gethttpClient () для вызовов API getmake. Тем не менее он выдает вышеуказанную ошибку.

Какой может быть правильный способ выполнения вызовов API из функции карты в java spark.

1 Ответ

1 голос
/ 30 апреля 2020

Похоже, что вы хотите избежать избыточного создания объектов HttpClient, поэтому единственный выход из этого метода - это итерация строк в пакетах и ​​использование new 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();

        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...