Search

Scala WordCount 작성 및 빌드

Scala로 WordCount 작업을 실행하기 위해선 코드 작성, 컴파일, 아카이브 생성, 실행이 필요하다.

Scala WordCount 코드

WordCount.scala에 다음과 같이 코드를 작성하였다.
package com.fastcampus.spark import scala.io.Source import java.io.PrintWriter object WordCount { def main(args: Array[String]): Unit = { println(">>> WordCountScala...") var input = args(0) var output = args(1) var delimiter = " " val arr = Source.fromFile(input).getLines().toArray println(">>> Line Count : " + arr.count(line => true)) val arr2 = arr.flatMap(line => line.split(delimiter)) val arr3 = arr2.map(word => (word, 1)) val arr4 = arr3.groupBy(tuple => tuple._1).toArray val arr5 = arr4.map(tuple_grouped => (tuple_grouped._1, tuple_grouped._2.map(tuple => tuple._2))) val arr6 = arr5.map(tuple_grouped => (tuple_grouped._1, tuple_grouped._2.reduce((v1, v2) => v1 + v2))) val arr7 = arr6.sortBy(tuple => tuple._2) arr7.foreach(word_count => println(">>> word count (count desc) : " + word_count)) val ordering = new Ordering[(String, Int)] { override def compare(x: (String, Int), y: (String, Int)): Int = { if((x._2 compare y._2) == 0) (x._1 compare y._1) else -(x._2 compare y._2) } } val arr8 = arr6.sortBy(tuple => tuple)(ordering) arr8.foreach(word_count => println(">>> word count (count desc, word asc) : " + word_count)) new PrintWriter(output) { write(arr8.mkString("\n")) close() } } }
Scala
복사

컴파일

Scala 컴파일러인 scalac로 코드를 컴파일 하였다.
컴파일 된 class 파일의 위치를 {프로젝트 폴더}/target 폴더로 지정하였다. 컴파일 후 생성된 .class 파일들을 볼 수 있다.
> scalac -d target/ src/main/scala/com/fastcampus/spark/WordCount.scala > ls -l target/com/fastcampus/spark -rw-rw-r--. 1 5692 12 16:36 WordCount$$anon$1.class -rw-rw-r--. 1 1192 12 16:36 WordCount$$anon$2.class -rw-rw-r--. 1 8534 12 16:36 WordCount$.class -rw-rw-r--. 1 789 12 16:36 WordCount.class
Bash
복사

JAR 아카이브 생성

생성 된 class 파일들을 JAR 아카이브로 묶어준다.
동일한 target 폴더에 JAR 파일을 저장하기 위해 경로를 지정하였고, 압축 할 class 파일들을 지정하였다.
> jar cvf target/WordCount.jar target/com/fastcampus/spark/* > ls -l target -rw-rw-r--. 1 7468 12 16:36 WordCount.jar drwxrwxr-x. 3 24 12 15:34 com
Bash
복사

실행

scala 명령을 통해 아카이브를 실행한다.
환경변수인 Classpath에 아카이브 경로를 추가해야 하므로, classpath 옵션을 통해 명시해준다. 인자로 입력 파일과 출력 파일의 경로를 함꼐 지정해줌으로써 WordCount 작업을 수행할 수 있다.
> scala -cp target/ com.fastcampus.spark.WordCount /usr/lib/apache-maven-3.8.6/LICENSE ./out.txt >>> WordCountScala... >>> Line Count : 351 >>> word count (count desc) : ((an,1) >>> word count (count desc) : (complies,1) ... > cat out.txt (,1480) (the,99) (of,64) (or,62) ...
Bash
복사