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