반응형

spark-driver version 과 python verson 맞추기 

 

환경

- Mac2

- Mac2에 자동으로 설치 되어 있는 python3 와 version 3.12.*

 

방법

현재 python3 -V 하면 3.9가 나오며, 현재 brew python 설치는 3.12로 되어 있는 상태에서 spark-driver worker version 은 3.12 가 나오는 상태입니다.

만약 spark-driver worker version 이 brew list 에 있으면 해당 위치를 .zshrc 또는 .bash_profile 에 설정을 해주면 됩니다.

예를 들어 python3 에 3.12이면 아래와 같이 넣어주면 됩니다.

#Python
alias python="python3"
alias python3="/opt/homebrew/bin/python3.12"

해당 항목을 저장후 source 를 통해 쉘에 적용 후 python3 -V 하면 원하는 version 이 나올겁니다.

 

만약 spark-driver worker version 이 brew list 에 없으면 brew install python@3. 뒤에 원하는 버젼을 입력하여 설치 합니다.

설치 후 위와 같이 항목을 적용 합니다.

 

 

jupyter 로 pyspark 열 때 맞추는 방법

아래 부분 보고 맞추시면 됩니다.

#Python
alias python="python3"
alias python3="/opt/homebrew/bin/python3.12"

#Spark
export SPARK_HOME=~/Spark/spark
export PYSPARK_PYTHON=/opt/homebrew/bin/python3.12
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'
export SPARK_LOCAL_IP=127.0.0.1
alias sparknb='$SPARK_HOME/bin/pyspark'

여기서 주의할건 PYSPARK_PYTHON 에 python3 를 입력하면 적용이 되지 않아 직접 dir 를 입력했습니다.

그리고 PYSPARK_DRIVER_PYTHON 은 jupyter 이여야 합니다.

반응형
반응형

**빅공잼님 덕분에 빅데이터 분석 환경 구축을 해볼 수 있었습니다. 감사합니다.**

 

5강. Zookeeper 설치 및 환경 설정

  1. 설치합니다.
  2. $ cd /install_dir $ sudo wget <https://dlcdn.apache.org/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz> $ sudo tar -xzvf apache-zookeeper-3.8.3-bin.tar.gz -C /usr/local/zookeeper $ sudo vi /etc/environment # 아래 내용 추가 후 저장 ZOOKEEPER_HOME="/usr/local/zookeeper" # 시스템 환경변수 활성화 $ source /etc/environment $ sudo echo 'export ZOOKEEPER_HOME=/usr/local/zookeeper' >> ~/.bashrc $ source ~/.bashrc
  3. zookeeper 환경 설정 파일을 설정해줍니다.
  4. $ cd $ZOOKEEPER_HOME $ sudo cp ./conf/zoo_sample.cfg ./conf/zoo.cfg $ sudo vi ./conf/zoo.cfg #기존에 존재하는 dataDir 은 주석 처리합니다. dataDir=/usr/local/zookeeper/data dataLogDir=/usr/local/zookeeper/logs #clientPort 아래에 추가해주고 저장합니다. maxClientCnsns=0 maxSessionTimeout=180000 server.1=nn1:2888:3888 server.2=nn2:2888:3888 server.3=dn1:2888:3888 #터미널에서 입력해줍니다. $ sudo mkdir -p /usr/local/zookeeper/data $ sudo mkdir -p /usr/local/zookeeper/logs $ sudo chown -R $USER:$USER /usr/local/zookeeper $ sudo vi /usr/local/zookeeper/data/myid
  5. Cluster 구성 후 Node 끼리 ssh 비밀번호 없이 연결할 수 있도록 설정합니다.
  6. #터미널에서 입력합니다. $ ssh-keygen -t rsa $ cat >> ~/.ssh/authorized_keys < ~/.ssh/id_rsa.pub $ ssh localhost
반응형
반응형

**빅공잼님 덕분에 빅데이터 분석 환경 구축을 해볼 수 있었습니다. 감사합니다.**

 

4강. Spark 설치 및 환경설정

  1. Apache Spark 3.3.3 설치 및 압축 해제를 해줍니다.
  2. $ sudo wget <https://dlcdn.apache.org/spark/spark-3.4.2/spark-3.4.2-bin-hadoop3.tgz> $ sudo tar -xzvf spark-3.4.2-bin-hadoop3.tgz -C /usr/local $ sudo mv /usr/local/spark-3.4.2-bin-hadoop3 /usr/local/spark
  3. Python3 설치 및 파이썬 라이브러리 설치 해줍니다.
  4. #Python 설치 $ sudo apt-get install -y python3-pip #Python 버전 확인 #2024.01.25 기분 Python 3.8.10 $ python3 -V #PySpark 설치 $ sudo pip3 install pyspark findspark
  5. Spark 환경 변수 설정을 해줍니다.
  6. # Hadoop 시스템 환경변수 설정 sudo vim /etc/environment # 아래 내용 추가 후 저장 PATH 뒤에 ":/usr/local/spark/bin" 추가 PATH 뒤에 ":/usr/local/spark/sbin" 추가 SPARK_HOME="/usr/local/spark" # 시스템 환경변수 활성화 $ source /etc/environment # Spark 사용자 환경변수 설정 $ echo 'export SPARK_HOME=/usr/local/spark' >> ~/.bashrc # 사용자 환경변수 활성화 $ source ~/.bashrc
  7. spark-env.sh 파일을 편집해줍니다.
  8. #터미널에서 입력해줍니다. $ cd $SPARK_HOME/conf $ ls $ sudo cp spark-env.sh.template spark-env.sh $ sudo vi spark-env.sh #맨 아래로 이동합니다. export SPARK_HOME=/usr/local/spark export SPARK_CONF_DIR=/usr/local/spark/conf export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop export SPARK_MASTER_WEBUI_PORT=18080
  9. spark-defaults.conf 파일을 편집해줍니다.
  10. #터미널에서 입력해줍니다. $ sudo cp spark-defaults.conf.template spark-defaults.conf $ sudo vi spark-defaults.conf #맨 아래로 이동합니다. spark.master yarn spark.eventLog.enabled true spark.eventLog.dir /usr/local/spark/logs #저장 후 나옵니다 #터미널에서 입력해줍니다. $ sudo mkdir -p /usr/local/spark/logs $ sudo chown -R $USER:$USER /usr/local/spark/ $ cd /usr/local/spark $ ls -al
  11. workers.template 파일을 편집해줍니다.
  12. #터미널에서 입력해줍니다. $ cd /usr/local/spark/conf $ sudo cp workers.template workers $ vi workers #맨 아래로 이동해줍니다. #localhost 는 주석 처리해줍니다. #아래 내용을 추가해줍니다. dn1 dn2 dn3
  13. 파이썬 환경 설정을 추가해줍니다
  14. $ sudo vi /etc/environment # 아래 내용 추가 후 저장 PATH 뒤에 ":/usr/bin/python3" 추가 # 시스템 환경변수 활성화 $ source /etc/environment $ sudo echo 'export PYTHONPATH=/usr/bin/python3' >> ~/.bashrc $ sudo echo 'export PYSPARK_PYTHON=/usr/bin/python3' >> ~/.bashrc $ source ~/.bashrc
반응형
반응형

**빅공잼님 덕분에 빅데이터 분석 환경 구축을 해볼 수 있었습니다. 감사합니다.**

 

3강. Hadoop 설치 및 환경설정

  1. Hadoop 설치 해줍니다.
  2. > sudo wget <https://dlcdn.apache.org/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz> > sudo tar -zxvf hadoop-3.2.4.tar.gz -C /usr/local > sudo mv /usr/local/hadoop-3.2.4 /usr/local/hadoop
  3. /etc/environment 에설정을 추가해줍니다.
  4. PATH="~~~:/usr/local/hadoop/bin:/usr/local/hadoop/sbin" HADOOP_HOME="/usr/local/hadoop"
  5. 추가 설정을 해줍니다.
  6. //Ubuntu > sudo echo export 'HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc > sudo echo export 'HADOOP_COMMON_HOME=$HADOOP_HOME' >> ~/.bashrc > sudo echo export 'HADOOP_HDFS_HOME=$HADOOP_HOME' >> ~/.bashrc > sudo echo export 'HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc > sudo echo export 'YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc > sudo echo export 'HADOOP_YARN_HOME=$HADOOP_HOME' >> ~/.bashrc > sudo echo export 'HADOOP_MAPRED_HOME=$HADOOP_HOME' >> ~/.bashrc
  7. hdfs-site.xml 파일을 편집 해줍니다.
    • HDFS에서 사용할 환경 정보를 설정하는 파일입니다. hdfs-site.xml 에 설정 값이 없을 경우 hdfs-default.xml 을 기본으로 사용합니다.
    • 경로는 아래와 같습니다.
    • $HADOOP_HOME/etc/hadoop/hdfs-site.xml
    <configuration>
        <!-- configuration hadoop -->
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>
        <property>
            <name>dfs.namenode.name.dir</name>
            <value>/usr/local/hadoop/data/nameNode</value>
        </property>
        <property>
            <name>dfs.datanode.data.dir</name>
            <value>/usr/local/hadoop/data/dataNode</value>
        </property>
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/usr/local/hadoop/data/dfs/journalnode</value>
        </property>
        <property>
            <name>dfs.nameservices</name>
            <value>my-hadoop-cluster</value>
        </property>
        <property>
            <name>dfs.ha.namenodes.my-hadoop-cluster</name>
            <value>namenode1,namenode2</value>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode1</name>
            <value>nn1:8020</value>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode2</name>
            <value>nn2:8020</value>
        </property>
        <property>
            <name>dfs.namenode.http-address.my-hadoop-cluster.namenode1</name>
            <value>nn1:50070</value>
        </property>
        <property>
            <name>dfs.namenode.http-address.my-hadoop-cluster.namenode2</name>
            <value>nn2:50070</value>
        </property>
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster</value>
        </property>
        <property>
            <name>dfs.client.failover.proxy.provider.my-hadoop-cluster</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
            <name>dfs.ha.fencing.methods</name>
            <value>shell(/bin/true)</value>
        </property>
        <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/home/ubuntu/.ssh/id_rsa</value>
        </property>
        <property> 
            <name>dfs.ha.automatic-failover.enabled</name>
            <value>true</value>
        </property>
        <property>
            <name>dfs.name.dir</name>
            <value>/usr/local/hadoop/data/name</value>
        </property>
        <property>
            <name>dfs.data.dir</name>
            <value>/usr/local/hadoop/data/data</value>
        </property>
    </configuration>
    
    <configuration>
    	<property>
    		<name>fs.default.name</name>
    		<value>hdfs://nn1:9000</value>
    	</property>
    	<property>
    		<name>fs.defaultFS</name>
    		<value>hdfs://my-hadoop-cluster</value>
    	</property>
    	<property>
    		<name>ha.zookeeper.quorum</name>
    		<value>nn1:2181,nn2:2181,dn1:2181</value>
    	</property>
    </configuration>
    
    
    • hdfs-site.xml 속성
      • dfs.replication : HDFS 파일 블록 복제 개수 지정합니다.
      • dfs.namenode.name.dir : NameNode에서 관리할 데이터 디렉토리 경로 지정합니다.
        • namenode: Hadoop HDFS 의 Master daemon 입니다.
      • dfs.datanode.data.dir : DataNode에서 관리할 데이터 디렉토리 경로 지정합니다.
      • dfs.journalnode.edits.dir : JournalNode는 NameNode의 동기화 상태를 유지한다. 특정 시점에 구성된 fsimage snapshot 이후로 발생된 변경 사항을 editlog라 하며, 해당 데이터의 저장 위치를 설정합니다.
      • dfs.nameservices : Hadoop 클러스터의 네임서비스 이름을 지정합니다.
      • dfs.ha.namenodes.my-hadoop-cluster : Hadoop 클러스터 네임서비스의 NameNode 이름을 지정합니다.( “,”콤마로 구분하여 기재한다.)
      • dfs.namenode.rpc-address.my-hadoop-cluster.namenode1 : 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정합니다.(여기서는 8020포트 사용)
      • dfs.namenode.rpc-address.my-hadoop-cluster.namenode2 : 클러스터 네임서비스에 포함되는 NameNode 끼리 RPC 통신을 위해 NameNode의 통신 주소를 지정합니다.(여기서는 8020포트 사용)
      • dfs.namenode.http-address.my-hadoop-cluster.namenode1 : NameNode1(nn1)의 WEB UI 접속 주소를 지정합니다.(여기서는 50070포트 사용)
      • dfs.namenode.http-address.my-hadoop-cluster.namenode2 : NameNode2(nn2)의 WEB UI 접속 주소를 지정합니다.(여기서는 50070포트 사용)
      • dfs.namenode.shared.edits.dir : NameNoderk editlog를 쓰고/읽을 JournalNode URL 입니다. Zookeeper가 설치된 서버와 동일하게 JournalNode를 설정하면 됩니다. (예 : qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster)
      • dfs.client.failover.proxy.provider.my-hadoop-cluster : HDFS 클라이언트가 Active NameNode에 접근할 때 사용하는 Java class 를 지정합니다.
      • dfs.ha.fencing.methods : Favilover 상황에서 기존 Active NameNode를 차단할 때 사용하는 방법을 기재합니다. (예 : sshfence 그러나 여기서는 shell(/bin/true)를 이용합니다.)
      • dfs.ha.fencing.ssh.private-key-files : ha.fencing.method를 sshfence로 지정하였을 경우, ssh를 경유하여 기존 Active NameNode를 죽이는데. 이 때, passpharase를 통과하기 위해 SSH Private Key File을 지정해야합니다.
      • dfs.ha.automatic-failover.enabled : 장애 복구를 자동으로 할 지에 대한 여부를 지정합니다.
  8. core-site.xml 파일을 편집합니다.
    • Hadoop 시스템 설정 파일이다. 네트워크 튜닝, I/O 튜닝, 파일 시스템 튜닝, 압축 설정 등 Hadoop 시스템 설정을 할 수 있습니다. HDFS와 MapReduce에서 공통적으로 사용할 환경 정보를 입력할 수 있습니다. core-site.xml 설정 값이 없으면, core-default.xml 을 기본으로 사용합니다.
    <configuration>
    	<property>
    		<name>fs.default.name</name>
    		<value>hdfs://nn1:9000</value>
    	</property>
    	<property>
    		<name>fs.defaultFS</name>
    		<value>hdfs://my-hadoop-cluster</value>
    	</property>
    	<property>
    		<name>ha.zookeeper.quorum</name>
    		<value>nn1:2181,nn2:2181,dn1:2181</value>
    	</property>
    </configuration>
    
    • fs.default.name : HDFS의 기본 통신 주소를 지정합니다.
    • fs.defaultFS : HDFS 기본 파일시스템 디렉토리를 지정합니다.
    • ha.zookeeper.quorum : Zookeeper가 설치되어 동작할 서버의 주소를 기재합니다.(여기서 포트는 2181)
  9. yarn-site.xml 파일을 편집합니다.
  10. <configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.hostname</name> <value>nn1</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> </configuration>
  11. mapred-site.xml 파일을 편집합니다.
  12. <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> </configuration>
  13. hadoop-env.sh 파일을 편집합니다.
  14. export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export HADOOP_HOME=/usr/local/hadoop
  15. Hadoop workers 편집을 해줍니다.
  16. # Hadoop workers 편집 $ sudo vim $HADOOP_HOME/etc/hadoop/workers # 아래 내용 수정 후 저장 # localhost << 주석 처리 또는 제거 dn1 dn2 dn3
  17. Hadoop masters 편집을 해줍니다.
  18. # Hadoop masters 편집 sudo vim $HADOOP_HOME/etc/hadoop/masters # 아래 내용 수정 후 저장 nn1 nn2
반응형
반응형

**빅공잼님 덕분에 빅데이터 분석 환경 구축을 해볼 수 있었습니다. 감사합니다.**

 

2강. Java 설치 및 환경설정

  1. Ubuntu 20.04 apt-get update, upgrade, dist-upgrade 를 통해서 최신 version 으로 설치합니다.
  2. 프로젝트 진행 중에 필요한 라이브러리를 설치 합니다.
  3. > sudo apt-get install -y vim wget ssh openssh-* net-tools
  4. Java 를 설치해줍니다.
  5. > sudo apt-get install -y openjdk-8-jdk
  6. 현재 java 설치 위치를 확인합니다.
  7. > sudo find / -name java-8-openjdk-amd64 2>/dev/null -> /usr/share/gdb/auto-load/usr/lib/jvm/java-8-openjdk-amd64 -> /usr/lib/jvm/java-8-openjdk-amd64
  8. 횐경변수를 설정해줍니다.
    1. sudo vim /etc/environment
    2. PATH="~~~~~:/usr/lib/jvm/java-8-openjdk-amd64/bin" JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"
    3. source /etc/environment
  9. sudo echo export ‘JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64’ >> ~/.bashrc복사 붙여넣기 하게 되면 ‘ 값이 잘못 들어갈 수 있어 한 번 더 확인해봐야합니다.
  10. **Troubleshooting
  11. env | grep JAVA 를 통해서 JAVA_HOME 이 export 되고 있는지 확인할 수 있습니다.
반응형
반응형

**빅공잼님 덕분에 빅데이터 분석 환경 구축을 해볼 수 있었습니다. 감사합니다.**

 

1강. AWS EC2 인스턴스 배포

  1. Ubuntu Server 20.04 LTS 64 bit 와 비슷하게 인스턴스를 생성해줍니다.
  2. *현재 AWS 가 아닌 GCP 환경에서 VM 을 생성했습니다.
  3. ssh-keygen 으로 ssh 키를 생성합니다.
    1. $ ssh-keygen -t rsa -f ~/.ssh/[KEY_FILENAME] -C [USERNAME]
      • t [타입명] : key 생성 type을 선택하는 옵션입니다.
      • f [파일명] : 생성할 key 파일의 이름을 설정하는 옵션입니다.
      • C [내용] : 사용자에 대한 주석을 입력합니다.
      • b [숫자] : type의 bytes를 설정합니다. rsa 암호화 방식은 기본 값이 2048이며, 4096으로 더 안전한 키를 생성할 수도 있습니다.
    2. ssh 키가 public(.pub) 과 private 이 생성됩니다.
  4. 생성된 키를 GCP 콘솔 서버에 등록합니다.
    1. Compute Engine 에서 ‘VM 인스턴스’ 있는 사이드 바에 메타데이터가 존재합니다. 메타데이터에 들어간 후, SSH 키 태그를 누릅니다.
    2. 추가를 합니다.
  5. ~/.ssh 폴더에 config 파일을 만들어 ssh 연결 설정을 해줍니다.
    1. 코드**Troubleshooting
    2. VM 인스턴스를 정지 후 새로 시작하면 외부 IP 주소가 바뀌기 때문에 재실행 시 config 설정 값도 수정해줘야 합니다.
    3. Host nn1 HostName 10.10.171.101 User jay IdentityFile ~/.ssh/rsa_big_data
    4. ssh nn1 을 터미널에 입력해주면 Host nn1 설정을 읽고 실행해줍니다.
반응형
반응형

**빅공잼님 덕분에 빅데이터 분석 환경 구축을 해볼 수 있었습니다. 감사합니다.**

 

0강. 개요

  • 고가용성 Hadoop 클러스터 환경 구축합니다.
  • 총 5개의(nn1, nn2, dn1, dn2, dn3) vm 이 필요합니다.
반응형
반응형

스키마 정의 장점 및 방법

스키마 정의 장점

  1. 스파크가 데이터 타입을 추측해야 하는 책임을 덜어줍니다.
  2. 스파크가 스키마를 확정하기 위해 파일의 많은 부분을 읽어 들이려고 별도의 잡을 만드는 것을 방지합니다.
  3. 데이터가 스키마와 맞지 않는 경우, 조기에 문제를 발견할 수 있습니다.

 

스키마 정의 방법

스키마를 정의하는 2 가지 방법이 있습니다.

1. 프로그래밍 스타일로 정의합니다.

import org.apache.spark.sql.types._ 
val schema = StructType(Array(StructField("author", StringType, false), 
	StructField("title", StringType, false), 
	StructField("pages", StringType, false), 
))

 

2. DDL(data definition language) 을 사용합니다.

val schema = "author STRING, title STRING, pages INT"

 

 

사용 방법

val schema = ~~ 
val data = ~~ 
if __main__ == "__main__": 
	spark = (SparkSession.builder.appName("appName").getOrCreate()) 
    blogs_df = spark.createDataFrame(data, schema) 
    blogs_df.show() 
    print(blogs_df.printSchema())

 

반응형

+ Recent posts