[Heron] 尝试使用IntelliJ IDEA提交Heron Topology

引入

在进行Twitter流式计算系统Heron的使用过程中,希望能够在IDE中进行Topology的编写和提交,以可以比较直接的进行Topology的运行测试。因此尝试使用IntelliJ IDEA进行WordCountTopology示例拓扑的提交。

如果是仅想知道这种尝试是否可行的读者,这里先进行回答Heron的CLI是不允许这种使用编程的方式部署Topology的,支持以命令行的方式进行Topology的部署。

主要内容:

  • 自己平常使用的是Windows 10系统环境,因此首先在Win10 OS中的IntelliJ IDEA 14,尝试进行Heron拓扑的编程式部署。
  • Win10中失败后,再次在Linux(CentOS 10)中进行了尝试。

结果发现,在Win10和Centos中的情况一样,均无法采用这种直接在IDE中以编程的方式部署Heron Topology,特记录如下。

导入Maven Project

在希望使用IDEA进行heron Topology的提交时,在github上获取到了一个简单搭建好的maven project:

StackOverFlow中的提问和回答:How to create a Twitter Heron project using IntelliJ IDEA on Windows 10?

Github的项目(称之为:开始项目):https://github.com/streamlio/heron-java-streamlet-api-example

导入该“开始项目”到IDEA:

To use the starter in IntelliJ, just click Import Project, select the cloned directory, select “Maven” under Import project from external model, and IntelliJ should take care of the rest.

安装Scala plugins

在IDEA中导入上述项目之后,在IDEA没有安装scala插件的情况下,进行maven build的时候,会出现:cannot find symbol错误提示。

解决方法:在IDEA中安装scala插件:IntelliJ IDEA安装Scala插件的具体步骤:[Spark] 使用IntelliJ IDEA与Maven开始Scala之旅中的第二部分(2)。

注意:因为在windows下的IDEA中配置运行过Spark的开发环境,因此scala插件和scala SDK在导入上述开始项目之前已经安装完成,因此没有出现错误。

但在CentOS系统环境的IDEA中导入项目之后,便出现了cannot find symbol的错误,多次查找和解决无果后,想到了scala的配置环境没有安装。尝试安装scala插件后,maven build成功完成!

注:在导入该开始项目之前,系统需配置jdk1.8(win10或centos中都需要配置),此外,在CentOS7系统环境中,安装IntelliJ IDEA 17详细情况:

尝试提交Heron Topology

在导入开始项目和maven import成功后,可以看到:

1. 该开始项目使用的heron版本为0.17.1(当前最新版本)已经和系统中安装的heron版本保持了一致(windows下无法部署安装heron集群,centos中完成)。

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <heron.version>0.17.1</heron.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.twitter.heron</groupId>
            <artifactId>heron-api</artifactId>
            <version>${heron.version}</version>
        </dependency>
    </dependencies>

2. 该项目中包含一个作者带有的一个Topology示例:WordCountStreamletTopology。

但这里不使用作者提供的示例拓扑,复制heron source源码文件中的示例拓扑:WordCountTopology到Idea中进行提交尝试。

因为文件的依赖,将ExampleResources和WordCountTopology一同复制到IDEA中的项目中,在WordCountTopology中运行main方法,得到的控制台输出结果如下(Win10和CentOS中同样):
Exception in thread “main” java.lang.RuntimeException: topology definition temp directory not specified
    at com.twitter.heron.api.HeronSubmitter.submitTopology(HeronSubmitter.java:97)
    at api.example.WordCountTopology.main(WordCountTopology.java:193)

进行Google后,发现相同的问题,回答如下(原文https://github.com/twitter/heron/issues/954):

The problem is that HeronSubmitter.java file only reads the command line parameters to deploy a topology. Therefore, I can not deploy a topology programmatically at run-time using Java.

AND: thanks for the snippet. We will look into this. In our use cases, we do not submit programmatically. Hence, we did not implement this functionality.

即:问题是HeronSubmitter.java文件只读取命令行参数来部署拓扑。因此,我无法在运行时使用Java以编程方式部署拓扑。

HeronSubmitter.java中内容如下:

       if (var3.get(“cmdline.topologydefn.tmpdirectory”) != null) {
            submitTopologyToFile(var5, var3);
        } else {
            throw new RuntimeException(“topology definition temp directory not specified”);
        }

结论

因此:使用编程式拓扑提交是暂时不可行的,但同时出现的疑问:既然无法使用IDE提交自己编写的Topology,那么如何更为方便的测试自己编写的Topology的正确性?更为基础的问题:Heron系统中如何编写自己的Topology?

参考资料