Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

intellij X tomcat webapps 연결하기

Was/Tomcat 2019.04.12 16:15
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

이번에 뉴맥북을 신청하여 바꿨다. 
인텔리J를 깔고 맡은 프로젝트들을 하나하나씩 옮기고 톰캣을 연동하는데..!!
War까지는 만들어지는데 요녀석이 tomcat webapps에 안가는것이다.

-_- 딥빡쓰..

그래서 이것저것 해보다보니..아래와 같이 해주니 되었다.
Output directory를 톰캣 webapps로 맞춰주면 된다.

참고사항으로~알아두면 좋을것 같은!

웹 애플리케이션을 배포하기 위한 패키징 유형

  • package(archive)

    • 아카이브(.war, .ear) 파일로 배포
      아카이브는 WAS(Tomcat)에 의해 압축이 풀린다.
      파일이 많은 경우 압축을 푸는 시간이 오래 걸릴 수 있다.
      원격 서버에 배포시 한 개의 파일만 전송하면 된다.
      WAS(Tomcat)에서 제공하는 업로드를 통한 배포 기능을 활용할 수 있다.

  • exploded(expanded)

    • 아카이브를 압축 해제한 형태의 디렉터리로 배포
      별도의 디렉터리에 원본 소스를 복사하여 만든다.
      압축 및 해제 과정이 불필요하다.
      파일이 많은 경우 복사하는 시간이 오래 걸릴 수 있다.
      원본 소스를 건드리지 않고 배포를 원하는 경우에 적합하다.
      원격 서버에 배포시 파일이 많은 경우 전송 시간이 오래 걸릴 수 있다.

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

DigiCert SSL 인증서

network 2019.02.25 15:00
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

미국정부기관에서 공식 인정하는 인증기관 중 하나이며 미국, 유럽, 중국에서는 하이엔드(High-end) 인증서 발급회사로 

인지도 높은 브랜드입니다.

또한 2017년 12월 세계1위 보안회사의 SSL PKI사업부를 인수 하고 2018년 10월 성공적인 인수 합병을 완료 하며 

SSL 인증서는 세계 1위의 위치로 확고히 자리 매김 했습니다.


Tip. 발급자 확인

$ openssl x509 -in 도메인 -issuer -noout
issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=Thawte TLS RSA CA G1

참고 : https://security.googleblog.com/2018/03/distrust-of-symantec-pki-immediate.html

출처 : https://www.crosscert.com/symantec/digicert.jsp


'network' 카테고리의 다른 글

DigiCert SSL 인증서  (0) 2019.02.25
패킷 분석을 위한 툴 - wireshark  (0) 2017.04.18

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

(소개) 라그나로크 제로 묘르닐섭

game/play 2019.02.13 14:01
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


추억의 라그나로크 

01년도 처음 접했던 게임!

라그나로크는  일랜시아, 아스가르드, 테일즈위버, 트릭스터 등등 내가 즐겨했던 게임 중에 하나이다.

아래의 유튜브는 "라그나로크 제로" 라는 게임을 플레이하는 내용이다. 팍으마 화이팅~

라그나로크는 크게 본섭(라그나로크 온라인) / 라그나로크 제로(클래식 느낌?) / 라그나로크 M(모바일)등이 있다.

TV에서 리니지 선전할 때 향수를 불러일으키는 내용이 있던데..라그나로크가 바로 내겐 그런 게임이다. ㅎㅎ




더 자세한 내용은 아래의 채널을 통해 확인하시면 됩니다.

https://www.youtube.com/channel/UCmRY_bQQquuNX35XIhXd1JQ


라그나로크 제로 흥해라~

 끝 

'game > play' 카테고리의 다른 글

(소개) 라그나로크 제로 묘르닐섭  (0) 2019.02.13
(소개) 요로리의 트릭스터 규닝서버  (0) 2018.11.27

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

함수형과 객체지향형 추상화의 차이점?

업무 관련/용어 2019.01.28 17:47
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


레거시 코드 활용 전략의 저자 마이클 페더스횽이 트위터에 140자로 다음과 같이 차이점을 명시 했다.

https://twitter.com/mfeathers/status/29581296216

OO makes code understandable by encapsulating moving parts. FP makes code understandable by minimizing moving parts.


객체지향은 캡슐화를 통해 움직이는 부분을 캡슐화하여 코드의 이해를 높였고 함수형프로그래밍은 움직이는 부분을 

최소화하여 높였다.

moviing parts?? 이 부분은 상태변화와 연관이 있다.

함수형 언어는 mutable 상태를 제어하는 메커니즘 보다 이런 부분을 제거하는데 주력한다.

함수형 프로그래밍이라..아직은 익숙하지 않지만 언젠가는 잘 알게되겠지!

'업무 관련 > 용어' 카테고리의 다른 글

함수형과 객체지향형 추상화의 차이점?  (0) 2019.01.28
MIME 타입이란?  (0) 2017.03.17
용어정리 : www, http, https, http2  (0) 2017.03.12
Base64 / MIME  (0) 2016.04.13

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

리눅스 크론탭 주기 설정

OS/Linux&Unix 2019.01.23 17:20
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


* * * * *

????What??????

크론탭 주기 설정에서의 별표의 내용은 아래와 같다.

 *                *                 *           *             *

분(0-59)   시간(0-23) 일(1-31) 월(1-12) 요일(0-7)


매 분마다 수행하려면?

답 : * * * * *


10,20,30 * * * * 은? 

답 : 10분, 20분, 30분 마다 수행!


범위 수행은??

답: 10-30 3 * * * 매일 1시 10분~30분까지 매분 마다 수행!


매 10분마다 수행은??

답 : */10 * * * * 


특정 시간 수행은?

10 3 * * 1   = ????

답 : 10분 3시 월요일(1부터 월요일!)  즉 매주 월요일 3시 10분 마다 수행!



'OS > Linux&Unix' 카테고리의 다른 글

리눅스 크론탭 주기 설정  (0) 2019.01.23
-bash: unzip: command not found  (0) 2019.01.23
레지스터(Register), Context Switching란?  (0) 2018.03.14
linux os 확인  (0) 2017.07.03
pokemon skin  (0) 2017.06.22
yum에 대해 알아보자.  (0) 2017.05.09

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

if~else + 하루 이전 날짜 구하기!

OS/Shell Script 2019.01.23 15:25
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

배치Job에서 수동 또는 자동으로 처리하기 위해서 분기처리가 필요하였다.

예시

if [ $2 == 0 ]; then

  export ANAL_DATE=$(date +%Y%m%d --date '1 days ago')

  echo $(date +%Y%m%d --date '1 days ago')

else

  export ANAL_DATE=$2

fi


date +%Y%m%d 이 표현이 현재날짜!
하루전 날짜는 date +%Y%m%d --date '1 days ago'

끄읏~


acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

-bash: unzip: command not found

OS/Linux&Unix 2019.01.23 11:02
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

[코레일 클럽! ㅋㅋㅋㅋ]

unzip conf.zip

-bash: unzip: command not found


yum install -y unzip zip

Loaded plugins: fastestmirror, versionlock

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

You need to be root to perform this command.


Install yum-cron? Or run: yum makecache fast을 하라고 해서 아래처럼 수행.


$ yum makecache fast

Loaded plugins: fastestmirror, versionlock

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

EPEL7                                                                                                                                                         | 4.7 kB  00:00:00

base                                                                                                                                                          | 3.6 kB  00:00:00

centosplus                                                                                                                                                    | 3.4 kB  00:00:00

extras                                                                                                                                                        | 3.4 kB  00:00:00

update                                                                                                                                                        | 3.4 kB  00:00:00

(1/7): base/7/x86_64/group_gz                                                                                                                                 | 166 kB  00:00:00

(2/7): extras/7/x86_64/primary_db                                                                                                                             | 156 kB  00:00:00

(3/7): EPEL7/7/x86_64/updateinfo                                                                                                                              | 950 kB  00:00:00

(4/7): centosplus/7/x86_64/primary_db                                                                                                                         | 852 kB  00:00:00

(5/7): update/7/x86_64/primary_db                                                                                                                             | 1.3 MB  00:00:00

(6/7): EPEL7/7/x86_64/primary_db                                                                                                                              | 6.6 MB  00:00:00

(7/7): base/7/x86_64/primary_db                                                                                                                               | 6.0 MB  00:00:00

Determining fastest mirrors

Metadata Cache Created


다시 수행~

$ sudo yum install -y unzip zip

Loaded plugins: fastestmirror, versionlock

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

EPEL7                                                                                                                                                         | 4.7 kB  00:00:00

base                                                                                                                                                          | 3.6 kB  00:00:00

centosplus                                                                                                                                                    | 3.4 kB  00:00:00

extras                                                                                                                                                        | 3.4 kB  00:00:00

update                                                                                                                                                        | 3.4 kB  00:00:00

(1/7): base/7/x86_64/group_gz                                                                                                                                 | 166 kB  00:00:00

(2/7): extras/7/x86_64/primary_db                                                                                                                             | 156 kB  00:00:00

(3/7): EPEL7/7/x86_64/updateinfo                                                                                                                              | 950 kB  00:00:00

(4/7): centosplus/7/x86_64/primary_db                                                                                                                         | 852 kB  00:00:00

(5/7): EPEL7/7/x86_64/primary_db                                                                                                                              | 6.6 MB  00:00:00

(6/7): update/7/x86_64/primary_db                                                                                                                             | 1.3 MB  00:00:00

(7/7): base/7/x86_64/primary_db                                                                                                                               | 6.0 MB  00:00:00

Determining fastest mirrors


잘 풀림! ㅎㅎㅎ

$ unzip conf.zip

Archive:  conf.zip

  inflating: yarn-conf/hdfs-site.xml

  inflating: yarn-conf/topology.map

  inflating: yarn-conf/ssl-client.xml

  inflating: yarn-conf/mapred-site.xml

  inflating: yarn-conf/yarn-site.xml

  inflating: yarn-conf/log4j.properties

  inflating: yarn-conf/hadoop-env.sh

  inflating: yarn-conf/core-site.xml

  inflating: yarn-conf/topology.py

'OS > Linux&Unix' 카테고리의 다른 글

리눅스 크론탭 주기 설정  (0) 2019.01.23
-bash: unzip: command not found  (0) 2019.01.23
레지스터(Register), Context Switching란?  (0) 2018.03.14
linux os 확인  (0) 2017.07.03
pokemon skin  (0) 2017.06.22
yum에 대해 알아보자.  (0) 2017.05.09

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

SBT + ANSIBLE

CM/ansible 2019.01.23 09:56
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


빌드서버에서 빌드 후 배포(배치 서버로)

build는 shell을 통해 처리 하였다. (음..뭔가 ansible style은 아니다..ㅠㅠ 책을 사서 좀 더 파봐야겠다.)

- name: Execute sbt build
shell: |
cd {{ build_home }}/{{ build_id }}
pwd     ./sbt.sh   

sbt.sh에서는 sbt를 통해 명령어로 처리! sbt가 export가 잘안되어서 그냥 절대경로로 처리!

/daum/program/sbt/bin/sbt clean assembly 

deploy는 간단히 copy해주는 형식으로 처리 하였다. 즉, local jar를 deploy할 서버로 카피!

---
- hosts : spark
serial : 1
tasks :
- name : Make data directory
file : dest="{{ base_data }}" owner={{ user_name }} group={{ group_name }} state=directory

- name : Remove old file
file : path="{{ base_service }}/{{ service_name }}/bin/{{ file_name }}.{{ file_type }}" state=absent

- name : Deploy file
copy : src="{{ data_build_home }}/{{ build_id }}/target/scala-2.10/{{ file_name }}.{{ file_type }}"            dest="{{ base_service }}/{{ service_name }}/bin/{{ file_name }}.{{ file_type }}" 



배치 서버에서 스파크 수행

Spark Submit

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

2018년 12월 24일 차 구입!!

Life of AceT/My Car 2019.01.16 16:06
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


자동차세 연납하면 10% 감면 해준다한다.


손 쉽게 앱으로 해보자~



'Life of AceT > My Car' 카테고리의 다른 글

2018년 12월 24일 차 구입!!  (0) 2019.01.16

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

HDFS부터 DB까지 팁 아닌 팁~

BigDATA/spark 2019.01.15 22:24
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

애월 - 지금이순간 카페


스칼라 알못 스파크 알못이라..이번에 작업한 내용이 있는데 삽질을 많이 했다...ㅋㅋ 
생각나는 것들을 적어보자.
HDFS를 가져와 RDD에 저장! sc.textFile을 통해서 HDFS를 가져온다.
sc.textFile("hdfs path")
그런데 그냥 가져오면 소용이 없다. 그러므로 map을 통해서 필요한 친구들만 가져온다. 또한 filter를 통해 데이터를 줄여준다.

ex) hdfs의 포맷이 Json이라서 Gson을 사용. filter를 통해 데이터를 줄여준다.

    val rddRaw0 = sc.textFile("hdfs path").map(line => new Gson().fromJson(line, classOf[TestObject])).filter(line=> line.collection.code.contains("ACET") && !line.document.id.isEmpty).cache() 

리고 여러개의(multi) RDD들이 있었고 이 친구들을 한번에 분석을 해야했다. 그래서 union을 사용.
ex) val result  = rddRaw0.union(rddRaw1)

그런뒤 reduceByKey를 하여 word count를 해준다.
rddRaw.map(line => ((line.document.id,device),1)).reduceByKey{ case (x, y) => x + y}

이제 분석되어진 RDD 친구를 List화 하여 JDBC를 통해 DB에 넣는다.
여기에서 중요한 RDD to List는 아래의 내용이다.
val list: List[((String, String), Int)] = result.collect().toList 
그리고 map으로 원하는 형태를 만들어준 뒤,  InsertToDb를 해주면 되는데 여기에서 sirialization 문제가 발생한다.

  def insertDBxx(result: RDD[((String, String), Int)]) {
       val list: List[((String, String), Int)] = result.collect().toList
       val targetList = list.map(line => (line._1._1, line._1._2, line._2))
       new InsertToDb(targetList)
  }  

Serialize 해결은 아래와 같이 하였다.

  @SerialVersionUID(15L)
  class InsertToDb(targetList: List[(String, String, Int)]) extends Serializable{ 

Serializable은 해결방법보다 이녀석이 뭔지 정확히 알필요가 있으니 따로 포스팅을 하겠습니다.

자 이제 InsertToDb에서는 connection을 맺고 db작업을 해주면 된다.
여기에서의 팁은 아래에 보시면 getConnection이 아니라 getPoolConnection()인 것을 알수가 있다.

1) get connection
    val connection = OutputJdbcTask.getPoolConnection()


pool 사용을 위해 build.sbt에 아래를 추가

  "c3p0" "c3p0" % "0.9.0.4" 

소스는 아래와 같다.

val env = MainConfig.env
val driver = ConfigFactory.load().getString(s"$env.driver")
val url = ConfigFactory.load().getString(s"$env.url")
val username = ConfigFactory.load().getString(s"$env.username")
val password = ConfigFactory.load().getString(s"$env.password")

private val cpds: ComboPooledDataSource = new ComboPooledDataSource()
cpds.setDriverClass(driver)
cpds.setJdbcUrl(url)
cpds.setUser(username)
cpds.setPassword(password)
cpds.setMinPoolSize(5)
cpds.setAcquireIncrement(5)
cpds.setMaxPoolSize(35)

def getConnection(){
try {
Class.forName(driver)
DriverManager.getConnection(url, username, password)
} catch {
case e : Exception => e.printStackTrace
}
} def getPoolConnection() = { cpds.getConnection
}


마지막으로 DB Upsert하는 부분 소스는 아래와 같다.

try {
val connection = OutputJdbcTask.getPoolConnection()

val insertSql =
"""
|insert into 테이블명 (dsid, reg_dttm, click_count, device, create_date )
|values (?,?,?,?,?)
|ON DUPLICATE KEY UPDATE dsid = ?, reg_dttm =?, click_count= ?, device =?, create_date =?
""".stripMargin

val insertStmt: PreparedStatement = connection.prepareStatement(insertSql)
val regDttm = MainConfig.currentTimeAsString
val createDate = MainConfig.date
var itemCnt = 1
val chunk = 10000

targetList.foreach {
t =>
val dsid = t._1
val device = t._2
val clickCnt = t._3

insertStmt.setString(1, dsid)
insertStmt.setString(2, regDttm)
insertStmt.setInt(3, clickCnt)
insertStmt.setString(4, device)
insertStmt.setString(5, createDate)
insertStmt.setString(6, dsid)
insertStmt.setString(7, regDttm)
insertStmt.setInt(8, clickCnt)
insertStmt.setString(9, device)
insertStmt.setString(10, createDate)
insertStmt.addBatch()
insertStmt.clearParameters()
if (itemCnt % chunk == 0) {
insertStmt.executeBatch()
}
itemCnt = itemCnt + 1

}
insertStmt.executeBatch()
insertStmt.close()
connection.close()
} catch {
case e: Exception => {
e.printStackTrace()
}
}

참고 사이트)

https://stackoverflow.com/questions/40892800/spark-rdd-to-list

https://alvinalexander.com/scala/how-to-use-serialization-in-scala-serializable-trait

'BigDATA > spark' 카테고리의 다른 글

HDFS부터 DB까지 팁 아닌 팁~  (0) 2019.01.15
sbt lib 연동 안되는 현상  (0) 2019.01.04
spark rdd programining  (0) 2018.12.30
spark-submit deploy-mode option  (0) 2016.11.02
2탄. SPARK를 설치해보자~(클러스터)  (0) 2016.10.19
1탄. SPARK를 설치해보자~  (0) 2016.10.18

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

java.sql.SQLException: No value specified for parameter 3

DataBase/MySql 2019.01.09 14:13
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


해당 에러는 scala + mysql에서 insert + update를 하고자할 때 났다.

쿼리 스트링은 아래와 같다.

val insertSql =
"""
|insert into 테이블 (name, age )
|values (?,?)
|ON DUPLICATE KEY UPDATE name = ?, age =?
""".stripMargin

java.sql.SQLException: No value specified for parameter 3

에러는 아래에서 코드가 추가되지 않아서였다.

targetList.foreach {
t =>
val name = t._1
val age = t._2

if (age > 20){
insertStmt.setString(1, name)
insertStmt.setInt(2, age)
insertStmt.addBatch()
insertStmt.clearParameters()
}
}
insertStmt.executeBatch()
insertStmt.close()
connection.close()

즉, 2번째 ? 까지는 채워졌는데 3,4 번째 ?는 채워지지 않아서 이다.

그러므로 insertStmt.setString(3, name)와 insertStmt.setInt(4, age)가 필요하다.


 - END

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

sbt lib 연동 안되는 현상

BigDATA/spark 2019.01.04 14:47
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
not found!! dependency에는 있는데 not found....sbt가 꼬인듯 하다..ㅠㅠ 이럴땐? 다시 셋팅 하자..



SBT버전이 중요! 너무 낮거나 높으면 인텔리J에서 제대로 못가져옴.-_-;;
Scala/Spark 버전은 사내 분산 클러스터에 맞게 적용.



build.sbt 내용
name := "neosite-data"

version := "0.1"

scalaVersion := "2.11.11"

val sparkVersion = "1.6.2"

libraryDependencies ++= Seq("org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.0",
  "org.scalatest" %% "scalatest" % "3.0.5" % "test",
  "org.apache.spark"      %%  "spark-core"        % sparkVersion % "provided",
  //   "org.apache.spark" %% "spark-sql" % sparkVersion,
  "mysql"           "mysql-connector-java" % "5.1.+",
  "com.typesafe.play" %% "play-json" % "2.6.10",
  "com.google.code.gson" % "gson" % "1.7.1",
  "com.typesafe"    "config"               % "1.3.0",
  "org.scalikejdbc" %% "scalikejdbc"          % "2.3.5",
  "org.scalikejdbc" %% "scalikejdbc-config"   % "2.3.5",
  "org.scalikejdbc" %% "scalikejdbc-test"     % "2.3.5"     % "test",
  "ch.qos.logback"  "logback-classic"      % "1.1.6"
)

결과


테스트

warn등을 발견할 수 있다.
하라는데로 1.0.4로 수정 후 다시 sbt를 돌려보자.(scala-parser-combinators 1.0.4로 수정.)

수정 후 결과

이제 환경이 구축 되었다.
자기 입맛에 맞게 개발하면 된다.

내가 해야 할 것
  1. hdfs 연동. 즉, 다른쪽에 저장되어있는 친구를 불러온다(raw data)
  2. Spark 분석(map-reduce)
  3. Mysql에 저장.
    1. scala application.conf의 정보 읽어와서 JDBC 접속 후 INSERT 등 수행.



OH MY GOD~~~

sbt lib 연동이 안되어지는 현상.. 원인은 바로...
jar 파일들이 포함이 되이 않아서이다..

그러므로 plugins.sbt 에 아래와 같이 addSbtPlugin을 추가 후 sbt clean compile assembly 를 해주어야 한다.
버전은 spark에 맞게 해줘야 합니다.


  logLevel := Level.Warn
  addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5") 


 








'BigDATA > spark' 카테고리의 다른 글

HDFS부터 DB까지 팁 아닌 팁~  (0) 2019.01.15
sbt lib 연동 안되는 현상  (0) 2019.01.04
spark rdd programining  (0) 2018.12.30
spark-submit deploy-mode option  (0) 2016.11.02
2탄. SPARK를 설치해보자~(클러스터)  (0) 2016.10.19
1탄. SPARK를 설치해보자~  (0) 2016.10.18

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

spark rdd programining

BigDATA/spark 2018.12.30 20:08
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


https://spark.apache.org/docs/latest/rdd-programming-guide.html

spark rdd

Overview

At a high level, every Spark application consists of a driver program that runs the user’s main function and executes various parallel operations on a cluster. 

The main abstraction Spark provides is a resilient distributed dataset (RDD), which is a collection of elements partitioned across the nodes of the cluster that can be operated on in parallel. RDDs are created by starting with a file in the Hadoop file system (or any other Hadoop-supported file system), or an existing Scala collection in the driver program, and transforming it. Users may also ask Spark to persist an RDD in memory, allowing it to be reused efficiently across parallel operations. Finally, RDDs automatically recover from node failures.

A second abstraction in Spark is shared variables that can be used in parallel operations. 
By default, when Spark runs a function in parallel as a set of tasks on different nodes, it ships a copy of each variable used in the function to each task. Sometimes, a variable needs to be shared across tasks, or between tasks and the driver program. Spark supports two types of shared variables: broadcast variables, which can be used to cache a value in memory on all nodes, and accumulators, which are variables that are only “added” to, such as counters and sums.

This guide shows each of these features in each of Spark’s supported languages. It is easiest to follow along with if you launch Spark’s interactive shell – either bin/spark-shell for the Scala shell or bin/pyspark for the Python one.


  1. flatMap[U](f: (T) ⇒ TraversableOnce[U])(implicit arg0: ClassTag[U])RDD[U]

    Permalink

    Return a new RDD by first applying a function to all elements of this RDD, and then flattening the results.

map[U](f: (T) ⇒ U)(implicit arg0: ClassTag[U])RDD[U]

Permalink

Return a new RDD by applying a function to all elements of this RDD.







'BigDATA > spark' 카테고리의 다른 글

HDFS부터 DB까지 팁 아닌 팁~  (0) 2019.01.15
sbt lib 연동 안되는 현상  (0) 2019.01.04
spark rdd programining  (0) 2018.12.30
spark-submit deploy-mode option  (0) 2016.11.02
2탄. SPARK를 설치해보자~(클러스터)  (0) 2016.10.19
1탄. SPARK를 설치해보자~  (0) 2016.10.18

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

(소개) 요로리의 트릭스터 규닝서버

game/play 2018.11.27 14:28
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

아주 오래전 트릭스터라는 게임을 한적이 있다. 드릴질을 엄청 했었는데..ㅋㅋ 

해당 게임은 망해서 국내에 서비스하지 않고 있는데 외국이나 트릭스터 팬들 중 게임쪽으로 일가견이 있는 분들이 서버를 운영하고 있다카던데 그런 서버들 중 하나가 규닝서버이지 않나 싶다.  무튼 트릭스터 팬들에게 있어서는 매우 좋은 소식이다!

아래는 요로리라는 여성 유튜버님께서 방송을 하는 내용인데 나처럼 게임을 직접 하기는 싫지만 게임을 즐기고 싶은 사람에게는 매우 좋은 유튜브이다 ㅎㅎ 규닝서버가 더욱 더 활발해질수 있도록 기원한다. 그리고 요로리님의 구독자가 늘어서 지속적인 유튜브 포스팅을 해주었으면 하는 바램에 이렇게 홍보차원에서 포스팅을 해본다! 흥해라~트릭스터~흥해라 요로리~




더 많은 영상을 보시려면 아래의 주소를 꾹~누르시면 됩니다.

https://www.youtube.com/channel/UClMpzJOOYjYYbkUVFhblXLw


   끝~


'game > play' 카테고리의 다른 글

(소개) 라그나로크 제로 묘르닐섭  (0) 2019.02.13
(소개) 요로리의 트릭스터 규닝서버  (0) 2018.11.27

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

[mysql] select 한것 update하기

DataBase/MySql 2018.11.23 13:56
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

Mysql에서~

SELECT 를 하여 원하는 테이블의 필드에 데이터를 채우고자 했다.

같은 테이블일 경우

UPDATE 테이블명

SET 데이터 들어갈 필드 = 데이터있는필드

WHERE 조건문 블라블라


다른 테이블일 경우

UDATE  테이블1, 테이블2

SET 테이블1.필드 = 테이블2.필드

WHERE 조건문 블라블라 


작업전엔~SELECT로 확인 후 작업이 센스~


acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

mysql Lock wait timeout exceeded; try restarting transaction: Timeout on record in index:

DataBase/MySql 2018.10.30 16:36
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


error 

Lock wait timeout exceeded; try restarting transaction: Timeout on record in index:


solution

show processlist;

kill <process id>;


참고 사이트 : https://stackoverflow.com/questions/5836623/getting-lock-wait-timeout-exceeded-try-restarting-transaction-even-though-im

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring Boot + Spring Batch 분석_02

OpenSource/Spring Batch 2018.10.23 19:14
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

2018/10/12 - [OpenSource/Spring Batch] - Spring Boot + Spring Batch 분석_01

 저번 분석에서는 Job에 대해서 알아보았습니다. 

이제 Step에 대해 알아보도록 하겠습니다.

설명하고 있는 소스는 https://spring.io/guides/gs/batch-processing/ 를 참고!

// tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    }
    // end::jobstep[]
  • Step의 메소드명은 step1
  • 파라미터는 JdbcBatchItemWriter<Person> writer 
  • return은 stepBuilder
  • 내용을 파악하기 전에 SpringBatch의 Flow를 파악해보면 좋을것 같다.
    왜? 나는 chunk, reader, processor, writer를 알아야하는가?에 대한 답변이 될꺼라 생각한다.
  • SpringBatch Flow
  • 이제 하나하나씩 알아가보자.
  • chunk를 보자.
    • 우선 chunk(청크)란 배치선 덩어리 데이터들을 단위별로 묶어서 처리되어지는 수!
      즉, 위에 10이라는 뜻은 
      10개를 모아서 Chuck단위(10)로 트랜잭션을 이루고 있다고 보면 된다.
      트랜잭션 수행이기 때문에 실패 시 
      Chunk단위로 롤백이되고, 이전에 커밋된 트랜잭션까지는 반영이 된다는 뜻이다.
    • <Person, Person> chunk(10)에서 <Person, Person>은 제네릭 타입으로
      각 청크의 input과 output type을 나타낸다. 
    • ItemReader<Person>과 ItemWriter<Person>로 생각하면 된다.
  • reader(reader())를 보자.
    • reader? 뜻 그대로 읽어들이는 것이다. 무엇을? 데이터를~(txt, api, db 등등등)
       @Bean
          public FlatFileItemReader<Person> reader() {
              return new FlatFileItemReaderBuilder<Person>()
                  .name("personItemReader")
                  .resource(new ClassPathResource("sample-data.csv"))
                  .delimited()
                  .names(new String[]{"firstName", "lastName"})
                  .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                      setTargetType(Person.class);
                  }})
                  .build();
          }
      
    • 위의 FlatFileItemReader는 SpringBatch에서 제공해주는 녀석이다.
      json, xml 형태가 아닌 말그대로 flat file을 읽어들인다.
      import org.springframework.batch.item.file.FlatFileItemReader;
      import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
    • FlatFileItemReaderBuilder! 이녀석 또한 Builder Pattern. 
      • name : reader instance명 
      • resource : 근원지 즉, read할 flat file.
      • delimited() : 명시적이지 않을 때 사용!
        DelimitedLineTokenizer를 작성하기위한 FlatFileItemReaderBuilder.DelimitedBuilder의 인스턴스를 리턴합니다. 이 빌더에 의해 구성된 DelimitedLineTokenizer는 lineTokenizer를 통해 명시적으로 구성되지 않은 경우에만 사용됩니다.
      • names : sample-data.csv의 내용과 names에서 선언한 포맷에 맞게 들어오게 되며 이 데이터는
      • fieldSetMapper()를 통해 DTO에 매핑 되어진다.
      • 예를 들어 아래의 데이터 중 Jane, Doe라고 한다면  String[]{"firstName", "lastName"}에 담긴다는 것이고 이것은 fieldSetMapper를 통해 객체에 담기게 된다. 

                  


    • processor(processor)
      • PersonItemProcessor는 ItemProcessor의 구현체이다.
        • Person객체를 input으로 하여 가공한 뒤에 output으로 Person을 리턴한다. 
          @Bean
              public PersonItemProcessor processor() {
                  return new PersonItemProcessor();
              }
          package hello;
          
          import org.slf4j.Logger;
          import org.slf4j.LoggerFactory;
          
          import org.springframework.batch.item.ItemProcessor;
          
          public class PersonItemProcessor implements ItemProcessor<Person, Person> {
          
              private static final Logger log = LoggerFactory.getLogger(PersonItemProcessor.class);
          
              @Override
              public Person process(final Person person) throws Exception {
                  final String firstName = person.getFirstName().toUpperCase();
                  final String lastName = person.getLastName().toUpperCase();
          
                  final Person transformedPerson = new Person(firstName, lastName);
          
                  log.info("Converting (" + person + ") into (" + transformedPerson + ")");
          
                  return transformedPerson;
              }
          
          }
        • 정리하면 processor의 역할은 read한 것을 가공하여 write에 주는 것이다.


  • writer(writer)
    • 이제 마지막으로 writer입니다.
      여기에서는 데이터베이스 관련 writer중 JdbcBatchItemWriter가 사용되어집니다.
@Bean
    public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Person>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
            .dataSource(dataSource)
            .build();
    }
    • JdbcBatchItemWriterBuilder가 사용.
      • itemSqlParameterSourceProvider()
        • 작성자가 사용할 ItemSqlParameterSourceProvider를 구성합니다.
          beanMapped ()가 호출되지 않은 경우에만 사용해야합니다.
        • BeanPropertyItemSqlParmeterSourceProvider
          • SQL구문에서 파라미터에 사용되어지는 명명 중 JavaBean(Person)에 속성에 해당되면 
            공하여준다.
      • sql : sql구문
      • dataSource : @EnableBatchProcessing에 의해 생성.



'OpenSource > Spring Batch' 카테고리의 다른 글

Spring Boot + Spring Batch 분석_02  (0) 2018.10.23
Spring Boot + Spring Batch 분석_01  (0) 2018.10.12
SpringBatch 예제  (0) 2018.09.12
MyBatisPagingItemReader를 사용할 때 유의점  (0) 2015.10.02
Spring Batch 환경 셋팅  (0) 2012.09.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Error: ✗ Could not create /var/lib/grafana/plugins/grafana-piechart-panel/.gitignore. Permission denied. Make sure you have write access to plugindir

CM/ansible 2018.10.23 15:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


ansible + grafana환경에서 아래와 같은 오류가 발생하였다.

Error: ✗ Could not create /var/lib/grafana/plugins/grafana-piechart-panel/.gitignore. Permission denied. Make sure you have write access to plugindir


NAME:

   Grafana cli plugins install - install <plugin id> <plugin version (optional)>


USAGE:

   Grafana cli plugins install [arguments...]



첫번째 해결책으로 아래와 같이 user: root를 통해 해결하였다.

- name: run grafana 
  docker_container: 
     name: grafana 
     user: root   
     .....


하지만 user: root 특히 root권한을 사용하는것이 review통해 지적이 나왔다.

그래서 테스트를 하다 원인을 알게 되었다. 원인은 바로 기존에 사용되어진 볼륨 이였다.

docker volume rm 볼륨이름 을 통하여 삭제 한 뒤 해보니 잘되었다.

아쉽게 재현을 다시 해보려고 하는데 잘되지 않았다..ㅠㅠ

(하도 개발서버에서 이것저것 했더니..) 정확한 원인을 찾아내기가 여간 어려운 일이 아니다..




acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

ansible error - may be elsewhere in the file depending on the exact syntax problem.

CM/ansible 2018.10.23 15:38
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


may be elsewhere in the file depending on the exact syntax problem.  

The offending line appears to be:   

- name: Create a data volume   

^ here

위의 오류는 ansible 버전이 낮아서 나는 오류이다.

ansible은 버전이 2.7이상이어야 docker_volume을 사용할 수가 있다.

참고 사이트 : 

https://docs.ansible.com/ansible/latest/modules/docker_volume_module.html?highlight=docker_volume



acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

Spring Boot + Spring Batch 분석_01

OpenSource/Spring Batch 2018.10.12 15:51
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T


주저리 

   spring boot를 사용하여 
   spring batch를 해보려는데 막상 spring batch를 잘모르면 제대로 못할것 같은 생각이 들었다.
   springframework를 spring boot기반으로 해볼때도 마찬가지였다.


구성

  • Job과 Step으로 구성.
    • Job
      • 여러개의 Step으로 구성.
        • Step은 ItemReader, ItemProcessor, ItemWriter의 구조이거나 
          이런 전형적인 구조가 아닐 경우 Tasklet 구조.

분석

    2018/09/12 - [OpenSource/Spring Batch] - SpringBatch 예제

    에서 처럼 https://spring.io/guides/gs/batch-processing/
   공식 사이트를 살펴보도록 하자.


org.springframework.boot:spring-boot-starter-batch 디펜던시는 요녀석!

Batch Job을 구성할 때 
Spring Batch는 따로 작성할 필요없이 비즈니스 로직에 집중할 수 있도록 많은 유틸리티를 제공한다.


BatchConfiguration! 이부분은 옛날 Spring Batch에서 xml로 구성되던 녀석이다.

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {


하나하나씩 보도록 하자. 우선 Factory를 DI 하는 것을 볼수 있다.

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

Factory는 Job과 Step에서 사용!
// tag::jobstep[]
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    }
    // end::jobstep[]


그리고 Step에서 사용되어지는 reader, processor, writer도 함께 구성.

    // tag::readerwriterprocessor[]
    @Bean
    public FlatFileItemReader<Person> reader() {
        return new FlatFileItemReaderBuilder<Person>()
            .name("personItemReader")
            .resource(new ClassPathResource("sample-data.csv"))
            .delimited()
            .names(new String[]{"firstName", "lastName"})
            .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }})
            .build();
    }

    @Bean
    public PersonItemProcessor processor() {
        return new PersonItemProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<Person> writer(DataSource dataSource) {
        return new JdbcBatchItemWriterBuilder<Person>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)")
            .dataSource(dataSource)
            .build();
    }
    // end::readerwriterprocessor[]


구조는 이러하고..이제 조금 더 자세하게 보도록 하자.

More and More


BatchConfiguration.java

  1. @Configuration : 설정 파일임을 알려준다. @MVC에서 @service @controller와 같다고 보면 된다.
  2. @EnableBatchProcessing : Batch 관련 유용한 유틸을 제공가능케 한다. 영어 고대로 Enable하겠다는 뜻.
  3. 위에서 언급한 내용처럼 Factory를 DI 하여 Job과 Step을 구성한다.
    1. Job은 Step으로 구성하여 만들어지고 Step은 reader, processor, writer를 구성할 수 있다.
  • 어노테이션 @Autowired로 DI 해주는 부분.
    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;
  • Job과 Step을 설정 해주는 부분.
    @Bean
    public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
        return jobBuilderFactory.get("importUserJob")
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JdbcBatchItemWriter<Person> writer) {
        return stepBuilderFactory.get("step1")
            .<Person, Person> chunk(10)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    } 
    • Job은 아래와 같이 importUserJob이라는 함수명을 가지며, 파라미터로는 listener, step
    • return으로는 JobBuilderFactory를 이용하여 Job을 리턴하는 구조이다.
      • jobBuilderFactory.get은 job builder를 생성하고 JobRepository를 초기화 시킨다.

[ Spring Batch 흐름도]

         

      • 아래를 좀 더 심화있게 이해하려면 builder pattern을 이해해야한다. 
      • 하지만 우선적으로 Spring Batch에 대해서 파악하는게 우선이다. 
      • 이제 돌아와서 incremeter를 보자.
        • JobBuilderHelper Class에 속해있는 method이다. 
        • JobBuilderHelper는 JobBuilder의 부모 클래스이다.
        • 포맷은 아래와 같다.
          • public B incrementer(JobParametersIncrementer jobParametersIncrementer)
          • 파라미터로 JobPrametersIncrementer를 가지는데 이것은 Interface 형태이다.
          • 이 Interface를 구현한 녀석이 위에 사용되어진 RunIdIncrementer Class 이다.
        • 그리고 incrementer 이녀석이 하는 역할은 JobParametersIncrementer 인터페이스의 
          역할을 보면 알수 있다. JobParameters를 취득하기 위한 인터페이스이기 때문이다.
        • JobParameters..! 이녀석을 이해하려면 아래의 그림을 이해해야한다.
        • 동시 다발적으로 돌아가는 Job들의 차이는 어떻게 알수가 있나? Job들 간의 구별? 그 해답은 JobParameters에 있다. 그래서 batch job을 시작할 때 이처럼 JobParameters를 취득한다.
          더욱 더 자세한 내용은 해당 링크를 참조. 

           

        • 그 다음으로 listener.
          • JobBuilderHelper Class에 속해 있는 Method이며, format은 아래와 같다.
            public B listener(JobExecutionListener listener)
          • JobExecutionListener도 Interface이며 지금 설명하는 소스에서는 
            JobCompletionNotificationListener Class에서 extends하고 있다.
          • JobCompletionNotificationListener.java
            package hello;
            
            import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;
            import org.springframework.batch.core.BatchStatus;
            import org.springframework.batch.core.JobExecution;
            import org.springframework.batch.core.listener.JobExecutionListenerSupport;
            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.jdbc.core.JdbcTemplate;
            import org.springframework.stereotype.Component;
            
            @Component
            public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
            
            	private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
            
            	private final JdbcTemplate jdbcTemplate;
            
            	@Autowired
            	public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
            		this.jdbcTemplate = jdbcTemplate;
            	}
            
            	@Override
            	public void afterJob(JobExecution jobExecution) {
            		if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
            			log.info("!!! JOB FINISHED! Time to verify the results");
            
            			jdbcTemplate.query("SELECT first_name, last_name FROM people",
            				(rs, row) -> new Person(
            					rs.getString(1),
            					rs.getString(2))
            			).forEach(person -> log.info("Found <" + person + "> in the database."));
            		}
            	}
            }
          • 위의 소스는 job이 BatchStatus.COMPLETED인가에 대해서 listen하고 있다. 그리고나서 JdbcTemplate를 사용한다.
        • 다음으로 flow.
          • JobBuilder Class에 속해 있는 Method이며, format은 아래와 같다.
            public JobFlowBuilder flow(Step step)
            딱 봐도 job과 step의 연결 & 수행. return으로는 a SimpleJobBuilder.
        • 다음으로 end. 즉, builder를 종료.
        • 다음으로 build() : 호출하여 최종적으로 a job builder를 리턴. 

지금까지 Job 관련 내용들을 살펴 보았습니다.

다음 포스팅에서는 비즈니스 로직을 당담하고 있는 Step에 대해서 알아보도록 하겠습니다.

2018/10/23 - [OpenSource/Spring Batch] - Spring Boot + Spring Batch 분석_02




'OpenSource > Spring Batch' 카테고리의 다른 글

Spring Boot + Spring Batch 분석_02  (0) 2018.10.23
Spring Boot + Spring Batch 분석_01  (0) 2018.10.12
SpringBatch 예제  (0) 2018.09.12
MyBatisPagingItemReader를 사용할 때 유의점  (0) 2015.10.02
Spring Batch 환경 셋팅  (0) 2012.09.03

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::