WebHDFS在C#中无法访问Hortonworks目录,curl可正常运行求助
解决C#调用WebHDFS接口连接超时问题(沙箱curl正常但代码失败)
我之前也碰到过类似的棘手情况——沙箱里用curl调用WebHDFS顺风顺水,本地笔记本的C#代码却死活连不上,给你分析下可能的原因和对应的解决办法:
先贴一下你提供的代码方便参考:
static void Main(string[] args) { Uri myUri = new Uri("http://hostname:50070/webhdfs/v1/user/hive/warehouse"); string userName = "myuser"; WebHDFSClient hdfsClient = new WebHDFSClient(myUri, userName); string strDirectoryPath= "/user/hive/warehouse"; ArrayList l = new ArrayList(); l.Add(hdfsClient.GetDirectoryStatus( strDirectoryPath).Result.Directories); }
首先排查最常见的网络问题
沙箱和本地笔记本之间的网络连通性是第一要检查的:
- 先在本地cmd里跑
curl http://[沙箱实际IP]:50070/webhdfs/v1/user/hive/warehouse?op=LISTSTATUS,把hostname换成沙箱的真实IP(比如192.168.1.100),看看能不能拿到响应。如果curl都失败,那就是网络层面的问题:- 检查沙箱的防火墙/安全组,确保50070端口对本地IP开放(沙箱里可以用
iptables -L查看规则) - 如果是虚拟机沙箱,确认网络模式是桥接(或者NAT端口转发规则正确配置了50070端口)
- 本地ping一下沙箱IP,看看能不能通,不通的话先解决网络连通问题
- 检查沙箱的防火墙/安全组,确保50070端口对本地IP开放(沙箱里可以用
然后看C#代码的异步调用问题
你直接用.Result阻塞获取异步结果,这种写法在控制台程序里很容易导致死锁或者超时,建议改成异步Main方法用await调用:
static async Task Main(string[] args) { // 这里换成沙箱的实际IP,避免hostname解析问题 Uri myUri = new Uri("http://192.168.x.x:50070/webhdfs/v1/user/hive/warehouse"); string userName = "myuser"; WebHDFSClient hdfsClient = new WebHDFSClient(myUri, userName); string strDirectoryPath= "/user/hive/warehouse"; // 用await替代.Result,避免阻塞死锁 var directoryStatus = await hdfsClient.GetDirectoryStatus(strDirectoryPath); ArrayList l = new ArrayList(); l.Add(directoryStatus.Directories); }
记得把项目的C#语言版本设置为7.1及以上,这样才能支持异步Main方法。
额外检查WebHDFS的配置和请求参数
- 确认沙箱里HDFS的
dfs.webhdfs.enabled配置项是true,并且dfs.namenode.http-address绑定的是0.0.0.0(允许外部访问),而不是仅localhost - 可以用Fiddler抓包看看C#代码发送的请求是不是正确带了WebHDFS必需的
op参数(比如LISTSTATUS),有时候客户端封装可能会遗漏参数,导致服务端不响应进而超时
内容的提问来源于stack exchange,提问作者user3843858
相关产品推荐
相关产品推荐

