2021년 5월 18일 화요일

[ Spark ] Mysql 연결에러 (java.lang.ClassNotFoundException)


[ 에러 ]

Spark로 Mysql 연결시

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

에러가 뜬다면 


1. spark-shell 

spark-shell --jars mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar

: --jars옵션을 통해 스파크쉘을 실행한다


2. spark-submit

jars폴더 안에 mysql-connector파일을 넣어준다.

cp -r $HIVE_HOME/lib/mysql-connector-java-5.1.46-bin.jar $SPARK_HOME/jars/

* CDH환경일시 

cp ./mysql-connector-java-5.1.46-bin.jar /opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/spark/jars



2021년 5월 15일 토요일

[ Spark ] Linux SBT 환경셋팅



[ SBT 설치 ]

- Ubuntu

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823

sudo apt-get update

sudo apt-get install sbt


- CentOS

curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo

sudo yum install sbt


참조 : https://twitter.github.io/scala_school/ko/sbt.html



[ 스칼라 설치 ]

$ cd ~

$ wget http://downloads.lightbend.com/scala/2.11.8/scala-2.11.12.rpm

$ sudo yum install scala-2.11.12.rpm

$ scala -version


project 디렉토리를 생성

$ home/user/projects]$ sbt


sbt를 통해 프로젝트 생성

$ sbt new scala/hello-world.g8



[ 예제 실행 ]

$ cd project_name

$ sbt

sbt console > run

https://m.blog.naver.com/PostView.nhn?blogId=deepplin&logNo=221579037351&proxyReferer=https:%2F%2Fwww.google.com%2F




로컬에서와 클러스터모드에서 Spark SparkConf사용 :

https://stackoverflow.com/questions/42032169/error-initializing-sparkcontext-a-master-url-must-be-set-in-your-configuration





2021년 5월 14일 금요일

[ Kubernetes ] Ubuntu 18.04 도커설치


[ 설치 ]


$ sudo apt update

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

$ apt-cache policy docker-ce

$ sudo apt install docker-ce


설치 확인

$ sudo systemctl status docker




[ 예제 실행 ]


$ mkdir cloudnatived

$ cd cloudnative 

$ git clone https://github.com/cloudnativedevops/demo.git

$ cd ..

$ sudo docker container run -p 9999:8888 --name hello cloudnatived/demo:hello


웹브라우저 http://ip:9999 로 접속



도커설치 참조 : 

https://blog.cosmosfarm.com/archives/248/%EC%9A%B0%EB%B6%84%ED%88%AC-18-04-%EB%8F%84%EC%BB%A4-docker-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95/


2021년 4월 23일 금요일

[ Scala ] 스칼라 프로젝트 Remote Git 환경설정

잘 설명되어있는 참조URL : 

 https://atoz-develop.tistory.com/entry/IntelliJ%EC%97%90%EC%84%9C-GitGitHub-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-%EA%B8%B0%EC%A1%B4-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0

[ Scala ] Case Class에 대하여

 

스칼라는 케이스 클래스 개념을 지원하는데 특징은 아래와 같다.

  • 불변
  • 패턴매칭을 통해 분해가능
  • 레퍼런스가 아닌 구조적인 동등성으로 비교
  • 초기화와 운영이 간결


예제

Notification.scala이라는 case class스칼라 파일을 생성

abstract class Notification
case class Email(sourceEmail: String, title: String, body: String) extends Notifica
case class SMS(sourceNumber: String, message: String) extends Notification
case class VoiceRecording(contactName: String, link: String) extends Notification


클래스 Email, SMS, VoiceRecording은 일반적인 클래스와 다르다.

1. 

인스턴스를 생성할 때 NEW 키워드 생략가능. 

Ex)

val emailFromJohn = Email("doe@mail.com", "Greetings!", "Hello World!")


2. 

생성자 파라미터들에 대한 getter함수가 자동으로 정의. 

public값으로 다뤄지며 직접 접근가능 

Ex)

val title = emailFromJohn.title println(title) // prints "Greetings From John!"


3.

케이스클래스 필드 수정 불가능

Ex)

emailFromJohn.title = "Goodbye From John!"

// 컴파일시에 에러가 난다. 모든 케이스 클래스 필드는 기본적으로 val이다.

// var을 사용하여 변경할 수 있지만, 권장하지 않는다.


4.

클래스 복사가 가능하며 필드값을 대체할 수도 있다.

Ex)

val editedEmail =
emailFromJohn.copy(title = "I am learning Scala!", body = "It's so cool!")

println(emailFromJohn)
// prints "Email(john.doe@mail.com,Greetings From John!,Hello World)"

println(editedEmail)
// prints "Email(john.doe@mail.com,I am learning Scala,It's so cool!)"


5.

모든 케이스클래스에 대해 equals 메서드와 toString메서드를 생성

Ex)

val firstSms = SMS("12345", "Hello!") val secondSms = SMS("12345", "Hello!") if (firstSms == secondSms) { println("They are equal!") } println("SMS is: " + firstSms)


6.

케이스클래스를 통해 데이터와 함께 동작하는 패턴매칭 사용가능

object Test {

def showNotification(notification: Notification): String = {
notification match {
case Email(email, title, _) =>
"You got an email from " + email + " with title: " + title
case SMS(number, message) =>
"You got an SMS from " + number + "! Message: " + message
case VoiceRecording(name, link) =>
"you received a Voice Recording from " + name + "! Click the link to hear it: " + link
}
}

def main(args: Array[String]): Unit = {
val someSms = SMS("12345", "Are you there?")
val someVoiceRecording = VoiceRecording("Tom", "voicerecording.org/id/123")

println(showNotification(someSms))
println(showNotification(someVoiceRecording))
}
}


// prints: // You got an SMS from 12345! Message: Are you there? // you received a Voice Recording from Tom! Click the link to hear it: voicerecording.org/id/123


7.

패턴매칭 if를 통한 다른 예제

object Test {

def showNotification(notification: Notification): String = {
notification match {
case Email(email, title, _) =>
"You got an email from " + email + " with title: " + title
case SMS(number, message) =>
"You got an SMS from " + number + "! Message: " + message
case VoiceRecording(name, link) =>
"you received a Voice Recording from " + name + "! Click the link to hear it: " + link
}
}

def showNotificationSpecial(notification: Notification, specialEmail: String, specialNumber: String): String = {
notification match {
case Email(email, _, _) if email == specialEmail =>
"You got an email from special someone!"
case SMS(number, _) if number == specialNumber =>
"You got an SMS from special someone!"
case other =>
showNotification(other) // nothing special, delegate to our original showNotification function
}
}

def main(args: Array[String]): Unit = {
val SPECIAL_NUMBER = "55555"
val SPECIAL_EMAIL = "jane@mail.com"
val someSms = SMS("12345", "Are you there?")
val someVoiceRecording = VoiceRecording("Tom", "voicerecording.org/id/123")
val specialEmail = Email("jane@mail.com", "Drinks tonight?", "I'm free after 5!")
val specialSms = SMS("55555", "I'm here! Where are you?")

println(showNotificationSpecial(someSms, SPECIAL_EMAIL, SPECIAL_NUMBER))
println(showNotificationSpecial(someVoiceRecording, SPECIAL_EMAIL, SPECIAL_NUMBER))
println(showNotificationSpecial(specialEmail, SPECIAL_EMAIL, SPECIAL_NUMBER))
println(showNotificationSpecial(specialSms, SPECIAL_EMAIL, SPECIAL_NUMBER))
}
}



참조 : 

https://docs.scala-lang.org/ko/tutorials/scala-for-java-programmers.html

https://docs.scala-lang.org/ko/tour/case-classes.html

2021년 4월 19일 월요일

[ Spark ] Mysql 연결 후 DATA SELECT

 

[ Mysql연결 후 데이터 Select ]


접속정보를 option으로 주는 방법과

java.util.properties객체를 이용해

Mysql Server와 연결하는 방법이있다.


import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import java.util.Properties

object RdbToHive {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
.setAppName("SELECT RDBMS DATA")
.setMaster("local")

val spark = SparkSession.builder.config(conf).getOrCreate()

// Loading data from a JDBC source
val jdbcDF = spark.read
.format("jdbc")
.option("url", "jdbc:mysql://dbserver:3306")
.option("dbtable", "test_db.tmp_table")
.option("user", "admin")
.option("password", "e123123")
.load()
jdbcDF.show(10)

// Loading data from a JDBC source2
val connectionProperties = new Properties()
connectionProperties.put("user", "admin")
connectionProperties.put("password", "e123123")
val jdbcDF2 = spark.read
.jdbc("jdbc:mysql://dbserver:3306", "test_db.tmp_table", connectionProperties)
jdbcDF2.show(10)

}
}



참조 : 

https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

2021년 4월 17일 토요일

[ Algorithm Java ] 소수만들기

 

문제 ]

문제 설명

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 

숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, 

nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 

소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항

nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.

nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.      


numsresult
[1,2,3,4]1
[1,2,7,6,4]4



제출 ]

class Solution {

    public int solution(int[] nums) {

        int answer = 0;

        int sum = 0;

       

        for(int i=0; i<nums.length-2; i++){

            for(int j=i+1; j<nums.length-1;j++){

                for(int k=j+1; k<nums.length; k++){


                    //3개 더한 값이 소수 인지 판별

                    sum = nums[i]+nums[j]+nums[k];

                    int s = 2;

                    for(; s<sum;s++){

                        if(sum%s==0) break;    

                    }


                    //소수라면 answer에 +1

                    if(s==sum) answer+=1;      

                }

            }

        }


        return answer;

    }

}



풀이 ]

반복문을 도는 변수3개로 3가지 수를 더하는 경우의 수를 구현하고,

더한 수의 값이 소수인지 아닌지 판단