4

我正在尝试使用with从Apache Spark作业(用 Java 编写)访问Accumulo 1.6。为了做到这一点,我必须通过调用该方法来告诉ZooKeeper 的位置。此方法接受一个指定各种相关属性的对象。AccumuloInputFormatnewAPIHadoopRDDAccumuloInputFormatsetZooKeeperInstanceClientConfiguration

ClientConfiguration通过调用静态loadDefault方法来创建我的对象。这个方法应该在不同的地方寻找一个client.conf文件来加载它的默认值。它应该看的地方之一是$ACCUMULO_CONF_DIR/client.conf

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

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

  • 呼吁setExecutorEnv("ACCUMULO_CONF_DIR", "/etc/accumulo/conf")_SparkConf
  • 出口ACCUMULO_CONF_DIR_spark-env.sh
  • 设置spark.executorEnv.ACCUMULO_CONF_DIR_spark-defaults.conf

他们都没有工作。当我在调用之前打印环境时setZooKeeperInstanceACCUMULO_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);
    }
}
4

1 回答 1

3

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

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

于 2014-10-10T19:27:05.663 回答