2023 패캠 수강후기 이벤트가 있어서 글을 써봅니다.

- 실시간 데이터 처리 위한 Spark & Flink & Kafka

 

회사에서 실시간 스트리밍 처리를 위해 Flink를 도입하였는데, 

대부분의 자료들이 영어라 학습이 더딘것도 있고... 좀더 빠르게 습득하기 위해 해당 강좌를 수강하였습니다.

(회사에서 지원 해주면 좋을텐데...ㅠㅠ)

 

수강 후기

처음에 딱 들어갔을 때, 35시간의 방대한 분량에 말문이... (엄청 많은 지식을 공유주신 강사님께 감사감사..)


내 주요 목표는 Flink 학습이였기에, Part 4. 스트림 프로세싱 부터 본격적으로 들었다.
시작은 이론. 자세하게 설명하지는 않고 개관을 잡고 가는 느낌~.
ch02-02 부터 기대했던 코드 기반 수업이 시작되었습니다.
하나하나 따라하다보니 건질게 많다는 생각이 드네요!


목표, 기대평

싼 금액은 아니여서 이번에는 꼭 완강을 목표로 해야겠다 생각하며

틈틈히 듣고 있습니다!

앞으로 남은 코드 수업을 다 습득하여 Flink 중급자 이상의 실력이 쌓이길! 

(내년엔 이직^^)

 

추가로,

좋은 점은 디스코드 방이 있어서 이곳에서 모르는 것을 질문할수 있습니다.

 

 

다음에는 끝까지 듣고 또 완강 후기를 남겨보고 싶습니다!

 

 

'본 게시물은 패스트캠퍼스 수강 후기 이벤트 참여를 위해 작성되었습니다'

'IT 개발 > 데이터 엔지니어(Data Engineer)' 카테고리의 다른 글

Tableau UpdateUserStartPage with Full Screen  (0) 2022.01.16
태블로  (0) 2021.08.09
BigQuery  (0) 2021.07.02

태블로 시작 화면을 변경 가능하다.

 

시작화면 셋팅 정보

  • Tableau > Setting > Start Page

  • 변경하는 방법 (how to change it) : 시작하고자 하는 화면에서 우측상단 > 시작페이지 설정 > 본인전용(내 화면만 변경), 모든 서버 사용자용 (모든 사용자에게 적용)

 근데 막상 시작화면으로 넘어가보면 상단에 도구창이 존재한다.

어떻게 도구창을 없앨 수 있을까?

  • /views/_0/sheet0  해당 URL을 다음과 같이 변경한다.
  • /views/_0/SiteMap?:embed=yes&:tabs=no 

도구창이 사라졌다!

 

그럼 StartPage에 아래 주소로 등록하면 된다!

  • /views/_0/SiteMap?:embed=yes&:tabs=no

화면에서는 등록이 안되는 것 같아서 /POST API를 날려서 적용하기로 한다.

POST API 정보는 아래와 같다.

 

POST MAN을 사용해도 되나 JMeter를 통해 API를 날리기로 했다.  

 

JMeter > File Open > JMX  파일 선택

자동으로 입력된 설정 정보와 Thread Group 안의 Test를 볼 수 있다.

내가 필요한 api는 (updateUserStartPage와 updateStringServerSetting) 두가지이므로 나머지는 삭제. (두 api중 하나만 쓴다..)

1) updateStringServerSetting 모든 사용자의 화면에 적용

2) updateUserStartPage 내 화면에만 적용

 

그리고 Thread Group의 옵션은 1 / 1 / 1 (1번만 api를 날릴 것 이기때문)

Thread Group에 View Results Tree를 넣고 확인 해 본다.

파란불 떠야 정상 / 빨간불은 실패.. session_id 나 xsrf-token을 잘 확인.

 

 

Ref.

태블로 api 리스트!!

https://viziblydiffrnt.github.io/vizportal.html#sites

'IT 개발 > 데이터 엔지니어(Data Engineer)' 카테고리의 다른 글

패스트캠퍼스 + 온라인 (2023 수강후기 이벤트)  (0) 2023.12.11
태블로  (0) 2021.08.09
BigQuery  (0) 2021.07.02

option + enter : 한자 입력

 

 

https://youtu.be/wt4Bcrj58hk

책 : Jump to Python

 

  1. print
    • print("life" "is") = print("life" + "is") >> lifeis
      print("life", "is") >> life is
      for i in range(5):
          print(i, end=' ') >> 0 1 2 3 4
  2. 함수 
    • def add(a,b):
          return a+b
          ~~ ==> 실행 안될껄?
          
      add(3, 5)
      add(b=5, a=3) 
      
      def add_many(*args):  ==> args는 튜플을 만들어 줌
      	result = 0
          for i in args: 
          	result = result + i
          return result
          
      <키워드 파라미터>
      def print_kwargs(**kwargs):
          print(kwargs)
      print_kwargs(a=1) >> {'a': 1} ==> 딕셔너리 형태로 만들어 짐. 
      
      def add_and_mul(a,b):
          return a+b, a*b
      add_and_mul(3,4) >> (7, 12) ==> 튜플로 나옴
      res1, res2 = add_and_mul(3,4) >> res1 = 3, res2 = 4
      
      def say_myself(name, old, man=True): ==> 미리 man에다가 초기값을 넣을 수 있음. 
      
      <함수 안에서의 변수의 효력 범위 - 주의할것>
      a = 1
      def vartest(b):
          a = b + 1
          return a
      print(a) >> 1 ==> 함수 내부의 로직에 의해 a가 변경되지 않음.
      a = vartest(a) ==> 함수 결과를 return해서 넣어줘야 함.
      print(a) >> 2
      
      a = 1
      def vartest():
          global a
          a = a + 1
      vartest()
      print(a) >> 2 ==> global로 a를 선언하면 적용 되나 좋은 방법은 아님. 외부 변수에 종속적인 함수는 좋지 않음.
      
      <lambda> def와 동일한 역할. 보통 함수를 한줄로 간결하게 만들 때 사용.
      add = lambda a, b: a+b
      result = add(3, 4)
      print(result) >> 7
  3. 주석문 여러줄
    • """
      주석 주석
      주석
      주석
      """ ==> ''' 도 가능
  4. 자료형
    • a = "Life is too short"
      
      a[0] >> 'L'
      a[-1] >> 't'
      a[-1] = a[0] >> 'L'
      a[0:4] >> Life
      a[19:] >> 19부터 끝까지
      a[:] >> 전체
      
      a[0] = 'y' >> error ==> 문자열은 immutable 자료형
      
      문자열 포매팅
      "I eat %s apples." % "five" ==> 숫자, 변수도 가능
      "I ate %d apples. so I was sick for %s days." % (number, day)
      
      %s ==> String ==> 어떤 형태의 값이든 변환 가능(뒤에 오는 값을 모두 문자열로 바꿈)
      %c ==> Character
      %d ==> Integer
      %f ==> Floting-point
      %o ==> 8진수
      %x ==> 16진수
      %% ==> Literal % (문자 '%' 자체)
      "Error is %d%%." >> Error is 98%.
      
      "%5s" % "hi" >> '   hi' ==> 오른쪽 정렬, 총 5칸, 공백 3칸
      "%-5sjane" % "hi" >> 'hi   jane'  
      
      "%0.4f" % 3.42134234 >> 3.4213
      "%10.4f" % 3.42134234 >> '    3.4213' ==> 공백3, 전체길이10(.포함)
      
      "I eat {0} apples. {1} bananas.".foramt(3, 5) >> I eat 3 apples. 5 bananas.
      "I eat {num1} apples. {num2} bananas.".foramt(num1=3, num2=5) >> I eat 3 apples. 5 bananas.
      
      format 정렬(p.64)
      
      f'나의 이름은 {val1} 입니다. 나이는 {val2}입니다.' ==> 파이썬 3.6이상부터 가능
      d = {'name': '경훈', 'age': 34}
      print(f'나의 이름은 {d["name"]}, 나이는 {d["age"]-3} 입니다.')
      
      f 공백채우기(p.66)
      f'{{ and }}' >> '{ and }'
      
      a = "hobby"
      a.count('b') >> 2
      a.find('b') >> 2 ==> 없을 때는 -1
      a.index('b') >> 2 ==> 없을 때는 -1
      
      ",".join('abcd')
      'a,b,c,d'
      
      a.upper() 대문자
      a.lower() 소문자
      a.lstrip() 왼쪽 공백 지우기
      a.rstrip() 오른쪽 공백 지우기
      a.strip() 양쪽 공백 지우기
      a.replace("before", "after") 문자열 바꾸기
      a.split(':') 문자열 나누기, param이 없는 경우 공백 기준으로 나눔
  5. 리스트
    • odd = [1,2,3,4,5]
      odd[-1] >> 5 마지막 인덱스 값
      emptyList = list()
      
      list1 + list2 가능 >> list1.extend(list2)와 동일
      list * 3 가능
      
      del list[i] 삭제
      del list[2:] 슬라이싱 삭제 가능
      
      list.append(4) 가능
      
      list.sort() 정렬 > 문자인 경우 알파벳 순
      list.reverse() 뒤집기
      list.index(x) >> x의 위치값을 돌려줌
      
      list.insert(a,b) >> a번째 위치에 b를 삽입
      list.remove(x) >> 첫번째 x를 삭제
      
      list.pop(x) >> x번째(null :마지막 요소)를 돌려주고 삭제
      
      list.count(x) >> x가 몇개 있는지 리턴
  6. 튜플
    • 튜플은 immutable
      
      t1=()
      t2=(1,) ==> 1개의 요소만 가질 경우 , 를 붙여야 함
      t3=(1,2,3)
      t4=1,2,3
      t5=('a','b',('ab','cd'))
      
      인덱싱, 슬라이싱, 튜플더하기, 곱하기, 길이구하기 가능
  7. 딕셔너리
    • d = {'key':'value', 'k2':'v2'}
      
      a = {1: 'hi'}
      a = {'a': [1,2,3]}
      
      a[2] = 'b' >> {2:'b'} 딕셔너리 쌍을 추가
      
      a[key] >> key가 없는 경우 에러
      
      del a[2] >> 삭제
      
      딕셔너키 키는 중복 안됨
      
      키값에 리스트 불가, 튜플(변하지 않기에) 가능
      
      a.keys() >> 키 리스트 반환 : 3.0 버전 이후부터는 dict_keys 객체를 반환
      list(a.keys()) : dict_keys 객체를 리스트로 변환
      
      a.values() >> dict_values 객체 반환
      
      a.items() >> dict_items 객체 반환 : 키-밸류 쌍을 튜플로 묶은 값
      
      a.clear()
      
      a.get('name') >> a['name'] 과 같으나 null인 경우 None을 반환  
      
      a.get('foo','bar') >> foo 값으로 검색해서 없으면 bar를 반환
      
      'name' in a >> key가 있으면 True, 없으면 False
  8. 집합
    • s = set()
      s1 = set([1,2,3])
      s2 = set("Hello") >> {'e','H','l','o'} ==> 중복 불가, 순서가 없음 ==> 인덱싱으로 접근 불가
      l1 = list(s1) >> set을 list나 tuple로 변환해야지 인덱싱 가능
      t1 = tuple(s1)
      
      set을 통해 교집합, 합집합, 차집합 구하기 가능
      s1 & s2 >> 교집합
      s1.intersection(s2) >> 교집합
      
      s1|s2 >> 합집합
      s1.union(s2) >> 합집합
      
      s1 - s2
      s2 - s1
      s1.difference(s2) >> 차집합
      
      s1.add(4) >> 값 추가하기
      s1.update([4,5,6]) >> 여러개 추가하기
      s1.remove(2) >> 특정 값 삭제하기
      
      type(x) >> 자료형 확인
      id(x) >> 변수의 객체 주소 값 반환
  9. 변수 : 자료형의 값을 저장하는 공간
    • a = [1,2,3]
      b = a ==> b와 a가 동일한 변수를 바라봄. 둘중에 하나라도 변경 시 같이 변경 됨
      
      값만 복제 하기
      b = a[:]
      b = copy(a)
      
      a = 3
      b = 5
      a,b = b,a >> a가 5, b가 3이 된다.
  10. 제어문
    • <if>
      if boolean:
          state1
      elif boolean2:
          state2
          pass ==> 
      else:
      	state3
          
      if score >= 60:
      	message = "Success"
      else:
          message = "failure"
      아래처럼 축약 가능
      message = "Success" if score>=60 else "failure"
          
      <boolean>
      x or y : x와 y 둘 중에 하나만 참이여도 참이다
      x and y : x와 y 모두 참이어야 참이다.
      not x : x가 거짓이면 참이다.
      x (not) in {list, tuple, 문자열}
      
      <while>
      break를 사용해서 빠져 나온다.
      continue >> 맨 처음으로 돌아간다.
      
      <for>
      
      for i in list:
      	state
          
      a = [(1,2), (3,4), (5,6)]
      for (first, last) in a:
      	print(first + last)
          
      a = range(10) >> 0부터 9까지 리스트를 자동으로 만들어 줌
      a = range(1,11) >> 1부터 10까지 만듬.
      for i in range(1,11):
      	add = add+i
          
      <리스트 내포>
      a=[1,2,3,4]
      b= [num * 3 for num in a] >> [3,6,9,12]
      b= [num * 3 for num in a if num % 2 == 0] >> [6,12] : 조건문도 포함 가능
      b= [x * y for x in range(2,10)
          for y in range(1,10)]
  11. 파일 입출력
    • f = open("path/to/file", 'w') ==> 파일 이름, 파일 열기 모드 ( r: 읽기모드. w: 쓰기 모드, a: append)
      f.write(data) 
      f.close()
      
      f = open("txt", 'r')
      while True:
          line = f.readline() ==> 더 이상 읽을 줄이 없는 경우 None을 출력
          if not line: break
          print(line)
      f.close()
      
      lines = f.readlines() ==> 각 라인을 리스트로 돌려준다.
      for line in lines:
          print(line)
          
      data = f.read() ==> 전체를 문자열로 돌려준다. 
      print(data)
      
      <with를 사용하면 자동으로 close해줌>
      with open("txt", 'w') as f:  ==> with 블록을 벗어나는 순간 파일객체 f가 자동으로 close 됨.
          f.write("text blabla")
  12. class
    • class Calc:
          def __init__(self, first, second):
              self.first = first
              self.second = second
          def setdata(self, f, s):
          	self.first = f
              self.second = s
          def add(self):
          	result = self.first + self.second
              return result
          def div(self):
          	return self.first / self.second
              
      a = Calc(4, 2) ==> init 매개변수를 꼭 넣어줘야 함.
      
      <상속>
      class InheritCalc(Calc):
      	pass
          
      a = InheritCalc(4, 2)
      a.add() >> 6
      
      <오버라이딩>
      dev()에서 0으로 나누면 에러.
      class SafeCalc(Calc):
      	def div(self):
          return self.first / self.second if self.second !=0 else 0
          
      <클래스 변수>
      class Family:
      	lastname = "염"
          
      print(Family.lastname) >> 염
      
      a = Family()
      b = Family()
      Family.lastname = "한"
      print(a.lastname) >> "한" ==> 클래스 변수 변경 시 모든 객체에 적용되므로 주의. 왠만하면 객체 변수 사용.
  13. 모듈
    • 동일한 디렉터리에 있을 때 import 가능
      
      mod1.py
      ==================
      def add(a, b):
      	return a+b
          
      if __name__ == "__main__": ==> mod1.py가 실행됬을 때만 동작, import되었을때는 __name__=mod1 이다.
      	print(add(1,4))
      ==================
      
      import mod1
      print(mod1.add(3,4))
      
      from mod1 import *
      print(add(3,4))
      
      ------------------------------------------------------------------------------------
      
      mod2.py
      ==================
      PI = 3.141592
      
      class Math:
      	def solv(self, r):
          	return PI * (r ** 2)
              
      def add(a, b):
      	return a+b
          
      if __name__ == "__main__": ==> mod1.py가 실행됬을 때만 동작, import되었을때는 __name__=mod1 이다.
      	print(add(1,4))
      ==================
      
      import mod2
      print(mod2.PI) >> 3.141592
      print(mod2.Math().solv(2)) >> 12.566368
      
      -------------------------------------------------------------------------------------
      
      sys.path.append("모듈 위치")
      import 가능
      
      set PYTHONPATH="모듈위치"
      import 가능
  14.  

 

 

여러 버전을 설치하여 파이썬 버전이 뒤죽박쭉.

pyenv 를 통해서 정리. :) 

 

https://www.daleseo.com/python-pyenv/

 

 

여러 버전의 파이썬 관리하기 (pyenv)

Engineering Blog by Dale Seo

www.daleseo.com

 

 

'머신러닝 > 파이썬 라이브러리 Numpy, Pandas' 카테고리의 다른 글

Numpy 2  (0) 2020.08.26
Numpy 1  (0) 2020.08.04
환경구성  (0) 2020.08.03

+ Recent posts