2015-10-16 147 views
1

我想在使用Eclipse的远程主机上提交Storm拓扑。无法提交风暴拓扑

这里是我的代码:

Config conf = new Config(); 
conf.setDebug(false); 
conf.setNumWorkers(1); 
conf.put(Config.NIMBUS_HOST, "hostName"); 
conf.put(Config.NIMBUS_THRIFT_PORT,6627); 
conf.put(Config.STORM_ZOOKEEPER_SERVERS,Arrays.asList(new String[]{"hostName"})); 
conf.put(Config.STORM_ZOOKEEPER_PORT,2181); 

// Remote submission 
StormSubmitter.submitTopology("classMain", conf, topology); 

但我得到这个异常:

Exception in thread "main" java.lang.RuntimeException: org.apache.thrift7.TApplicationException: Binary field exceeded string size limit 
    at backtype.storm.StormSubmitter.submitTopologyAs(StormSubmitter.java:250) 
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:271) 
    at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:157) 
    at com.rbc.rbccm.hackathon.Countersearch.submitTopology(Countersearch.java:111) 
    at com.rbc.rbccm.hackathon.Countersearch.main(Countersearch.java:37) 
Caused by: org.apache.thrift7.TApplicationException: Binary field exceeded string size limit 
    at org.apache.thrift7.TApplicationException.read(TApplicationException.java:111) 
    at org.apache.thrift7.TServiceClient.receiveBase(TServiceClient.java:71) 
    at backtype.storm.generated.Nimbus$Client.recv_submitTopology(Nimbus.java:184) 
    at backtype.storm.generated.Nimbus$Client.submitTopology(Nimbus.java:168) 
    at backtype.storm.StormSubmitter.submitTopologyAs(StormSubmitter.java:236) 
... 4 more 

是存在于我们可以传递给submitTopology函数的参数字符串大小限制?

当我跟随线索多一点,它会导致:

public void submitTopology(String name, String uploadedJarLocation, String jsonConf, StormTopology topology) throws AlreadyAliveException, InvalidTopologyException, AuthorizationException, org.apache.thrift.TException 
{ 
    send_submitTopology(name, uploadedJarLocation, jsonConf, topology); 
    recv_submitTopology(); 
} 

recv导致问题。有什么想法吗?

+1

jar文件的绝对路径名有多长? –

+0

“C:\\ adasd \\ sdsd \\ workspace \\ adasdasdsadsad \\ target \\ sample-mainClass-0.0.1.jar” 是否太长? – AbtPst

+0

当您尝试使用命令行客户端将您的jar上传到Storm拓扑时会发生什么? – morganw09dev

回答

1

您需要增加nimbus.thrift.max_buffer_size参数。您可以将其设置为storm.yamlConfig对象。

+0

谢谢!那工作。 – AbtPst

+0

感谢Matthias,但是由于max_buffer_size现在已被弃用(https://storm.apache.org/releases/1.0.0/javadocs/org/apache/storm/Config.html#NIMBUS_THRIFT_MAX_BUFFER_SIZE),现在该如何解决问题?我遇到了同样的错误。 – Nav

+0

问题是你的非常大的jar文件。 Storm 1.0引入了一个分布式缓存https://storm.apache.org/releases/1.0.0/distcache-blobstore.html我从来没有尝试过,但你应该能够在那里上传你的jar文件(而不是通过Nimbus传输它。 –

0

如果你看到在风暴的源代码的代码在StormSubmitter.java,那就是:

public static void submitTopology(String name, Map stormConf, StormTopology topology) 
     throws AlreadyAliveException, InvalidTopologyException, AuthorizationException { 
    submitTopology(name, stormConf, topology, null, null); 
} 

节俭错误是因为无论是name指定太长(大于2MB的?)或stormConf有太多的的信息或有更可能的原因,这就是当topology创建时,您填充Spout或Bolt实例太多的信息。

在我的情况下,我创建了一个螺栓,我正在初始化太多的数据。

builder.setBolt(genBolt, new GenBolt(myTable1.getHashMap(), myTable2.getHashMap(), myTable3.getHashMap(), myTable4.getHashMap()), 2) 
    .fieldsGrouping(iterSpout, new Fields(con.BATCH_ID))