thrift read tcp xxx->xxx i/o timeout()

本文记录了一次A模块通过Thrift调用B、B再调用C时遇到的问题:由于分支协议差异,字段名和序号不一致导致B到C的请求失败,引发B到A的timeout错误。作者对这种技术细节进行了深入剖析。

记录一下踩过的坑
有三个模块A,B,C. A通过thrift去调用B,B通过thrift调用C,B对A请求的内容不做任何修改,但是有个问题,A调用B,和B调C用的是thrift不同的分支,也就是两个协议会有一点差异,这时候如果A->B请求的字段名以及字段名的序号和B->C不同的话,调用就会出现thrift read tcp xxx->xxx i/o timeout。。。
很好奇为什么会报timeout,哪怕提示个参数不对,也不至于这问题搞两天。。。。。。。

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>hy-ifs</artifactId> <groupId>com.hy.ifs</groupId> <version>9.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>ifs-data</artifactId> <repositories> <!-- Cloudera仓库:用于获取CDH版本依赖 --> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <dependencies> <!-- 项目内部依赖 --> <dependency> <groupId>com.hy.base</groupId> <artifactId>hy-common</artifactId> <version>9.0-SNAPSHOT</version> </dependency> <!-- 第三方工具依赖 --> <dependency> <groupId>com.monitorjbl</groupId> <artifactId>xlsx-streamer</artifactId> <version>2.1.0</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> <!-- Nacos相关依赖 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${nacos.version}</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${nacos.version}</version> </dependency> <!-- Spring Boot相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- POI相关依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <!-- 其他业务依赖 --> <dependency> <groupId>com.kingee.sso</groupId> <artifactId>kingee-sso</artifactId> <version>1</version> </dependency> <dependency> <groupId>com.bip</groupId> <artifactId>bip-api</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.kingdell.hr</groupId> <artifactId>kingdell-hr</artifactId> <version>1</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.1.0</version> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </exclusion> </exclusions> </dependency> <!-- HDFS客户端(CDH 6.3.2) --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>3.0.0-cdh6.3.2</version> <classifier>cdh6.3.2</classifier> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.0.0-cdh6.3.2</version> <classifier>cdh6.3.2</classifier> </dependency> <!-- Hive相关依赖(CDH 6.3.2) --> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>2.1.1-cdh6.3.2</version> <classifier>cdh6.3.2</classifier> <exclusions> <!-- 排除日志冲突依赖 --> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-reload4j</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service</artifactId> <version>2.1.1-cdh6.3.2</version> <classifier>cdh6.3.2</classifier> <exclusions> <!-- 排除日志冲突依赖 --> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-reload4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service-rpc</artifactId> <version>2.1.1-cdh6.3.2</version> <classifier>cdh6.3.2</classifier> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-common</artifactId> <version>2.1.1-cdh6.3.2</version> <classifier>cdh6.3.2</classifier> </dependency> <!-- Thrift依赖(与CDH 6.3.2兼容) --> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.9.3</version> </dependency> <!-- HBase客户端(CDH 6.3.2) --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>2.1.0-cdh6.3.2</version> <classifier>cdh6.3.2</classifier> </dependency> </dependencies> </project> 未解析的依赖项: 'org.apache.hive:hive-service:jar:2.1.1-cdh6.3.2' 未解析的依赖项: 'org.apache.hive:hive-service-rpc:jar:2.1.1-cdh6.3.2' 未解析的依赖项: 'org.apache.hive:hive-common:jar:2.1.1-cdh6.3.2'
最新发布
09-10
<think> 我们正在解决Maven项目中Hive依赖未解析的问题。根据引用[2]和引用[3],我们知道CDH的依赖需要配置Cloudera仓库,并且需要注意镜像设置。 用户已经提供了未解析的依赖项,我们需要确保: 1. Maven配置了Cloudera仓库(如引用[2]所示)。 2. 镜像设置不能屏蔽Cloudera仓库(如引用[3]所示,使用mirrorOf时排除cloudera,即`*,!cloudera`)。 步骤: 1. 在pom.xml中添加Cloudera仓库。 2. 检查Maven的settings.xml文件,确保镜像设置不会覆盖Cloudera仓库(即使用`<mirrorOf>*,!cloudera</mirrorOf>`来排除对Cloudera仓库的镜像代理)。 具体操作如下: 第一步:在项目的pom.xml中,添加Cloudera仓库配置(如果还没有添加的话): ```xml <repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> ``` 第二步:检查Maven的settings.xml(在conf目录或用户目录的.m2目录下),确保镜像设置不会阻止访问Cloudera仓库。例如,使用阿里云镜像时,将镜像的mirrorOf设置为`*,!cloudera`,这样对Cloudera仓库的请求就不会被重定向到阿里云镜像(因为阿里云镜像没有CDH的构件)。 修改settings.xml中的镜像配置如下(参考引用[3]): ```xml <mirror> <id>nexus-aliyun</id> <mirrorOf>*,!cloudera</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> ``` 这样配置后,除了对Cloudera仓库(id为cloudera)的请求,其他请求都通过阿里云镜像。 第三步:在pom.xml中声明依赖。确保版本号是`2.1.1-cdh6.3.2`,并且groupId为`org.apache.hive`。 依赖示例: ```xml <dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service</artifactId> <version>2.1.1-cdh6.3.2</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service-rpc</artifactId> <version>2.1.1-cdh6.3.2</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-common</artifactId> <version>2.1.1-cdh6.3.2</version> </dependency> </dependencies> ``` 第四步:如果仍然无法下载,可以尝试手动下载这些依赖并安装到本地仓库(或搭建内部仓库)。 手动安装步骤(以hive-service为例): 1. 从Cloudera仓库下载jar包:访问 https://repository.cloudera.com/artifactory/cloudera-repos/org/apache/hive/hive-service/2.1.1-cdh6.3.2/ 下载hive-service-2.1.1-cdh6.3.2.jar。 2. 使用mvn install命令安装到本地仓库: ```bash mvn install:install-file -Dfile=hive-service-2.1.1-cdh6.3.2.jar \ -DgroupId=org.apache.hive \ -DartifactId=hive-service \ -Dversion=2.1.1-cdh6.3.2 \ -Dpackaging=jar ``` 对其他两个依赖执行同样的操作。 注意:手动安装是最后的手段,优先建议通过仓库配置解决。 最后,如果项目中有其他CDH依赖,建议统一版本(全部使用`2.1.1-cdh6.3.2`或相应组件的CDH6.3.2版本)。 参考引用[1]中提到了CDH6.3的部署,说明这些依赖确实存在于CDH6.3中,因此版本号正确。 如果问题仍然存在,可以运行以下命令检查依赖树: ```bash mvn dependency:tree ``` 或者尝试清除本地仓库中相关依赖的缓存(删除本地仓库中org/apache/hive目录下对应版本的文件),然后重新构建。 希望这些步骤能帮助您解决问题。 </think> ### 解决CDH6.3.2中Hive依赖未解析问题 #### 核心解决方案 按以下步骤配置Maven以解析CDH依赖: 1. **添加Cloudera仓库配置** 在`pom.xml`中添加专属仓库(关键步骤): ```xml <repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> ``` 2. **正确声明依赖项** 确保依赖版本严格匹配CDH6.3.2: ```xml <dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service</artifactId> <version>2.1.1-cdh6.3.2</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-service-rpc</artifactId> <version>2.1.1-cdh6.3.2</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-common</artifactId> <version>2.1.1-cdh6.3.2</version> </dependency> </dependencies> ``` 3. **优化镜像设置**(关键修复) 在`settings.xml`中配置镜像时排除Cloudera仓库: ```xml <mirror> <id>nexus-aliyun</id> <mirrorOf>*,!cloudera</mirrorOf> <!-- 排除Cloudera仓库 --> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> ``` #### 验证步骤 1. **依赖树检查**: ```bash mvn dependency:tree -Dincludes=org.apache.hive ``` 预期输出应包含: ``` [INFO] org.apache.hive:hive-service:jar:2.1.1-cdh6.3.2 [INFO] org.apache.hive:hive-service-rpc:jar:2.1.1-cdh6.3.2 [INFO] org.apache.hive:hive-common:jar:2.1.1-cdh6.3.2 ``` 2. **手动仓库验证**: 访问[Cloudera仓库](https://repository.cloudera.com/artifactory/webapp/#/artifacts/browse/tree/General/cloudera-repos/org/apache/hive)确认构件存在路径: ``` /org/apache/hive/hive-service/2.1.1-cdh6.3.2/ ``` #### 备选方案:手动安装 当网络受限时: ```bash mvn install:install-file \ -Dfile=hive-service-2.1.1-cdh6.3.2.jar \ -DgroupId=org.apache.hive \ -DartifactId=hive-service \ -Dversion=2.1.1-cdh6.3.2 \ -Dpackaging=jar ``` 需从CDH原始安装目录获取JAR: - CDH默认路径:`/opt/cloudera/parcels/CDH/lib/hive/lib/` #### 常见问题排查 1. **版本不匹配**:确认所有Hive依赖使用**相同版本后缀** `-cdh6.3.2` 2. **镜像覆盖**:检查`mirrorOf`是否包含`!cloudera`排除项 3. **本地缓存**:删除旧缓存 `.m2/repository/org/apache/hive` 后重试 > **重要提示**:CDH组件必须保持版本一致性,混合使用不同CDH版本会导致依赖地狱[^2][^3]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值