実験原理
Spark のコアは RDD です。RDD 上のすべての操作はクラスター上で実行されます。ドライバー プログラムは多くのワーカーを起動します。ワーカーは (分散) ファイル システム内のデータを読み取り、RDD (弾性分散データ セット) に変換し、その後 RDD に変換します。メモリ内でキャッシュされ、計算されます。
RDD には、アクション (値を返す) と変換 (新しい RDD を返す) という 2 種類の操作があります。
1. データ表示と事前準備
電子商取引 Web サイトでは、多数のユーザーによる商品の収集データが記録され、buyer_favorite1 という名前のファイルに保存されます。データ形式とデータの内容は次のとおりです。以降の操作を実行する前に、Hadoop サービスと Spark サービスを有効にしてください
。jps コマンドを使用して、プロセスが完全に有効になっているかどうかを確認できます。
2. scalaプロジェクトを作成する
1. 開発環境:eclipse
Scala プラグインがインストールされた Eclipse を開き、spark4 という名前の新しい Scala プロジェクトを作成します。
Spark4 プロジェクトの下に新しいパッケージ名を作成し、my.scala という名前を付けます。scala オブジェクトに ScalaWordCount という名前を付けます。
2. 実行に必要なjarパッケージをインポートします。
プロジェクトを右クリックし、lib という名前のフォルダーを作成します。
jar パッケージをインポートし、jar パッケージを右クリックして、「ビルド パス」=>「ビルド パスに追加」をクリックします。(私のリソースにアクセスして、spark1.x hadoop2.x をダウンロードできます)
3. Scala ステートメントを記述し、ユーザー収集データで各ユーザーが収集したアイテムの数をカウントします。
package my.scala
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object ScalaWordCount {
def main(args: Array[String]) {
//创建Spark的配置对象sparkConf,设置Spark程序运行时的配置信息;
val conf = new SparkConf()
conf.setMaster("local") .setAppName("scalawordcount")
//创建SparkContext对象,SparkContext是Spark程序所有功能的唯一入口,无论采用Scala、Java还是Python都必须有一个SparkContext;
val sc = new SparkContext(conf)
val rdd = sc.textFile("hdfs://localhost:9000/myspark/buyer_favorite1") //根据具体的数据来源,通过SparkContext来创建RDD;
//对初始的RDD进行Transformation级别的处理。(首先将每一行的字符串拆分成单个的单词,然后在单词拆分的基础上对每个单词实例计数为1;
//最后,在每个单词实例计数为1的基础上统计每个单词在文件出现的总次数)。
rdd.map(line => (line.split("\t")(0), 1))
.reduceByKey(_ + _)
.collect()
.foreach(println)
sc.stop()
}
}
出力結果は制御インターフェースコンソールに表示されます。
3. Java プロジェクトを作成する
プロジェクト名を再度右クリックし、新しいパッケージを作成し、パッケージに my.java という名前を付けます。
パッケージ my.java を右クリックし、新しいクラスを作成し、JavaWordCount という名前を付けます。
1. ユーザー収集データ内の各ユーザーが収集したアイテムの数をカウントする Java コードを作成します。
package my.java;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
public final class JavaWordCount {
private static final Pattern SPACE = Pattern.compile("\t");
public static void main(String[] args) throws Exception {
SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("JavaWordCount");
JavaSparkContext ctx = new JavaSparkContext(sparkConf);
JavaRDD<String> lines = ctx.textFile("hdfs://localhost:9000/myspark/buyer_favorite1");
JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
@Override
public Iterable<String> call(String s) {
String word[]=s.split("\t",2);
return Arrays.asList(word[0]);
}
});
JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
@Override
public Tuple2<String, Integer> call(String s) {
return new Tuple2<String, Integer>(s, 1);
}
});
JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer i1, Integer i2) {
return i1 + i2;
}
});
List<Tuple2<String, Integer>> output = counts.collect();
System.out.println(counts.collect());
counts.saveAsTextFile("hdfs://localhost:9000/myspark/out");
ctx.stop();
}
}
2. Linux ターミナルで出力結果を表示します。
クラスターが開始されている場合は、次のコマンドを実行して結果を表示します。
hadoop fs -cat /myspark/out/part-00000
最後に書きます
このことから、Spark プログラムを作成する際の scala 言語の優位性は、短くて簡潔であることがわかります。