빅데이타 언어 U-SQL과 C#

[제목] 빅데이타 언어 U-SQL과 C#

마이크로소프트는 내부적으로만 사용하고 있는 빅데이타 시스템을 갖고 있는데, 이를 Cosmos라 부른다. Cosmos는 예전 MSN 에서부터 개발되어 현재 Bing 그룹이 사용하고 있다. Bing이 사용하는 자동화된 서버 Provisioning 시스템이 Azure를 통해 상용화 되었듯이, 분산 데이타 처리를 위해 설계된 Cosmos의 빅데이타 시스템도 Azure Data Lake 서비스로 상용화 되고 있는 것 같다.

Bing은 Cosmos를 활용하여 엄청난 량의 데이타를 관리, 분석하고 있는데, 이러한 대용량 데이타에서 유용한 정보를 얻어내는 빅데이타 분석 언어로 MS Research에서 개발된 SCOPE 라는 언어를 사용하고 있다. SCOPE는 SQL과 비슷한 문법을 가지고 있으면서 C#을 통해 고급 기능을 자유롭게 확장할 수 있는 언어이다. 최근에 빅데이타에 대한 관심이 대폭 증가하면서 마이크로소프트는 이러한 SCOPE를 기본으로 하여 그 위에 TSQL 고급 기능을 추가한 새로운 빅데이타 언어를 개발하였는데, 이것이 U-SQL이다. U-SQL의 U는 “Unify”를 의마한다.

U-SQL은 기존 빅데이타 언어들이 갖는 여러 문제들을 넘어서기 위해 만들어 진 것으로 알려져 있다. U-SQL은 구조적 데이타와 비구조적 데이타에 공히 사용되며, 선언적 SQL문과 유연한 C# 프로그래밍 언어가 마치 Native 언어처럼 잘 통합되어진 빅데이타 언어이다.

그럼 U-SQL 스크립트를 맛보기 위하여 간단한 USQL 예제를 살펴보자.

Simple USQL

먼저 위의 예제에서 EXTRACT, SELECT, OUTPUT문은 U-SQL문으로서, EXTRACT는 데이타소스로부터 데이타를 발췌할 때 사용하고, SELECT문은 데이타의 가공, 집계(aggregation), 선택 추출 등에 사용된다. 그리고, OUTPUT문은 결과를 데이타타겟에 저장하는 일을 한다. U-SQL 내에는 C# 문장을 함께 사용될 수 있기 때문에, U-SQL의 모든 SQL 키워드는 대문자로 해야한다. 예를 들어, SUM(duration) AS total을 SUM(duration) as total 로 사용하면, 컴파일 에러가 발생하는데, 이는 as 가 C#에서 캐스팅을 수행하는 as 키워드로 인식되기 때문이다. 위의 예제에서 EXTRACT FROM 뒤에 /input/webdata.csv 를 지정하였는데, 이는 .csv 입력파일을 지정한 것으로 이 파일은 Azure Storage의 루트로부터의 상대적 위치를 표시한 것이다. (주: 만약 Azure가 아닌 로컬머신에서 테스트할 경우, VS의 Data Lake 메뉴 => Options and Settings 메뉴 => Local Run DataRoot 폴더로부터의 상대적 위치이다)

U-SQL의 필드들은 C#의 데이타 타입을 사용하는데, 예를 들어 라인 3의 string, int 등은 모두 C#의 데이타타입을 나타낸다. 또한, 라인 5, 17의 Extractors.Csv(), Outputters.Csv()는 U-SQL에 Built-in 된 실제 C#의 메서드들이다.

위의 스크립트를 보면 단순하게 한 파일에서 읽고 쓰는 것처럼 보이지만, 실제로 빅데이타에 적용할 경우 입력데이타 파일이 수천대의 서버에 분산되어 존재할 수 있고, 이를 U-SQL 스크립트가 자동으로 처리해준다 점에서 이는 매우 강력한 기능이라 볼 수 있다.

U-SQL과 C#의 긴밀한 언어적 통합은 다음과 같이 크게 4가지로 구분할 수 있다.

  1. U-SQL 스크립트 내에서 간단한 C# 타입 메서드에서 람다식에 이르기 까지 여러 C# 표현식을 사용할 수 있다.
  2. C#으로 User-defined Function (UDF)를 만들어 U-SQL에서 이 UDF를 호출할 수 있다.
  3. C#으로 User-defined Aggregator (UDAGG)를 만들어 U-SQL에서 이 UDAGG를 호출할 수 있다.
  4. C#으로 User-defined Operator (UDO)를 만들어 U-SQL에서 이 UDO를 호출할 수 있다.

U-SQL 스크립트는 Codebehind로 불리우는 C# 코드를 가질 수 있다. Visual Studio에서 U-SQL 스크립트를 만드는 경우, 예를 들어 스크립트명이 Script.usql 인 경우, 일반적으로 C# Codebehind로 Script.usql.cs 를 만든다.

C# 코드로 UDF,UDAGG,UDO를 만들어 U-SQL 스크립트와 함께 사용하면, 컴파일러는 C# 코드를 바이너리 Assembly로 만들어 U-SQL 카탈로그에 등록하여 사용한다 (마치 SQL Server 에서 C#으로 작성된 SQL CLR Assembly를 등록하고 TSQL에서 호출하여 사용하듯이).

C# 코드는 CREATE ASSEMBLY (U-SQL) 문을 사용하여 해당 어셈블리를 U-SQL 카달로그에 등록하고, U-SQL 스크립트에서 REFERENCE ASSEMBLY문으로  그 어셈블리를 참조하여 사용한다. C# 코드를 라이브러리처럼 타 개발자와 공유하는 경우 U-SQL 어셈블리를 명시적으로 등록하여 사용한다. 명시적 등록이 아닌 경우 컴파일러가 스크립트 실행 동안만 암묵적으로 임시 등록하고 삭제하는 코드를 자동으로 넣게 된다.

그러면 C#을 좀 더 많이 사용한 U-SQL 예제를 들어보자.

//script.usql 파일
// 1. Extract
@tab = EXTRACT webpage string, user string, duration int 
       FROM "/input/webdata.csv" 
       USING Extractors.Csv(); //C# UDO

// 2. Process
@tab =
    SELECT webpage.Substring(0, 5) AS tag, // C# Substring() 메서드
     webpage.Split('/').Where(p => p == "admin").Any() AS admin, //C# 람다식
     MyApp.Udfs.GetFirstPath(webpage) AS first //C# UDF 사용              
    FROM @tab;

@result =
    SELECT tag,
           COUNT( * ) AS count
    FROM @tab
         WHERE admin == false
    GROUP BY tag;
            
// 3. Output            
OUTPUT @result
TO "/output/result.csv"
USING Outputters.Csv();  //C# UDO

위의 예제에서 먼저 라인9, 10은 C#의 string.Substring() 메서드와 더 나아가 람다식까지 사용될 수 있음을 보여준다. Extractors.Csv()와 Outputters.Csv()는 Built-in된 C# 메서드들로서 데이타입출력과 관련된 기능을 하는 Operator이다. 또한 라인11은 개발자 필요시 사용자 정의 함수(UDF)를 C#으로 작성하고 이를 호출하여 사용할 수 있음을 보여준다. 여기서 사용된 사용자 정의 함수는 아래 C# 코드에 표시되었는데, UDF는 public 클래스에 public static 메서드를 사용한다.

//script.usql.cs 파일
namespace MyApp
{
    public class Udfs
    {
        public static string GetFirstPath(string url)
        {
            var paths = url.Split('/');
            if (paths.Length > 1)
            {
                return paths[1];
            }
            return string.Empty;
        }
    }
}

이제까지 U-SQL에 대해 개략적으로 살펴보았는데, 현재 U-SQL은 아직 완전히 Stable한 상태가 아니라 계속 개발이 진행 중인 상태이다.

[2016년 1월 현재] 참고로 U-SQL을 직접 실행보기 위해서는 Azure SDK를 설치하고, Azure Data Lake Tools for Visual Studio를 설치하면 된다. Azure Data Lake는 계속 개발 중이라 현재 Preview 상태이며, 별도로 신청을 해야 한다. Azure Data Lake에 접속할 수 없는 경우, 로컬에서 실행해 볼 수는 있다.
 



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.