[英]BroadCast Variable publish in Spark Program
在spark-java程序中,我需要讀取一個配置文件並填充一個HashMap,我需要將其發布為廣播變量,以便在所有datanode上都可用。
我需要在要在datanodes中運行的CustomInputFormat類中獲取此廣播變量的值。 由於廣播變量在驅動程序中聲明,因此如何在CustomInputFormat類中指定以從特定廣播變量獲取值?
我正在添加一些代碼以進一步解釋它:
在這種情況下,我在驅動程序本身中使用它,即該變量在同一類中使用:在這里我可以使用Broadcat.value()方法
> final Broadcast<String[]> signPrefixes =
> sc.broadcast(loadCallSignTable());
> JavaPairRDD<String, Integer> countryContactCounts = contactCounts.mapToPair(
> new PairFunction<Tuple2<String, Integer>, String, Integer> (){
> public Tuple2<String, Integer> call(Tuple2<String, Integer> callSignCount) {
> String sign = callSignCount._1();
> String country = lookupCountry(sign, signPrefixes.value());
> return new 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);
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; } }
您將在驅動程序w / val bcVariable = sc.broadcast(myVariableToBroadcast)
上創建廣播var val bcVariable = sc.broadcast(myVariableToBroadcast)
,稍后再使用bcVariable.value
訪問
我最近遇到這個問題。 實際上結束了相當簡單(幾個小時之后,然后是...一個哈!)
創建一個新的Configuration,設置您的var,並將其傳遞給newAPIHadoopFile函數的稍有不同的實現。
從驅動程序(此處使用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)
context.getConfiguration().get("var1");
或者可能
job.getConfiguration().get("var2");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.