Flink hbase短路读取datanode报错?java.net.SocketTimeoutException: read(2) error: Resource temporarily unavailable
2024-05-20 08:22:25,735 WARN [RpcServer.default.RWQ.Fifo.read.handler=144,queue=12,port=16020] hdfs.BlockReaderFactory: BlockReaderFactory(fileName=/hbase/data/default/alerts/6aedb1697e29f1e4be88996849fbb716/data/e20886e05d7b4fbcac8e209800a76709, block=BP-1719712434-10.80.10.150-1522218330932:blk_1589343399_515603961): I/O error requesting file descriptors. Disabling domain socket DomainSocket(fd=753,path=/var/lib/hadoop-hdfs/dn_socket)
java.net.SocketTimeoutException: read(2) error: Resource temporarily unavailable
at org.apache.hadoop.net.unix.DomainSocket.readArray0(Native Method)
at org.apache.hadoop.net.unix.DomainSocket.access$000(DomainSocket.java:45)
at org.apache.hadoop.net.unix.DomainSocket$DomainInputStream.read(DomainSocket.java:532)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at org.apache.hadoop.hdfs.protocolPB.PBHelper.vintPrefixed(PBHelper.java:2292)
at org.apache.hadoop.hdfs.BlockReaderFactory.requestFileDescriptors(BlockReaderFactory.java:542)
at org.apache.hadoop.hdfs.BlockReaderFactory.createShortCircuitReplicaInfo(BlockReaderFactory.java:490)
at org.apache.hadoop.hdfs.shortcircuit.ShortCircuitCache.create(ShortCircuitCache.java:782)
at org.apache.hadoop.hdfs.shortcircuit.ShortCircuitCache.fetchOrCreate(ShortCircuitCache.java:716)
at org.apache.hadoop.hdfs.BlockReaderFactory.getBlockReaderLocal(BlockReaderFactory.java:422)
at org.apache.hadoop.hdfs.BlockReaderFactory.build(BlockReaderFactory.java:333)
at org.apache.hadoop.hdfs.DFSInputStream.actualGetFromOneDataNode(DFSInputStream.java:1161)
at org.apache.hadoop.hdfs.DFSInputStream.fetchBlockByteRange(DFSInputStream.java:1086)
at org.apache.hadoop.hdfs.DFSInputStream.pread(DFSInputStream.java:1439)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:1402)
at org.apache.hadoop.fs.FSDataInputStream.read(FSDataInputStream.java:89)
at org.apache.hadoop.hbase.io.hfile.HFileBlock.positionalReadWithExtra(HFileBlock.java:805)
at org.apache.hadoop.hbase.io.hfile.HFileBlock$FSReaderImpl.readAtOffset(HFileBlock.java:1565)
at org.apache.hadoop.hbase.io.hfile.HFileBlock$FSReaderImpl.readBlockDataInternal(HFileBlock.java:1769)
at org.apache.hadoop.hbase.io.hfile.HFileBlock$FSReaderImpl.readBlockData(HFileBlock.java:1594)
at org.apache.hadoop.hbase.io.hfile.HFileReaderImpl.readBlock(HFileReaderImpl.java:1488)
at org.apache.hadoop.hbase.io.hfile.HFileBlockIndex$CellBasedKeyBlockIndexReader.loadDataBlockWithScanInfo(HFileBlockIndex.java:340)
at org.apache.hadoop.hbase.io.hfile.HFileReaderImpl$HFileScannerImpl.seekTo(HFileReaderImpl.java:852)
at org.apache.hadoop.hbase.io.hfile.HFileReaderImpl$HFileScannerImpl.seekTo(HFileReaderImpl.java:802)
at org.apache.hadoop.hbase.regionserver.StoreFileScanner.seekAtOrAfter(StoreFileScanner.java:326)
at org.apache.hadoop.hbase.regionserver.StoreFileScanner.seek(StoreFileScanner.java:227)
at org.apache.hadoop.hbase.regionserver.StoreFileScanner.enforceSeek(StoreFileScanner.java:470)
at org.apache.hadoop.hbase.regionserver.KeyValueHeap.pollRealKV(KeyValueHeap.java:369)
at org.apache.hadoop.hbase.regionserver.KeyValueHeap.(KeyValueHeap.java:103)
at org.apache.hadoop.hbase.regionserver.KeyValueHeap.(KeyValueHeap.java:81)
at org.apache.hadoop.hbase.regionserver.StoreScanner.resetKVHeap(StoreScanner.java:407)
at org.apache.hadoop.hbase.regionserver.StoreScanner.(StoreScanner.java:257)
at org.apache.hadoop.hbase.regionserver.MobStoreScanner.(MobStoreScanner.java:44)
at org.apache.hadoop.hbase.regionserver.HMobStore.createScanner(HMobStore.java:159)
at org.apache.hadoop.hbase.regionserver.HStore.getScanner(HStore.java:1943)
at org.apache.hadoop.hbase.regionserver.HRegion$RegionScannerImpl.initializeScanners(HRegion.java:6181)
at org.apache.hadoop.hbase.regionserver.HRegion$RegionScannerImpl.(HRegion.java:6161)
at org.apache.hadoop.hbase.regionserver.HRegion.instantiateRegionScanner(HRegion.java:2809)
java.net.SocketTimeoutException: read(2) error: Resource temporarily unavailable 这个错误通常表明在尝试从Hadoop的HDFS(Hadoop Distributed FileSystem)的DataNode读取数据时,客户端(在这个上下文中是Flink作业或HBase客户端)遇到了网络问题或HDFS DataNode无法及时响应读取请求。
这个问题可能由多种原因引起,以下是一些排查和解决问题的步骤:
网络问题:
检查Flink作业所在的机器和HDFS DataNode之间的网络连接。
确保没有防火墙或网络ACLs阻止它们之间的通信。
尝试ping DataNode的IP地址,看是否有丢包或延迟。
HDFS性能问题:
检查HDFS集群的健康状况和性能指标,如磁盘I/O、CPU和内存使用情况。
查看DataNode的日志,看是否有相关错误或警告。
如果HDFS集群负载很高,可能需要增加资源或优化作业以减少对HDFS的压力。
HBase和HDFS配置:
确保HBase和HDFS的配置文件(如hbase-site.xml和hdfs-site.xml)中的设置是合理的,特别是与I/O、超时和重试相关的设置。
检查是否有任何自定义配置可能导致此问题。
Flink配置:
查看Flink作业的配置,特别是与HDFS和HBase交互的部分。
尝试调整与超时相关的配置,如taskmanager.network.timeout。
HBase短路读取(Short-circuit Reads):
短路读取是HBase为了优化读取性能而引入的一个特性,允许HBase客户端直接从DataNode读取数据,而不需要经过NameNode。
如果短路读取配置不当或存在兼容性问题,可能会导致上述错误。检查HBase和HDFS的版本兼容性,并确认短路读取的配置是否正确。
HDFS DataNode问题:
如果某个DataNode出现问题(如磁盘故障、内存不足等),它可能无法及时响应读取请求。
使用Hadoop的管理工具(如Hadoop Admin UI或命令行工具)来检查DataNode的健康状况和状态。
如果需要,重新启动有问题的DataNode或整个HDFS集群。
日志分析:
仔细分析Flink、HBase和HDFS的日志文件,以获取更多关于错误的详细信息。
注意任何与网络连接、I/O错误、超时或重试相关的日志条目。
资源竞争:
如果集群中的多个作业同时运行并争用相同的资源(如CPU、内存、磁盘I/O或网络带宽),可能会导致性能下降和超时错误。
尝试调整作业的执行计划或资源分配,以减少资源竞争。
升级和补丁:
确保你正在使用的Flink、HBase和HDFS的版本都是最新的,或者已经应用了所有相关的安全补丁和性能改进。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。