레이블이 빅데이터인 게시물을 표시합니다. 모든 게시물 표시
레이블이 빅데이터인 게시물을 표시합니다. 모든 게시물 표시

2018년 5월 14일 월요일

Apache Spark 2.0 개요



목차

  • Apache Hadoop
    • Hadoop 구성
  • Apache Spark
    • Spark란?
    • 데이터구조
    • 클러스터 구성
    • 에코 시스템
    • Apache Zeppelin
  • 설치
    • Apache Spark
    • Apache Zeppelin




Apache Hadoop

     Hadoop 구성
     HDFS (Hadoop Distributed File System)
: 파일을 클러스터에 분산해서 저장하고 관리하는 분산 파일 시스템


     MapReduce
: 대용량 데이터 처리를 분산 병렬 컴퓨팅 환경에서 처리하기 위한 소프트웨어 프레임워크. 함수형 프로그래밍에서 일반적으로 사용되는 Map과 Reduce 함수를 기반으로 주로 구성된다.

     YARN (Yet Another Resource Negotiator)
: 클러스터의 리소스 관리, 장애 관리 등을 담당하는 프레임워크

Apache Spark

     Spark란? (2018.04 현재 2.3.0 버전)
     오픈 소스 클러스터 컴퓨팅 프레임워크
     Hadoop 보다 100배 가량 빠르다.
     Hadoop 처리 방식
     장애복구 (Fault tolerance)를 위해서 비효율적이지만 디스크에 복구지점을 저장하면서 수행한다.
     Spark 처리 방식
     장애 복구는 RDD라는 데이터 구조와 DAG (Directed Acyclic Graph)를 이용한 Lineage(계보)를 이용해서 가능하다. 그래도 어쨌든 장애가 발생하면 처음부터 다시 시작해야 되긴하다.
     데이터 구조
     RDD (Resilient Distributed Datasets) - Spark 1.0
     데이터를 가지고 있으며, Scala collection으로 나타냄
     장애 발생 시 복구 가능
     Partition이라 불리는 작은 단위로 나눠서 사용 가능
     Partition을 single machine에서 처리하지 않고, cluster에 분배해서 처리
     한번 정의하면 변경 불가능. 읽기 전용 데이터 구조
     RDD 생성 방식
     데이터 소스로부터 불러옴
     다른 RDD를 변형해서 새로운 RDD를 만드는 것
     RDD 연산 : Lazy
     Transformation : 행위를 기록할 뿐 연산작업이 실제 이루어 지지 않음
     명령어 : map,  join, filter, sort 등...
     Action : 모든 작업을 최적화된 경로로 수행 (컴파일러와 비슷)
     명령어 : count, collect, reduce, save 등...
     DAG 형태로 Transformation의 Lineage(계보)를 만들고, 중간 과정 데이터는 전부 저장하지 않음
     장애 발생 시 Lineage를 통해서 처음부터 다시 계산 (게임 비유 -> 세이브 VS 공략집)
     DataFrame - Spark 1.3
     명시적인 타입이 지정이 안되어 있는 데이터 구조
     org.apache.spark.sql.Row 타입의 데이터로 구성된 데이터 셋
     개념적으로는 RDB의 테이블과 같다.
     DataSet - Spark 1.6
     정형 데이터, 반정형 데이터를 처리할 때 사용하는 데이터 구조
     lambda 함수 사용 가능
     사용 권장. 성능면에서도 우위에 있다.
     DataFrame, DataSet 통합 - Spark 2.0    
     Typed API : DataSet[T]
     Untyped API : DataFrame = DataSet[Row]
     비교
     DataFrame, DataSet 모두 내부적으로는 RDD를 사용한다.




     클러스터 구성
     Driver Program
: 프로그램의 Main 함수 (시작점)
     SparkContext
: 어떻게 클러스터에 접근할 수 있는지 알려주는 객체 (SparkConf 필요)
     Cluster Manager
: 클러스터에서 필요한 자원을 찾아줌
     Worker Node
: 실제 작업을 수행하는 노드
     Executor
: Task를 수행하는 Process
     Task
: Executor에 할당되는 작업의 단위
     Job
: 사용자 입장에서의 작업의 단위 (Task의 조합)
     에코 시스템 : 데이터 분석을 위한 종합 선물 세트
     분산 저장소 (Distributed Storage)
     Local FS
     HDFS (Hadoop Distributed File System)
     S3
     CFS (Cassandra File System)
     클러스터 리소스 매니저 (Cluster Resource Manager)
     Standalone
     Hadoop YARN
     Apache Mesos
     Spark Core API
     다양한 언어 지원 : Scala (추천), Python, Java, R
     쉽고 편리한 인터페이스
     Spark SQL (SQL Queries) ↔ Apache Hive
     Spark Streaming (Stream Processing) ↔ Apache Storm
     MLlib (Machine Learning) ↔ Apache Mahout
     GraphX (Graph Processing) ↔ Apache Giraph
     Apache Zeppelin
     Zeppelin이란?
     클러스터 구성 없이 간단하게 Spark를 실행할 수 있는 환경
     Jupyter Notebook과 비슷
     인터랙티브하게 실행할 수 있다.
     Spark SQL 실행 결과를 바로 시각화 할 수 있다.

설치

Apache Spark 설치

     사전 조건
     Ubuntu 14.X 이상
     JAVA 1.7 버전 이상 설치, JAVA_HOME 환경변수 등록
     바이너리 다운로드
     https://spark.apache.org/downloads.html 에서 원하는 버전 선택해서 다운로드
     Apache Zeppelin이 지원하는 최신 버전이 2.2.0이므로 그 버전 다운로드
     압축 해제 (/home/ubuntu 가 홈이라고 가정)
     tar zxvf spark-2.2.0-bin-hadoop2.7.tgz
     소프트링크 생성
     ln -s spark-2.2.0-bin-hadoop2.7 spark
     환경변수 등록
     vi ~/.bashrc
아래 내용 추가
export SPARK_HOME=/home/ubuntu/spark
export PATH=$PATH:$SPARK_HOME/bin

Apache Zeppelin 설치

     바이너리 다운로드
     http://zeppelin.apache.org/download.html 에서 원하는 버전 선택해서 다운로드
     잘 모르겠으면 그냥 모든 인터프리터 다 포함되어 있는 버전 다운로드 zeppelin-0.7.3-bin-all.tgz
     2018.04.25 현재 0.7.3 이 최신 버전이며, Spark 2.2.0을 지원
     wget http://mirror.navercorp.com/apache/zeppelin/zeppelin-0.7.3/zeppelin-0.7.3-bin-all.tgz
     압축 해제
     tar zxvf zeppelin-0.7.3-bin-all.tgz
     소프트링크 생성
     ln -s zeppelin-0.7.3-bin-all zeppelin
     환경변수 등록
     vi ~/.bashrc
아래 내용 추가
export ZEPPELIN_HOME=/home/ubuntu/zeppelin
export PATH=$PATH:$ZEPPELIN_HOME/bin
     SPARK_HOME 설정
     zeppelin 설정 디렉터리로 이동
cd ZEPPELIN_HOME/conf
     템플릿 파일 복사
cp zeppelin-env.sh.template zeppelin-env.sh
     템플릿 수정
vi zeppelin-env.sh
     SPARK_HOME 설정
SPARK_HOME=/home/ubuntu/spark




예제


참고 자료

2017년 10월 23일 월요일

AWS EMR(Elastic MapReduce) 구성

참고 사이트


EMR(Elastic MapReduce) 란?

Amazon EMR은 AWS에서 Apache 하둡 및 Apache Spark와 같은 빅 데이터 프레임워크 실행을 간소화하는 관리형 클러스터 플랫폼입니다. 이러한 프레임워크와 함께 Apache Hive 및 Apache Pig와 같은 관련 오픈 소스 프로젝트를 사용하여 분석용 데이터와 비즈니스 인텔리전스 워크로드를 처리할 수 있습니다. 또한 Amazon EMR를 사용하여 Amazon Simple Storage Service(Amazon S3) 및 Amazon DynamoDB와 같은 기타 AWS 데이터 스토어 및 데이터베이스에서 많은 양의 데이터를 양방향으로 변환하고 이동할 수 있습니다.

하둡 클러스터를 구성해주는 상품!
EC2를 이용해서 클러스터 노드를 유동적으로 더하고 빼고 할 수 있다.

클러스터 생성


클러스터 생성 버튼을 누른다.

- 클러스터 이름원하는 이름
- 시작 모드 : 클러스터 (단계 실행은 아마도 시작 후 바로 job을 실행하도록 할 때 사용하는 것 같음)
- 릴리스 : 모르니깐 최신버전
- 애플리케이션 : Hadoop 이 외에 특별히 쓰고자 하는 것이 없으면 Core Hadoop
- 인스턴스 유형 : 현재 가장 저렴하게 사용할 수 있는 거는 m4.large (더 사양이 낮아도 될 것 같은데 지금 선택할 수 있는 옵션 중에서는 이게 가량 저렴한 것 같다.)
- 인스턴스 개수 : 2 (우선 테스트용으로 마스터 1대, 코어 1대)
나중에 제대로 돌리려면 replication을 생각한다면 5대 이상 생성해야 한다.
EMR에서 자동으로 코어 개수에 따라 replication을 지정하는데
1대~3대  : 1
4대~9대  : 2
10대 ~ : 3
- EC2 키 페어 : 사용할 키페어 지정
- 권한 : 기본값

클러스터 생성!

그러면 인스턴스 2개가 프로비저닝 중이라고 뜰거고, 그게 다 뜨면 마스터 퍼블릭 DNS를 확인하고 SSH 접속을 시도한다. 그런데 접속이 안된다......

클러스터 생성 후 SSH로 Master 노드에 접속하기

SSH 접속을 위해서는 보안 그룹 규칙을 추가해 줘야 한다.

"기본적으로 ElasticMapReduce-master 보안 그룹은 인바운드 SSH 액세스를 허용하지 않습니다. 따라서 액세스를 원하는 소스에서 SSH 액세스(TCP 포트 22)를 허용하는 인바운드 규칙을 추가해야 합니다. 보안 그룹 규칙 수정에 대한 자세한 내용은 Amazon EC2 User Guide for Linux Instances의 보안 그룹에 규칙 추가를 참조하십시오." 라고 한다.

MongDB 설치

Ubuntu 16.04 LTS 64bit에 MongoDB Community Server 3.4.9 설치

참고 사이트

바이너리 다운로드

Ubuntu 16.04 Linux 64-bit x64 를 다운 받는다.
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-3.4.9.tgz

압축 해제

tar zxvf mongodb-linux-x86_64-ubuntu1604-3.4.9.tgz
압축을 풀면 문서가 있고 bin 폴더가 덩그러니 있다.

환경 변수 설정

cd ~/
vi .bashrc

export MONGODB_HOME=
export PATH=$PATH:MONGODB_HOME

내용을 추가하고 source .bashrc 를 입력해 주면 환경변수가 적용된다.

실행하기

PATH를 지정해줬기 때문에 경로 입력 없이 바로 mongod 를 입력하면 바로 실행이 된다.
그런데 MongoDB는 기본적으로 /data/db 경로에 데이터를 저장하기 때문에 해당 위치에 디렉터리를 생성해 놓아야 한다.
데이터 저장 위치를 변경하길 원하면 실행시
mongod --dbpath <데이터 저장 경로> 를 입력해서 실행하면 된다.
빠져 나오려면 Ctrl + C

데이터 불러오기

식당 정보가 담겨 있는 샘플 데이터 다운로드를 다운로드한다.
wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

mongoimport를 이용해서 db에 한꺼번에 밀어 넣는다.
(mongod는 실행되어 있는 상태여야 한다.)
mongoimport --db newdb --collection restaurants --file primer-dataset.json

db에 직접 접속해서 제대로 들어 갔는지 확인한다.
{
        "_id" : ObjectId("569beb098106480d3ed99926"),
        "address" : {
                "building" : "1007",
                "coord" : [
                        -73.856077,
                        40.848447
                ],
                "street" : "Morris Park Ave",
                "zipcode" : "10462"
        },
        "borough" : "Bronx",
        "cuisine" : "Bakery",
        "grades" : [
                {
                        "date" : ISODate("2014-03-03T00:00:00Z"),
                        "grade" : "A",
                        "score" : 2
                },
...
        ],
        "name" : "Morris Park Bake Shop",
        "restaurant_id" : "30075445"
}