2014-10-10 104 views
2

我试图使用AccumuloInputFormatnewAPIHadoopRDDApache Spark作业(用Java编写)访问Accumulo 1.6。为了做到这一点,我必须通过调用setZooKeeperInstance方法告诉AccumuloInputFormat ZooKeeper的位置。该方法采用指定各种相关属性的ClientConfiguration对象。如何在YARN Spark作业中设置环境变量?

我正在通过调用静态loadDefault方法创建我的ClientConfiguration对象。这种方法应该在各个地方查找client.conf文件以从中加载其默认值。它应该看的地方之一是$ACCUMULO_CONF_DIR/client.conf

因此,我试图设置ACCUMULO_CONF_DIR环境变量,使它在Spark运行作业时可见(供参考,我试图在yarn-cluster部署模式下运行)。我还没有找到成功的方法。

到目前为止,我已经试过:

  • 在他们spark-defaults.conf

无呼吁SparkConf

  • 导出ACCUMULO_CONF_DIRsetExecutorEnv("ACCUMULO_CONF_DIR", "/etc/accumulo/conf")spark-env.sh
  • 设置spark.executorEnv.ACCUMULO_CONF_DIR工作过。在拨打setZooKeeperInstance之前打印环境时,ACCUMULO_CONF_DIR未出现。

    如果它是相关的,我使用的是一切的CDH5版本。

    这里是我想要做的一个例子(进口和异常处理冷落为了简洁):

    public class MySparkJob 
    { 
        public static void main(String[] args) 
        { 
         SparkConf sparkConf = new SparkConf(); 
         sparkConf.setAppName("MySparkJob"); 
         sparkConf.setExecutorEnv("ACcUMULO_CONF_DIR", "/etc/accumulo/conf"); 
         JavaSparkContext sc = new JavaSparkContext(sparkConf); 
         Job accumuloJob = Job.getInstance(sc.hadoopConfiguration()); 
         // Foreach loop to print environment, shows no ACCUMULO_CONF_DIR 
         ClientConfiguration accumuloConfiguration = ClientConfiguration.loadDefault(); 
         AccumuloInputFormat.setZooKeeperInstance(accumuloJob, accumuloConfiguration); 
         // Other calls to AccumuloInputFormat static functions to configure it properly. 
         JavaPairRDD<Key, Value> accumuloRDD = 
          sc.newAPIHadoopRDD(accumuloJob.getConfiguration(), 
               AccumuloInputFormat.class, 
               Key.class, 
               Value.class); 
        } 
    } 
    
  • 回答

    2

    所以,我发现这个问题的答案,而写的问题(对不起,信誉者) 。问题是CDH5使用Spark 1.0.0,并且我通过YARN运行作业。显然,YARN模式并不关注执行程序环境,而是使用环境变量SPARK_YARN_USER_ENV来控制其环境。因此,确保SPARK_YARN_USER_ENV包含ACCUMULO_CONF_DIR=/etc/accumulo/conf工程,并使ACCUMULO_CONF_DIR在问题的源示例中指定点处的环境中可见。

    独立模式和YARN模式工作方式的差异导致了SPARK-1680,这在Spark 1.1.0中报告为固定。