webstart部署hadoop client应用

注:下文中,jcontrol,配置java,java控制面板这同一个东西的三个名称,下文统一叫jcontrol。

 

基本知识: http://moron.iteye.com/blog/611967

假设我们给程序签名的私钥和证书对叫做appsigner。

感觉最佳的方式还是自己制作CA,一方面所有用户把CA的证书通过jcontrol导入为信任的CA,一方面用CA的密钥给appsigner的证书签名。

然后程序发布时会附带CA签名的appsigner的证书,程序用appsigner的私钥签名,这种方式是能回避各种安全中最理想的方式。

 

建议用netbeans之类的IDE来构建程序和jnlp文件等,自己手动搞坑太多,比如主类的jar包的manifest中要和jnlp一样都设置上all-permissions,用IDE就能自动帮你解决这些事情。

 

JNLP的类加载器还会有一些意料不到的情况,比如我本地运行好好的hadoop client应用,一部署到webstart上就会报No FileSystem for scheme: hdfs的错误。这时候在jcontrol→高级→Java控制台→显示控制台,可以在运行webstart应用的时候,显示一个带各种stdout stderr信息的控制台,帮助你调试。

当然上文说的这个错误的解决方式是 http://stackoverflow.com/questions/17265002/hadoop-no-filesystem-for-scheme-file ,虽然看起来好像不是一个情况,但是确实解决了(摊手。

 

还有一个跟webstart无关的问题:当我们在一台服务器上部署运行了我们的hadoop client应用,有时候会报什么临时目录xxx不可用的错误,检查xxx发现确实不可用,因为一般hadoop集群用的是用户例如hdfs来运行的,而我们的hadoop client应用的用户只是一个实际用户例如tom。这时候在hadoop client的代码中,重新设置hadoop.tmp.dir给一个别的目录就能回避这个问题了。

以下代码演示了配置hadoop client,一个是HA集群的处理(故意不使用HA),一个是临时目录的处理,这两个选项的开启需要给jvm传递参数。

而作为hadoop jar client.jar来启动的client,只能通过环境变量HADOOP_CLIENT_OPTS="-DCustomTempDir=/somewhere/"来设置jvm参数。

此外HADOOP_USER_NAME环境变量可以设置hadoop以为的运行用户。

 

        Configuration cfg = new Configuration(); // core-default.xml and core-site.xml
        cfg.addResource("hdfs-site.xml"); // to detect HA configuration
        boolean fsReCfged = false;
        final String clusterName = cfg.get("dfs.nameservices");
        final String keyDefaultFS = "fs.defaultFS";
        final String defaultFS = cfg.get(keyDefaultFS);
        if (clusterName != null) {
            final String nnList = cfg.get("dfs.ha.namenodes." + clusterName);
            if (nnList != null && defaultFS.startsWith("hdfs://" + clusterName)) {
                System.out.println(String.format(
                        "This HDFS cluster \"%s\" is configured as HA with namenodes:", clusterName));
                final String nnIDs[] = nnList.split(",");
                String nnAddrs[] = new String[nnIDs.length];
                for (int i = 0; i < nnIDs.length; ++i) {
                    nnAddrs[i] = cfg.get(String.format(
                            "dfs.namenode.rpc-address.%s.%s", clusterName, nnIDs[i]));
                    System.out.println("\t" + nnAddrs[i]);
                }
                // handling various weired deploy environment
                if (null == System.getProperty("KeepConfiguredFS")) {
                    final String hostname = java.net.InetAddress.getLocalHost().getHostName();
                    for (String nnAddr : nnAddrs) {
                        if (nnAddr != null && nnAddr.startsWith(hostname)) {
                            cfg.set(keyDefaultFS, "hdfs://" + nnAddr);
                            System.out.println(String.format(
                                    "%s is set as %s instead of system configured %s.",
                                    keyDefaultFS, cfg.get(keyDefaultFS), defaultFS));
                            fsReCfged = true;
                            break;
                        }
                    }
                }
            }
        }
        if (!fsReCfged) {
            System.out.println(String.format("Use system configured %s(%s).", keyDefaultFS, defaultFS));
        }
        if (null != System.getProperty("CustomTempDir")) {
            final String keyTempDir = "hadoop.tmp.dir";
            final String oldValue = cfg.get(keyTempDir);
            final String newValue = System.getProperty("CustomTempDir");
            cfg.set(keyTempDir, newValue);
            System.out.println(String.format(
                    "%s is set as %s instead of system configured %s.",
                    keyTempDir, newValue, oldValue));
        }
        dfs = (DistributedFileSystem) DistributedFileSystem.get(cfg);

 

你可能感兴趣的:(webstart部署hadoop client应用)