牧场主模板 – Hadoop主机名中的非法字符

我们使用hadoop + yarn的rancher模板,但hadoop似乎无法处理使用容器名称作为主机名(例如, hadoop_namenode-primary_1 )。

 Caused by: java.net.URISyntaxException: Illegal character in hostname at index 13: http://hadoop_datanode_1:50075/webhdfs/v1/skystore/tmp/devtest_onedir/2016_08_19_02_35_35_32f7/header.json?op=CREATE&user.name=hdfs&namenoderpcaddress=10.42.14.252:8020&overwrite=true 

我做错了还是有一些解决方法?

正如我所看到的,问题是由于容器名称作为主机名造成的,而牧场主使用下划线创build容器。 不知道如何解决它,但…

Oracle bug数据库指出:根据RFC 2396,RFC 952和RFC 1123,Underscore不是主机名中的有效字符。请参阅下面的链接:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=5049974

更好的主意可能是用主机名称中的炒作replace下划线。

更新1:

hadoop无法处理使用容器名称作为主机名

不是这样。 它是关于主机名中的字符下划线。

更新2:

我们不知道如何强制牧民这样做

你不应该朝这个方向前进。 原因是,其他应用程序可能会抛出同样的exception,这又是一个麻烦。 最好的select是改变主机名称。

根据RFC 3986 ,下划线应该没有问题

2.3。 未保留的字符

URI 中允许使用但不具有保留目的的字符称为unreserved。 这些包括大写和小写字母,十进制数字,连字符,句点, 下划线和代字号。

unreserved = ALPHA / DIGIT /“ – ”/“。” /“_”/“〜”

再读一点,我们看到一个可能的解释,为什么事情正在打破

但是,比较之前,URI比较实现并不总是执行标准化

应该可以逃避这些字符,这意味着hadoop_datanode_1应该等同于hadoop%5Fdatanode%5F1 。 该文档明确表示,不要这样构build你的URI,至less我是这样读的。

为了一致性,在ALPHA(%41-%5A和%61-%7A),DIGIT(%30-%39),连字符(%2D),周期(%2E),下划线( % 5F )或代字号(%7E) 不应由URI生成器创build,并且在URI中find时应通过URI规范化器解码为其相应的未预留字符。