ch0nny_log

[빅데이터분석] Linux_7.스파크 설치 및 운영 본문

빅데이터 분석(with 아이티윌)/리눅스

[빅데이터분석] Linux_7.스파크 설치 및 운영

chonny 2024. 9. 26. 13:18

※ 스파크(Spark)  설치

스파크(spark) 란 ?  

 

hive 의 단점을 개선하기 위해서 나온게 스파크입니다.
hive 가 자바를 몰라도 하둡 분산 파일 시스템에 있는 데이터를 SQL로 조회할 수 있게 facebook 에서 만든 noSQL 입니다. 

 hive 의 단점이 disk 에서 데이터를 처리하기 때문에 속도가 너무 느립니다.
스파크는 메모리(memory) 에서 데이터를 처리해서 속도가 아주 빠릅니다. 
요즘 하드웨어 성능이 좋아지고 있고 메모리 가격도 예전에 비해서 저렴해져서  스파크(spark) 사용이 대중화가 되고 있습니다. 


■ 스파크(spark)의 특징 ?


 1. 메모리 기반의 데이터 처리로 속도가 아주 빠릅니다.
 2. 하둡의 hdfs 를 이용할 수도 있고 또는 단독으로 사용이 가능합니다. 
 3. 파이썬과 연동을 해서 다양한 파이썬 패키지를 사용할 수 있습니다.


■ 스파크 설치

 

■ 스파크 설치 총정리

 

1. oracle 의 홉디렉토리로 이동합니다.

(base) [oracle@centos ~]$ cd 

2. 설치 파일을 다운로드 받는다. 

(base) [oracle@centos ~]$ wget https://archive.apache.org/dist/spark/spark-2.0.2/spark-2.0.2-bin-hadoop2.7.tgz


3. 압축을 풉니다.

(base) [oracle@centos ~]$ tar xvzf spark-2.0.2-bin-hadoop2.7.tgz


4. 압축을 풀고 생긴 디렉토리의 이름을 spark 로 변경합니다.

(base) [oracle@centos ~]$ mv spark-2.0.2-bin-hadoop2.7  spark



5. .bash_profile 를 열어서 맨 아래에 아래의 export 문을 입력합니다.

(base) [oracle@centos ~]$ vi .bash_profile



export PATH=$PATH:/home/oracle/spark/bin:$PATH

 

 

-> 한줄 위 기입


6. .bash_profile 을 수행합니다.

(base) [oracle@centos ~]$ source .bash_profile



7. spark-shell 로 접속하여 테이블 생성을 하고 select 합니다. 

 

(base) [oracle@centos ~]$ spark-shell


Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel).
21/01/09 08:54:43 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
21/01/09 08:54:43 WARN Utils: Your hostname, localhost.localdomain resolves to a loopback address: 127.0.0.1; using 10.0.2.15 instead (on interface enp0s3)
21/01/09 08:54:43 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
21/01/09 08:54:45 WARN SparkContext: Use an existing SparkContext, some configuration may not take effect.
Spark context Web UI available at http://10.0.2.15:4040
Spark context available as 'sc' (master = local[*], app id = local-1610200485296).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.0.2
      /_/
         
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_262)
Type in expressions to have them eval‎‎uated.
Type :help for more information.

 

 


 

문제1. emp.csv 를 emp2.csv 로 copy 하시오 !
 $  cp  emp.csv  emp2.csv​
문제2. emp2.csv 의 맨위에 컬럼명들을 지우시오 !
 $ vi  emp2.csv​
문제3. emp2.csv 에서 kkkk 를 SALESMAN 으로 변경하시오 !
:%s/kkkk/SALESMAN/g​
문제4. 스파크에서 emp 테이블 생성 스크립트를 생성하시오 !

#1. hive 의 SQL을 스파크에서 사용할 수 있도록 설정합니다.

 HIVE 가 자바를 몰라도 하둡에 있는 빅데이터를 조회할 수 있게해주는 프로그램
 monogdb 는 SQL과 완전히 달랐지만 Hive 와 spark 는 SQL로 데이터를 검색할 수
 있습니다.  SQL --> JAVA 로 변경합니다. 
scala>  val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)​


#2. 스파크에서 emp 테이블을 생성합니다. 

scala>  sqlContext.sql("""drop  table  if  exists  emp""") 

scala> 

sqlContext.sql("""
  create  table  emp
  ( empno   int, 
    ename   string,
    job      string,
   mgr      int,
   hiredate   string,
   sal    int,
   comm   int,
   deptno   int )
  row  format    delimited
  fields   terminated  by  ','
  lines    terminated  by  '\n'
  stored   as  textfile   """ ) 

res5: org.apache.spark.sql.DataFrame = []  <--- 잘 되었다는 뜻입니다. 

scala> spark.sql("show tables").show()​

#3.  /home/oracle  밑에 있는 emp2.csv 를  스파크에 emp 테이블에 입력하시오 !

scala> sqlContext.sql(""" LOAD DATA LOCAL INPATH '/home/oracle/emp2.csv'
                                into   table  emp """)​

 

더블 쿼테이션 마크를 3개를 쓰게 되면 편하게 여러줄로 작성할 수 있습니다. 

res8: org.apache.spark.sql.DataFrame = []

문제5. 스파크에서 계속 에러만 나고 아무리 제대로 명령어를 써도 자꾸 에러가 난다면?
#1. 스파크를 종료합니다.

ctl키 + d

#2. jps 명령어를 리눅스 운영체제에서 수행합니다. 

3596 Jps
11243 SecondaryNameNode
10910 NameNode
11338 JobTracker
32617 SparkSubmit  <-------------  이걸 죽여야합니다.
11069 DataNode
11498 TaskTracker

#3. 프로세서 번호로 죽입니다. 

$ kill  -9  32617

#4. 스파크에 접속합니다. 

$ spark-shell

#5. 테이블 목록을 확인합니다. 

scala> spark.sql("show tables").show()​
문제6. emp 테이블을 조회합니다. 
scala> sql(""" select  *
                     from  emp """).show()​
문제7. 직업이 SALESMAN 인 사원들의 이름과 월급과 직업을 출력하시오 !
scala> sql(""" select  ename, sal, job
                    from  emp
                    where  job='SALESMAN' """).show()​
문제8. dept.csv 를 이용해서 스파크에서 dept 테이블을 생성하시오 !
sql(""" create  table  dept
         ( deptno    int,
           dname    string,
           loc         string ) 
        row  format  delimited
        fields   terminated  by  ','
        lines    terminated  by  '\n'
        stored  as  textfile """);

sql("""LOAD DATA LOCAL INPATH '/home/oracle/dept.csv'  into table dept""");

sql(""" select * from dept """).show()​
문제9. 직업, 직업별 토탈월급을 출력하시오 !
scala> sql(""" select job, sum(sal)
                from  emp
                group by job """).show()​
문제10. 위의 결과를 csv 파일로 생성하시오 !
scala>  val  df = spark.sql("""
                                    select  job, sum(sal)  as  total_sal
                                     from  emp 
                                     group  by  job 
                                   """)

scala> df.coalesce(1).write.option("header", "true").csv("/home/oracle/emp_job_result2.csv")​
문제11. 하이브는 서브쿼리를 지원하지 않는데 스프크는 서브쿼리를 지원하는지 다음의 문제를 풀어보시오. 사원 테이블에서 월급의 순위가 2등인 사원의 이름과 월급과 순위를 출력하시오.
sql(""" select *
          from  ( select  ename, sal, rank()  over ( order  by sal  desc ) as rnk
                   from   emp  )
          where  rnk = 2
        """).show()​

설명:  from 절의 서브쿼리가 사용가능 합니다. 

 

문제12. (오라클과 스파크의 차이점1) 이름과 커미션을 출력하는데 커미션이 null 인 사원들은 0 으로 출력하시오 !
Oracle>  select  ename, nvl(comm,0)
              from  emp;​
              
              
Spark> sql(""" select  ename, coalesce( comm, 0 ) 
                    from  emp """).show()
문제13. (오라클과 Spark의 차이점2) 1981 년도에 입사한 사원들의 이름과 입사일을 출력하시오!
Oracle>  select  ename, hiredate
               from  emp
                where  to_char(hiredate,'RRRR') = '1981';

Spark>  sql("""select  ename, hiredate
                      from   emp
                      where  date_format(hiredate,'yyyy')='1981'  """).show()​
문제14. (오라클과 Spark의 차이점2) emp 테이블의 SCOTT 의 월급을 0 로 변경하시오!
scala>sql(""" update  emp
                    set sal = 0
                   where  ename='SCOTT'  """).show()​

설명: 스파크는 update 를 할 수 없습니다.  delete, insert 전부 안됩니다. 
       몽고디비는 가능합니다.

문제15. (오라클과 스파크의 차이점) emp 와 dept 를 조인해서 이름과 부서위치를 출력하시오 !
scala>  sql(""" select e.ename, d.loc
                from  emp  e  join  dept d
                on ( e.deptno = d.deptno) """).show()​
문제16. (오라클과 스파크의 차이점) 부서위치, 부서위치별 토탈월급을 출력하시오! 
Oracle> select  loc, sum(sal)
            from  dept
            group   by  rollup(loc);

Spark>  sql("""  select  loc, sum(sal)  as  sumsal
                       from   dept
                       group  by  loc   with  rollup
                       order  by  isnull(loc) asc """).show()​
문제17. ( 오라클과 스파크의 차이점) 직업, 직업별 토탈월급을 출력하는데 맨 아래에 전체 토탈월급이 출력되게 하시오 !
Oracle> select  job, sum(sal)
            from  emp
            group   by  rollup(job);

Spark>  sql("""  select  job, sum(sal)  as  sumsal
                       from   emp
                       group  by  job   with  rollup
                       order  by  isnull(job) asc """).show()​
문제18. 아래의 오라클 SQL을 Spark 로 구현하시오 !
Oracle>  select   deptno, sum(sal)
             from  emp
             group  by  cube(deptno);

Spark> sql(""" select  deptno, sum(sal)  as  sumsal
                     from  emp
                     group  by  deptno with  rollup 
                     order by  isnull(deptno)  desc""").show()
문제19. 아래의 오라클 SQL을 Spark 로 구현하시오 !
Oracle> select  deptno, job,  sum(sal)  as  sumsal
              from  emp
              group   by   grouping  sets( deptno, job , () );

Spark>  sql(""" select  deptno, job, sum(sal) as  sumsal
                     from  emp
                     group  by  deptno, job  grouping  sets( deptno, job, () )
                     order by deptno, job """).show()​
문제 20 아래의 오라클 SQL을 Spark 로 구현하시오 !
Oracle>  select  deptno, sum(sal)
              from  emp
              group  by  grouping  sets(  deptno, ()  );

Spark>  sql(""" select  deptno, sum(sal) as  sumsal
                     from  emp
                     group  by  deptno grouping  sets( deptno, () )
                     order by  isnull(deptno) asc """).show()​

 

 

 

1. 리눅스를 정상적으로 종료합니다.

vm 박스 터미널 (root 에서)

$ su -

# init  0

 

2. 오라클 vm 박스에서 가상환경 centos의 설정을 누르고 네트워크를 설정함

설명:   nat 네트워크 : 인터넷을 하기 위한 네트워크 /  호스트 전용 어뎁터 :  윈도우에서 vm 리눅스에 접속하기 위한 네트워크 

 

3. 네트워크1, 네트워크 2가있는데 네트워크1은 체크가 되어 있는데 네트워크 2가 활성화가 안되어 있음

 

    1) 네트워크2활성화 시킴

    2) 호스트 전용 어댑터로 둠(나만 접속가능)

    3) 어댑터1 ->고급->포트포워딩 비우기

 

 

4. 루트로 다시실행

 

 

 

putty로 접속해 위 아이피 접속