1. 도입(Introduction)

대용량 데이터를 분석하기 위해 각자 로컬환경에 하둡(Hadoop) 클러스터를 구성하고 여기에 스파크(Spark)를 활용하여 대용량 로그 데이터 등을 분석하는데 활용하기도 하였습니다. 때로는 실제 분석에 걸리는 시간보다 하둡 환경을 구축하는데 걸리는 시간과 스파크 분석 환경을 마련하는 데에 시간을 더 많이 걸리기도 하였죠. 하지만, 지금은 IBM Cloud 환경에서 손쉽게 분석 환경을 구축할 수 있고, 구축된 분석 환경과 스크립트는 원하는 시간 동안 원하는 만큼 실행되게 할 수 있으며, 무엇보다도 본인의 노트북이나 컴퓨터를 켜둘 필요없이 사용이 가능한 장점이 있습니다. 다만, 클라우드 환경에서의 데이터 분석시 ‘파일’을 다루는 방법이 기존의 사용자 PC에서와 조금 다르므로 이 부분을 중심으로 설명하도록 하겠습니다.

2. Notebook 실습환경 만들기

Python은 스크립트 언어로서 코드를 작성하는 데 들이는 시간이 다른 언어에 비해 상대적으로 적다는 측면에서 R과 더불어 많이 사용되고 있습니다. 본 포스팅에서는 IBM Cloud 환경에서 DSX Spark를 사용하기 위해 Jupyter Notebook에서 분석을 진행하고자 합니다.

(1) IBM 데이터 사이언스(DSX)에 접속해 로그인을 합니다.

(2) [Get start] – [New Project] – [Add to Project] – [Notebook]을 차례로 선택합니다. 아래의 화면에서 자신이 원하는 개발 환경을 선택합니다.

(3) 익숙한 Notebook 인터페이스를 볼 수 있습니다.

이 곳에 파이썬 코드를 작성하면 기존의 Jupyter Notebook에서 사용하던 대로 사용할 수 있어 편리합니다.

또한 Jupyter Notebook에서 썼던 대부분의 단축키도 사용할 수 있습니다.


[그림 1] IBM DSX Spark 아키텍처

지금까지의 과정을 거쳐 만들어진 Notebook의 IBM DSX Spark 아키텍처는 [그림 1]과 같습니다[1]. [그림 1] 처럼 추후에 자연어처리가 필요하다면 Watson API를 활용해서 NLU 등을 호출하는 것도 가능합니다. 파일을 IBM Cloud 환경에 업로드 하고 업로드한 파일을 Jupyter Notebook에서 불러오고 이 과정에서 Pandas나 Spark Session 등으로 불러올 수 있습니다.

3. 파일 업로드/다운로드

(1) 파일 업로드
기존 Jupyter Notebook의 경우 파일을 처리하기 위해 일반적으로 파일 경로를 직접 지정하는 경우가 대부분이었습니다. 하지만, DSX 상에서 파일을 다루려면 IBM Cloud에 파일을 업로드 해야 합니다. 아래의 스크린 샷에 나타난 [Data] 아이콘을 클릭합니다.

해당 위치에 파일을 직접 마우스로 올리거나 [browse] 버튼을 클릭합니다. 파일이 올라간 것이 확인되면 다음 단계로 이동합니다.

(2) 업로드한 파일을 Notebook에서 불러오기

업로드한 파일에 [Insert to code] 버튼을 누르면 csv파일인 경우 아래와 같은 메뉴가 나옵니다. 여기에서 [SparkSession Dataframe]을 선택합니다.

아래와 같은 코드가 삽입됩니다.

 
import ibmos2spark

# @hidden_cell
credentials = {
    'auth_url': 'https://identity.open.softlayer.com',
    'project_id': '********************************',
    'region': 'dallas',
    'user_id': '***************************',
    'username': 'member_****************************************',
    'password': '**********'
}

configuration_name = 'os_********************_configs'
bmos = ibmos2spark.bluemix(sc, credentials, configuration_name)

from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df_data_1 = spark.read\
  .format('org.apache.spark.sql.execution.datasources.csv.CSVFileFormat')\
  .option('header', 'true')\
  .load(bmos.url('DefaultProjectyunhomaengkribmcom', 'testdata_devloperworks.csv'))
df_data_1.take(5)

[Pandas Dataframe]도 마찬가지 입니다.

 
from io import StringIO
import requests
import json
import pandas as pd

# @hidden_cell
# This function accesses a file in your Object Storage. The definition contains your credentials.
# You might want to remove those credentials before you share your notebook.
def get_object_storage_file_with_credentials_****************************************(container, filename):
    """This functions returns a StringIO object containing
    the file content from Bluemix Object Storage."""

    url1 = ''.join(['https://identity.open.softlayer.com', '/v3/auth/tokens'])
    data = {'auth': {'identity': {'methods': ['password'],
            'password': {'user': {'name': 'member_****************************************','domain': {'id': '****************************************'},
            'password': '***************'}}}}}
    headers1 = {'Content-Type': 'application/json'}
    resp1 = requests.post(url=url1, data=json.dumps(data), headers=headers1)
    resp1_body = resp1.json()
    for e1 in resp1_body['token']['catalog']:
        if(e1['type']=='object-store'):
            for e2 in e1['endpoints']:
                        if(e2['interface']=='public'and e2['region']=='dallas'):
                            url2 = ''.join([e2['url'],'/', container, '/', filename])
    s_subject_token = resp1.headers['x-subject-token']
    headers2 = {'X-Auth-Token': s_subject_token, 'accept': 'application/json'}
    resp2 = requests.get(url=url2, headers=headers2)
    return StringIO(resp2.text)

df_data_2 = pd.read_csv(get_object_storage_file_with_credentials_****************************************('DefaultProject***************', 'testdata_devloperworks.csv'))
df_data_2.head()

(3) 파일 읽기

[SparkSession Dataframe]의 경우 위의 코드가 제대로 실행되면 아래와 같은 화면이 출력됩니다.

[Pandas Dataframe]의 경우 위의 코드가 제대로 실행되면 아래와 같은 화면이 출력됩니다.

(4) 파일 다운로드 하기

IBM DSX를 활용하면서 가장 어려움을 겪는 부분이 분석을 끝낸 파일을 다운 받는 부분입니다. Notebook에 외부 스크립트를 호출해서 다운로드 버튼을 만들어보기도 하고, Pixiedust로 그래프를 그리고 Export 기능을 활용을 해보기도 하지만, csv파일 용량이 커지거나 한글이 들어가면 제대로 다운되지 않습니다.

from pixiedust.display import *
display(dataframe.to_string())

때문에 CURL command를 사용해야 합니다. CURL command를 사용하기 위해서는 두 가지 정보가 필요합니다. 첫 번째로는 Credential 정보 두 번째로는 파일이 저장된 경로. 이를 알아내기 위해 아래와 같이 코드를 실행합니다.

# Check the file path
path = ! pwd
print (path[0])
path2 = path[0].replace("notebook/work", "")
print (path2) 
full_path1 = path2 + "data/"+ filename1

# save dataframe on ibm cloud
dataframe.to_csv(full_path1, encoding='utf-8')

위의 코드는 현재 IBM Cloud상의 파일 경로를 확인하고, 외부 다운로드가 가능한 경로로 csv파일을 저장하고 있습니다.

!ls -l /gpfs/fs01/user/s63b-*************-*************/data

이전 단계에서 저장한 파일들이 제대로 위치하고 있는지 조회합니다.

Credential 정보를 불러오기 위해 IBM Cloud 사이트로 이동합니다.

사이트에서 DSX가 사용하고 있는 spark의 credential 정보를 확인합니다. 확인한 Credential 정보에서 tenant_id, tenant_secret, instance_id를 확인하고 아래의 curl command를 작성합니다.

curl -O -X GET -u ****-tenant_id-**********: tenant_secret-****-****-****-*********** -H 'X-Spark-service-instance-id: instance_id-****-****-****-**********' https://spark.bluemix.net/tenant/data/dataframe.csv

이제 사용자 PC에서 CURL 커맨드를 실행합니다. 아래와 같이 분석한 결과물을 사용자 PC로 다운로드 받을 수 있습니다.

(5) Object Storage만 사용한 경우

Object Storage만 사용하는 경우, 아래와 같이 IBM Cloud Console에서 간편하게 [Select Action] – [File Download]로 원하는 파일을 사용자 PC로 다운로드 할 수 있습니다.

4. 맺음말

대용량 데이터를 다루거나, 주기적으로 실행되어야 하는 크롤링 스크립트 등 IBM Cloud의 DSX를 활용하면 보다 쉽게 분석을 할 수 있습니다. 때로는 더 많은 컴퓨팅 파워와 스토리지를 필요할 수도 있죠. 이러한 상황에서 IBM Cloud는 상위 티어의 컴퓨팅파워와 스토리지 선택을 할 수 있어 한 번의 코딩으로 확장 가능한 분석 환경을 구성할 수 있습니다.

Reference

[1] Watson 텍스트 분류 확장하기, https://developer.ibm.com/kr/journey/extend-watson-text-classification/

작성자: 맹윤호

토론 참가

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.