Не удалось выполнить HTTP-запрос: Broken Pipe с Hadoop/s3 в Amazon EMR

Я разработал собственный JAR-файл, который использую для обработки данных в Elastic MapReduce. Данные представляют собой несколько сотен тысяч файлов, поступающих с Amazon S3. JAR не делает ничего ужасного для чтения данных - он просто использует CombineFileInputFormat.

Когда я запускаю задание с небольшим количеством тестовых данных, все выполняется безупречно. Однако, когда я запускаю его со своим полным набором данных, (случайным) количеством времени в моей работе, я сталкиваюсь с какой-то ошибкой HTTP или сокета, которая, по-видимому, не обрабатывается должным образом.

Во время одной работы я получил следующее в SYSLOG:

2015-11-16 21:47:17,504 INFO com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem (main): exhausted retry un-registered class com.amazonaws.AmazonClientException
2015-11-16 21:47:17,504 INFO org.apache.hadoop.mapreduce.JobSubmitter (main): Cleaning up the staging area /tmp/hadoop-yarn/staging/hadoop/.staging/job_1447686616083_0001

Это сопровождалось следующим в стандартной ошибке:

Exception in thread "main" com.amazonaws.AmazonClientException: Unable to execute HTTP request: Remote host closed connection during handshake

Второе задание вызвало аналогичную ошибку в SYSLOG, но я получил это в стандартной ошибке:

Exception in thread "main" com.amazonaws.AmazonClientException: Unable to execute HTTP request: Broken pipe

(Полная трассировка стека приведена внизу.)

Я построил это для Hadoop 2.6.0 и использую последнюю сборку AWS для Hadoop 2.6.0, поэтому я не уверен, что вызывает эти ошибки. Есть ли у кого-нибудь идеи о том, как я могу приступить к устранению неполадок?

Exception in thread "main" com.amazonaws.AmazonClientException: Unable to execute HTTP request: Broken pipe
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:500)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:310)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3604)
    at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:999)
    at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:977)
    at com.amazon.ws.emr.hadoop.fs.s3n.Jets3tNativeFileSystemStore.retrieveMetadata(Jets3tNativeFileSystemStore.java:199)
    at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:190)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:103)
    at com.sun.proxy.$Proxy21.retrieveMetadata(Unknown Source)
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.listStatus(S3NativeFileSystem.java:907)
    at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.listStatus(S3NativeFileSystem.java:892)
    at com.amazon.ws.emr.hadoop.fs.EmrFileSystem.listStatus(EmrFileSystem.java:343)
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1498)
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1505)
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1505)
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1524)
    at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1569)
    at org.apache.hadoop.fs.FileSystem$4.<init>(FileSystem.java:1746)
    at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:1745)
    at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:1723)
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:299)
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:263)
    at org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat.getSplits(CombineFileInputFormat.java:177)
    at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:493)
    at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:510)
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:394)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1285)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1282)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1548)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1282)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1303)
    at com.rw.legion.Legion.main(Legion.java:103)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
Caused by: java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
    at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:377)
    at sun.security.ssl.OutputRecord.write(OutputRecord.java:363)
    at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:837)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:808)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:679)
    at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:999)
    at sun.security.ssl.ClientHandshaker.sendChangeCipherAndFinish(ClientHandshaker.java:1161)
    at sun.security.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:1073)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:341)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:901)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:837)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1023)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:535)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:403)
    at com.amazonaws.http.conn.ssl.SdkTLSSocketFactory.connectSocket(SdkTLSSocketFactory.java:128)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
    at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:728)
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:489)
    ... 41 more

person John Chrysostom    schedule 18.11.2015    source источник
comment
Мы также заметили, что подключение S3 от EMR иногда может быть ненадежным. В нашем случае между EMR и S3 есть брандмауэр NAT (который мы планируем удалить). Мы просто повторяем. У вас есть такая нетипичная топология сети?   -  person user1452132    schedule 20.11.2015
comment
Также на forums.aws.amazon.com/thread.jspa?threadID= 220143&tstart=0   -  person ChristopherB    schedule 21.11.2015


Ответы (1)


Установите следующую конфигурацию клиента amazon, чтобы увеличить время ожидания. Тайм-аут интернета может быть проблемой для той же ситуации.

configuration.setMaxErrorRetry(3);
configuration.setConnectionTimeout(50*1000);
configuration.setSocketTimeout(50*1000);
configuration.setProtocol(Protocol.HTTP);

Кроме того, вам необходимо проверить наличие сертификатов, разрешенных для подключения.

person Akarsh Agrawal    schedule 20.05.2017