更新时间:2024-08-05 GMT+08:00

Linux中未安装客户端时提交Storm拓扑

操作场景

Storm支持拓扑在未安装Storm客户端的Linux环境中运行。

前提条件

  • 客户端机器的时间与MRS集群的时间要保持一致,时间差要小于5分钟。
  • 当Linux环境所在主机不是集群中的节点时,需要在节点的hosts文件中设置主机名和IP地址映射。主机名和IP地址请保持一一对应。

操作步骤

  1. 准备依赖的Jar包和配置文件。

    在Linux环境新建目录,例如“/opt/test”,并创建子目录“lib”和“src/main/resources/”。将样例工程中“lib”文件夹下的Jar包上传Linux环境的“lib”目录。将样例工程中“src/main/resources”文件夹下的配置文件上传到Linux环境的“src/main/resources”目录。

  2. 在IntelliJ IDEA工程中修改WordCountTopology.java类,使用remoteSubmit方式提交应用程序。并替换用户keytab文件名称,用户principal名称,和Jar文件地址。

    • 使用remoteSubmit方式提交应用程序
      public static void main(String[] args) 
               throws Exception 
           { 
               TopologyBuilder builder = buildTopology(); 
                
               /* 
                * 任务的提交认为三种方式 
                * 1、命令行方式提交,这种需要将应用程序jar包复制到客户端机器上执行客户端命令提交 
                * 2、远程方式提交,这种需要将应用程序的jar包打包好之后在IntelliJ IDEA中运行main方法提交 
                * 3、本地提交 ,在本地执行应用程序,一般用来测试 
                * 命令行方式和远程方式安全和普通模式都支持 
                * 本地提交仅支持普通安全模式 
                *  
                * 用户同时只能选择一种任务提交方式,默认命令行方式提交,如果是其他方式,请删除代码注释即可 
                */ 
                
               submitTopology(builder, SubmitType.REMOTE); 
           }
    • 修改userJarFilePath为Linux环境指定路径“/opt/test/lib/example.jar”。
      private static void remoteSubmit(TopologyBuilder builder) 
               throws AlreadyAliveException, InvalidTopologyException, NotALeaderException, AuthorizationException, 
               IOException 
           { 
               Config config = createConf(); 
                
               String userJarFilePath = "/opt/test/lib/example.jar "; 
               System.setProperty(STORM_SUBMIT_JAR_PROPERTY, userJarFilePath); 
                
               //安全模式下的一些准备工作 
               if (isSecurityModel()) 
               { 
                   securityPrepare(config); 
               } 
               config.setNumWorkers(1); 
               StormSubmitter.submitTopologyWithProgressBar(TOPOLOGY_NAME, config, builder.createTopology()); 
           }
    • 安全模式下需要执行安全准备,根据实际情况修改userKeyTablePath和userPrincipal为导入并配置Storm样例工程章节的步骤2中所获取用户的keytab文件名称和principal。
      private static void securityPrepare(Config config) 
               throws IOException 
           { 
               String userKeyTablePath = 
                   System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "user.keytab"; 
               String userPrincipal = "StreamingDeveloper"; 
               String krbFilePath = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator +"krb5.conf"; 
                
               //windows路径下分隔符替换 
               userKeyTablePath = userKeyTablePath.replace("\\", "\\\\"); 
               krbFilePath = krbFilePath.replace("\\", "\\\\"); 
                
               String principalInstance = String.valueOf(config.get(Config.STORM_SECURITY_PRINCIPAL_INSTANCE)); 
               LoginUtil.setKrb5Config(krbFilePath); 
               LoginUtil.setZookeeperServerPrincipal("zookeeper/" + principalInstance); 
               LoginUtil.setJaasFile(userPrincipal, userKeyTablePath); 
           }

  3. 导出Jar包并上传到Linux环境。

    • 参考打包Storm样例工程应用执行打包,并将jar包命名为“example.jar”。
    • 将导出的Jar包复制到Linux环境的“/opt/test/lib”目录下。

  4. 切换到“/opt/test”,执行以下命令,运行Jar包。

    java -classpath /opt/test/lib/*:/opt/test/src/main/resources com.huawei.storm.example.wordcount.WordCountTopology