Apaches HTTPClient timeout - ответное сообщение [duplicate]

monotonically_increasing_id() является , увеличивая и уникальным , но не последовательным .

Вы можете использовать zipWithIndex путем преобразования к rdd и восстановлению Dataframe с той же схемой для обоих dataframe.

import spark.implicits._


val df1 = Seq(
  ("karti", "9685684551", 24),
  ("raja", "8595456552", 22)
).toDF("Customer_name", "Customer_phone", "Customer_age")


val df2 = Seq(
  ("watch", 1),
  ("cattoy", 2)
).toDF("Order_name", "Order_ID")

val df11 = spark.sqlContext.createDataFrame(
  df1.rdd.zipWithIndex.map {
    case (row, index) => Row.fromSeq(row.toSeq :+ index)
  },
  // Create schema for index column
  StructType(df1.schema.fields :+ StructField("index", LongType, false))
)


val df22 = spark.sqlContext.createDataFrame(
  df2.rdd.zipWithIndex.map {
    case (row, index) => Row.fromSeq(row.toSeq :+ index)
  },
  // Create schema for index column
  StructType(df2.schema.fields :+ StructField("index", LongType, false))
)

Теперь соедините конечные кадры данных

df11.join(df22, Seq("index")).drop("index")

Выход:

+-------------+--------------+------------+----------+--------+
|Customer_name|Customer_phone|Customer_age|Order_name|Order_ID|
+-------------+--------------+------------+----------+--------+
|karti        |9685684551    |24          |watch     |1       |
|raja         |8595456552    |22          |cattoy    |2       |
+-------------+--------------+------------+----------+--------+
27
задан Nathan 2 September 2015 в 19:36
поделиться

2 ответа

Исключения, которые вы увидите, будут ConnectTimeoutException и SocketTimeoutException. Фактические значения тайм-аута, которые вы используете, должны быть максимальным временем ожидания вашего приложения. Важное примечание о тайм-ауте чтения заключается в том, что оно соответствует таймауту в считываемом сокете. Таким образом, не требуется время для получения полного ответа, а время, указанное для одного сокета. Таким образом, если есть 4 сокета, каждый из которых занимает 9 секунд, ваше общее время чтения составляет 9 * 4 = 36 секунд.

Если вы хотите указать общее время для ответа, чтобы получить (включая соединение и общее количество время чтения), вы можете обернуть вызов в потоке и использовать таймаут потока для этого. Например, я обычно делаю что-то вроде этого:

Future<T> future = null;
future = pool.submit(new Callable<T>() {
    public T call() {
        return executeImpl(url);
    }   
}); 

try {
    return future.get(10, TimeUnit.SECONDS);
}   
catch (InterruptedException e) {
    log.warn("task interrupted", name);
}   
catch (ExecutionException e) {
    log.error(name + " execution exception", e); 
}   
catch (TimeoutException e) {
    log.debug("future timed out", name);
}

Некоторые предположения, сделанные в коде выше: 1) это функция с параметром url, 2) она находится в классе с именем переменная, 3) log - это экземпляр log4j, а 4) пул - это исполнитель пула потоков. Обратите внимание, что даже если вы используете тайм-аут потока, вы также должны указать время ожидания подключения и сокета на HttpClient, чтобы медленные запросы не потребляли ресурсы в пуле потоков. Также обратите внимание, что я использую пул потоков, потому что, как правило, я использую это в веб-службе, поэтому пул потоков распределяется по цепочке потоков tomcat. Вы - среда, которая может быть другой, и вы можете просто создать новый поток для каждого вызова.

Кроме того, я обычно вижу таймауты, установленные через функции-члены параметров, например:

params.setConnectionTimeout(10000);
params.setSoTimeout(10000);

Но, возможно, ваш синтаксис работает (не уверен).

31
ответ дан Ion Cojocaru 28 August 2018 в 00:26
поделиться

Я предполагаю, что многие люди приходят сюда из-за названия и потому, что API HttpConnectionParams устарел.

Используя последнюю версию HTTP-клиента Apache, вы можете установить эти таймауты, используя параметры запроса:

HttpPost request = new HttpPost(url);

RequestConfig requestConfig = RequestConfig.custom()
  .setSocketTimeout(TIMEOUT_MILLIS)
  .setConnectTimeout(TIMEOUT_MILLIS)
  .setConnectionRequestTimeout(TIMEOUT_MILLIS)
  .build();

request.setConfig(requestConfig);

В качестве альтернативы вы также можете установить это при создании своего HTTP-клиента, используя API-интерфейс Builder для HTTP-клиента, но вам также потребуется создать настраиваемый диспетчер подключений с настраиваемой конфигурацией сокета .

Файл примера конфигурации - отличный ресурс, чтобы узнать, как настроить Apache HTTP Client.

52
ответ дан Nathan 28 August 2018 в 00:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: