2021년 7월 28일 수요일

[ Kubernetes ] 도커를 이용한 쿠버네티스 기본예제


[ 도커설치 ] 

sudo yum -y update

sudo yum -y install docker

docker version

sudo yum -y install git 

# demo 다운로드

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


# 도커실행

sudo systemctl status docker

sudo systemctl start docker


# demo 실행

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

*웹 브라우저 http://localhost:9999 로 들어가

Hello, 世界 글귀를 확인



[ 도커이미지 빌드 ]

sudo docker image build -t myhello .

sudo docker container run -p 9999:8888 myhello


# 도커 컨테이너 레지스트리

https://hub.docker.com/ 에서 도커계정생성


# 도커로그인

sudo docker login

...

Username : user_id

Password : ****

...

Login Succeeded


# 도커 이미지 푸쉬

sudo docker image tag myhello yourID/myhello

sudo docker image push yourID/myhello
















# 인터넷이 연결된 곳이라면 어디서든 내 컨테이너 이미지 사용가능

sudo docker container run -p 9999:8888 yourID/myhello




[ 쿠버네티스 설치 ]

단일클러스터에서 실행이기 때문에 minikube 설치

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube

sudo mkdir -p /usr/local/bin/

sudo install minikube /usr/local/bin/


* 아래와 같은 에러가 난다면

  - docker: Not healthy: "docker version --format {{.Server.Os}}-{{.Server.Version}}" exit status 1: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version": dial unix /var/run/docker.sock: connect: permission denied


sudo groupadd docker

sudo usermod -aG docker $USER

newgrp docker 


참조 : https://docs.docker.com/engine/install/linux-postinstall/



minikube status

만약 클러스터가 실행 중이면, minikube status 의 출력은 다음과 유사해야 한다.

host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured


정지시 

minikube stop





[ 쿠버네티스로 데모 애플리케이션 실행 ]


kubectl run demo --image=yourID/myhello --port=9999 --labels app=demo


kubectl port-forward pod/demo 9999:8888


-> 웹 브라우저 http://localhost:9999 확인

kubectl get pods --selector app=demo
NAME   READY   STATUS    RESTARTS   AGE
demo   1/1     Running   0          6m9s


# Pod삭제시

kubectl delete pod 1234-56-7890-234234-456456


# Delete all pods

kubectl delete pods --all


# 포트포워딩 후 http://yourip:9999 브라우저에서 output확인

kubectl port-forward yourDir/demo 9999:8888







2021년 7월 22일 목요일

[ Algorithm ] 폰켓몬 - Array to Set


[ 문제 ] 

https://programmers.co.kr/learn/courses/30/lessons/1845


* 제한사항

nums는 폰켓몬의 종류 번호가 담긴 1차원 배열입니다.

nums의 길이(N)는 1 이상 10,000 이하의 자연수이며, 항상 짝수로 주어집니다.

폰켓몬의 종류 번호는 1 이상 200,000 이하의 자연수로 나타냅니다.

가장 많은 종류의 폰켓몬을 선택하는 방법이 여러 가지인 경우에도, 선택할 수 있는 폰켓몬 종류 개수의 최댓값 하나만 return 하면 됩니다.


*입출력 예

nums result

[3,1,2,3] 2

[3,3,3,2,2,4] 3

[3,3,3,2,2,2] 2



[ 제출 ]

import java.util.*;

class Solution {
    public int solution(int[] nums) {

        int answer = 0;
        Set<Integer> p = new HashSet<Integer>();

        for(int e : nums)  p.add(e);
        if(p.size() > nums.length/2)
            answer = nums.length/2;
        else
            answer = p.size();

        return answer;
    }
}


[ 풀이 ]

nums의 int형 배열을 set으로 자료형변환을 통해 중복을 제거한다.

최대값은 N/2이므로 set에 담긴 요소의 갯수가 더 크다면 N/2를 반환한다.



[ 다른사람풀이 ]

import java.util.Arrays;

import java.util.stream.Collectors;


class Solution {
    public int solution(int[] nums) {

        return Arrays.stream(nums)
            .boxed()
          .collect(Collectors.collectingAndThen(Collectors.toSet(),phonekemons 
                -> Integer.min(phonekemons.size(), nums.length / 2)));
    }
}


첫번째 풀이의 기능을 자바 스트림을 이용하여 실행

코드가 좀더 간결해지고 내부반복자를 사용하기에 병렬처리가 용이하다.



2021년 6월 14일 월요일

[ Spark ] 예제코드 SBT환경에서 실행


Linux SBT Tool를 통해 프로젝트 구조를 만들었다면 

참조 : https://www.blogger.com/blog/post/edit/preview/5343302747859156115/6404446971532325983

ProjectName/build.sbt를 수정하여 버전 및 Library를 추가한다.


- Spark관련 라이브러리 추가

libraryDependencies ++= Seq(
        "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.2",
        "org.apache.spark" % "spark-core_2.11" % "2.4.0",
        "org.apache.spark" % "spark-sql_2.11" % "2.4.0",
        "org.apache.spark" % "spark-hive_2.11" % "2.4.0"
)

참고 : https://www.scala-sbt.org/1.x/docs/Library-Dependencies.html


$ sudo vi src/main/scala/Main.scala

import org.apache.spark.sql.SparkSession
object Main extends App {
  val spark = SparkSession.builder()
      .appName("Spark Hive Example")
      .enableHiveSupport()
      .getOrCreate()

  spark.sql("show databases").show()
}



# 스파크 코드작성
sudo vi src/main/scala/Main.scala

# jar파일로 빌드
sbt package

# jar파일 spark실행
spark-submit --class [클래스명] --master [local/yarn/yarn-client] [jar파일경로] [인자]

Ex)
spark-submit --class "Curator" --master local --deploy-mode client /home/ec2-user/spark/member-influencer-statistics/target/scala-2.11/member-influencer-statistics_2.11-1.0.jar '20210618' '2021-06-18'












[ Airflow ] Centos7 설치


[ 개요 ]

airflow 모듈

  • airflow webserver: 웹UI를 통해 workflow를 컨트롤 하기 위함
  • airflow scheduler: DAG 파일을 통록된 workflow를 지정된 시간에 동작시키는 역할
  • airflow worker: scheduler에 의해 할당된 workflow를 실제로 동작시킴
  • airflow kerberos(옵션) : 만약 kerberos 인증된 데이터소스(ex- 하둡)에 접근할때 커버로스 인증티켓을 주기적으로 갱신하기 위함




[ 사전설치 ]

## 파이썬 3.6 설치 및 virtualenv 설치

$ sudo yum install -y python3 python3-devel

$ sudo pip3 intall virtualenv


##추가 필요 모듈 설치

$ sudo yum install -y gcc gcc-c++ cyrus-sasl-devel mysql-devel


## https://github.com/inishchith/autoenv

## virtualenv를 편하게 사용하기 위해 autoenv 설치

## virtualenv를 활성화 하려면 매번 해당 디렉토리에 들어가서 source ./bin/activate 를 실행해줘야 한다.

## autoenv는 디렉토리 이동시 .env 파일의 유무를 확인한후 .env를 실행한다.

## 따라서 .env 파일을 만들고 virtualenv activate를 써주면 매번 activate를 해줄필요 없이 자동으로 처리된다.

$ sudo pip3 install autoenv

$ echo "source `which activate.sh`" >> ~/.bash_profile

$ source ~/.bash_profile



[ Airflow 설치 ]

$ mkdir ${airflow 설치 디렉토리}


## airflow_home 환경변수 지정, 지정된 위치에 airflow가 설치되게 된다.

$ echo 'export AIRFLOW_HOME=${airflow 설치 디렉토리}' >> ~/.bash_profile

$ source ~/.bash_profile


$ cd ${airflow 설치 디렉토리}


## 가상 환경 설치

$ virtualenv -p python3 venv

$ echo 'source $AIRFLOW_HOME/venv/bin/activate' >> .env

## airflow_home 디렉토리로 다시 접근하면 autoenv에 의해 .env가 읽히고 윗줄의 source 설정이 읽힌다.

## 아래와 같이 나와야 autoenv 설정이 제대로 된것이다.

$ cd $AIRFLOW_HOME

autoenv:

autoenv: WARNING:

autoenv: This is the first time you are about to source /${AIRFLOW_HOME}/.env:

autoenv:

autoenv:     --- (begin contents) ---------------------------------------

autoenv:     source ./venv/bin/activate

autoenv:

autoenv:     --- (end contents) -----------------------------------------

autoenv:

autoenv: Are you sure you want to allow this? (y/N) y


$ pip3 install apache-airflow==1.10.5


## initdb를 하면 초기 설정파일이 airflow_home에 생성된다.

$ airflow initdb

## dag가 저장될 디렉토리 생성

$ mkdir dags

$ ls -ah

.env  airflow.cfg  airflow.db    dags  logs  unittests.cfg  venv 


[ Airflow DB ]

DB컨트롤 툴인 DBeaver에서 SQLite를 선택하고 

Path를 airflow.db로 잡는다.


연결완료화면

















참조 : 

https://airflow.apache.org/docs/apache-airflow/stable/howto/set-up-database.html

https://louisdev.tistory.com/3



2021년 5월 27일 목요일

[ Spark ] Phoenix 연결 에러 ( NoSuchColumnFamilyException )

 

[ 에러 ] 

org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: 

Column family table does not exist in region hbase:meta


[ 원인 ]

연결하려는 Hbase와 Spark의 Hbase jar 파일의 버전이 맞지 않아 생김


[ 해결 ]

Spark에 설치된 Hbase와 Hbase관련 Jar파일,

연결하려는 Hbase와 관련 Jar파일의 버전을 맞춘다.



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