$ cd /skybluelee/spark3
$ ./bin/spark-shell --master local[*]
$ jps
1098 SparkSubmit
1133 Jps
scala> val rdd = sc.parallelize(1 to 5)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:23
scala> val rdd2 = rdd.map{x => println(x + " @map"); x} // 줄 바꿈을 하는 경우(;) {} 사용
rdd2: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[1] at map at <console>:23
scala> rdd2.collect.foreach(x => println(x + " @collect"))
3 @map 0:> (0 + 2) / 2]
4 @map
5 @map
1 @map
2 @map
1 @collect
2 @collect
3 @collect
4 @collect
5 @collect
scala> rdd2.getNumPartitions
res2: Int = 2
2개의 core에서 작동하여 map에서 (1,2), (3,4,5)로 나누어 수행하였기 때문에 map의 결과는 순서대로 나오지 않을 수 있다
이후 collect를 통해 array로 가져오므로 순서대로 출력됨
$ cd /skybluelee/spark3/
$ ./sbin/start-master.sh //--마스터 실행
$ ./sbin/start-worker.sh spark://spark-master-01:7177 //--워커 실행
$ jps
1443 Worker
1493 Jps
1383 Master
1098 SparkSubmit
SparkSubmit은 위의 local 환경임
$ ./bin/spark-shell --master spark://spark-master-01:7177
$ jps
1667 Jps
1443 Worker
1383 Master
1608 CoarseGrainedExecutorBackend
1098 SparkSubmit
1533 SparkSubmit
scala> val rdd = sc.parallelize(1 to 5)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:23
scala> val rdd2 = rdd.map{x => println(x + " @map"); x}
rdd2: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[1] at map at <console>:23
scala> rdd2.collect.foreach(x => println(x + " @collect"))
1 @collect
2 @collect
3 @collect
4 @collect
5 @collect
scala> val rdd = sc.parallelize(1 to 5) -> driver에서 실행
scala> val rdd2 = rdd.map{x => println(x + " @map"); x} -> executor에서 실행
scala> rdd2.collect.foreach(x => println(x + " @collect")) -> driver에서 실행
따라서 map은 최종 출력에 나오지 않음
map의 결과는 master web UI: http://spark-master-01:8180 에서
Running Applications (1)의 값 'app-20230322052453-0000'을 확인하고
$ cd work/app-20230322052453-0000/0
$ vi stdout
혹은
master web UI -> Running Applications (1) -> Spark shell -> collect(이 함수를 사용했으므로) -> stdout을 통해 executor에서 map 작업이 이루어졌음을 확인할 수 있다.