Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spark程序中的广播变量发布_Java_Apache Spark_Rdd - Fatal编程技术网

Java Spark程序中的广播变量发布

Java Spark程序中的广播变量发布,java,apache-spark,rdd,Java,Apache Spark,Rdd,在spark-java程序中,我需要读取一个配置文件并填充一个HashMap,我需要将其发布为广播变量,以便它在所有DataNode中都可用 我需要在CustomInputFormat类中获取这个广播变量的值,该类将在datanodes中运行。既然在我的驱动程序中声明了广播变量,我如何在CustomInputFormat类中指定从特定广播变量中获取值 我添加了一些代码,以进一步解释: 在这个场景中,我在驱动程序本身中使用它,即变量在同一个类中使用:这里我可以使用Broadcat.value()方

在spark-java程序中,我需要读取一个配置文件并填充一个HashMap,我需要将其发布为广播变量,以便它在所有DataNode中都可用

我需要在CustomInputFormat类中获取这个广播变量的值,该类将在datanodes中运行。既然在我的驱动程序中声明了广播变量,我如何在CustomInputFormat类中指定从特定广播变量中获取值

我添加了一些代码,以进一步解释:

在这个场景中,我在驱动程序本身中使用它,即变量在同一个类中使用:这里我可以使用Broadcat.value()方法

>最终广播标志前缀=
>sc.broadcast(loadCallSignTable());
>javapairdd countryContactCounts=contactCounts.mapToPair(
>新的PairFunction(){
>公共Tuple2调用(Tuple2 callSignCount){
>String sign=callSignCount._1();
>字符串country=lookupCountry(sign,signPrefixes.value());
>返回新的Tuple2(country,callSignCount._2());
>reduceByKey(new SumInts());
在场景2中,我将在自定义输入格式类中使用广播变量:

驱动程序:

> final JavaSparkContext sc=    new
> JavaSparkContext(sConf.setAppName("ParserSpark").setMaster("yarn-cluster"));
> Broadcast<int[]> broadcastVar = sc.broadcast(new int[] {1, 2, 3});
> 
> JavaPairRDD<NullWritable, ArrayList<Record>> baseRDD =
> sc.newAPIHadoopFile(args[2], InputFormat.class, NullWritable.class,
> ArrayList.class, conf);
>final JavaSparkContext sc=new
>JavaSparkContext(sConf.setAppName(“ParserSpark”).setMaster(“纱线簇”);
>广播广播var=sc.Broadcast(新的int[]{1,2,3});
> 
>javapairdd-baseRDD=
>sc.newAPIHadoopFile(args[2],InputFormat.class,NullWritable.class,
>ArrayList.class,conf);
InputFormat.class

> public class InputFormat extends  FileInputFormat {
> 
>   @Override   public RecordReader<NullWritable, ArrayList<Record>> 
>   createRecordReader(InputSplit split,            TaskAttemptContext context)
> throws IOException,           InterruptedException{
>       //I want to get the Broadcast Variable Here -- How will I do it 
>       
>         RecordReader reader = new RecordReader();         reader.initialize(split, context);      return reader;  }   @Override
>   protected boolean isSplitable(JobContext context, Path file) {
>       return false;    } }
>公共类InputFormat扩展了FileInputFormat{
> 
>@覆盖公共记录读取器
>createRecordReader(InputSplit拆分,TaskAttemptContext上下文)
>抛出IOException、InterruptedException{
>//我想在这里获取广播变量--我将如何进行
>       
>RecordReader=新建RecordReader();reader.initialize(拆分,上下文);返回reader;}@Override
>受保护的布尔isSplitable(JobContext上下文,路径文件){
>返回false;}}

您将在驱动程序上创建广播变量w/
val bcVariable=sc.broadcast(myVariableToBroadcast)
并稍后访问它w/
bcVariable.value
我最近遇到了这个问题。结果其实很简单(几个小时后,然后……哈哈!)

创建一个新的配置,设置变量,并将其传递给稍微不同的函数实现

来自驱动程序(此处使用Scala):

val myConf = new Configuration();
    myConf.set("var1", v1)
    myConf.set("var2", v2)
    myConf.set("var3", v3)

val yourFile = sc.newAPIHadoopFile("yourFilePath", classOf[MyFileInputFormat],classOf[org.apache.hadoop.io.Text], classOf[org.apache.hadoop.io.DoubleWritable],myConf)
从您的InputFormat或InputReader..或任何您有上下文的地方(这次是Java)

或许

job.getConfiguration().get("var2");

我需要在驱动程序以外的另一个java类中使用这个广播值。您在这段时间内解决了这个问题吗?
context.getConfiguration().get("var1");
job.getConfiguration().get("var2");