2017-02-21 1 views
2

코드는 2000 개의 작은 파일 (~ 10-50 Kb) ~ 1 분 동안 매우 빠르게 수행됩니다. 나는 다음과 같은 코드를 변경하는 경우 Parallelizm는하지만 ~ 1시간u-SQL 작업이 .NET 호출을 추가 할 때 매우 느립니다.

@arenaData = 
    EXTRACT col1, col2, col3 
    FROM @in 
    USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8); 

@res = 
    SELECT 
     col1.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) AS col1_converted, 
, col2, col3 

    FROM @arenaData; 
    OUTPUT @res 
    TO @out 
    USING Outputters.Csv(); 

5.

@arenaData = 
    EXTRACT col1, col2, col3 
    FROM @in 
    USING Extractors.Tsv(quoting : true, skipFirstNRows : 1, nullEscape : "\\N", encoding:Encoding.UTF8); 

@res = 
    SELECT col1, col2, col3 
    FROM @arenaData; 
    OUTPUT @res 
    TO @out 
    USING Outputters.Csv(); 

소요 = 왜 .NET 호출 너무 느려? 원본 CSV 파일의 날짜 형식을 "yyyy-MM-dd HH : mm : ss"로 변환해야합니까? 어떻게 효과적으로 할 수 있습니까?

+0

이것은 올바르게 들리지 않습니다. CLR을로드하고 네이티브 코드에서 C# 실행으로 호출해야하는 추가 오버 헤드가 있지만 그만큼 60 배 이상은 안됩니다. 엔지니어링 팀에 조사를 요청할 수 있도록 작업 링크 (Microsoft.com에서 usql)를 보내 주시겠습니까? –

+0

stackoverflow에 질문을 게시하기 전에 ADLA 지원 팀 지원 티켓을 시작했습니다. 내가했던 지원 팀이 테스트 (아래 JOB의 URL을) : ~ 2 분 CLR없이 (MAXDOP = 5) : https://arkadium.azuredatalakeanalytics.net/jobs/68d7a42a-4f66-4308-a398- 3775eee74877? api-version = 2015-11-01-preview 하나의 CLR 호출과 동일 ~ ~ 38 분 (MAXDOP = 5) : https://arkadium.azuredatalakeanalytics.net/jobs/4291a7e6-ed0f-4516- b677-38a432a9997c? api-version = 2015-11-01-preview 매개 변수가 변경 되었기 때문에 타이밍이 변경되었지만 문제가 여전히 존재합니다. sooo 큰 차이 – churupaha

+0

더 많은 테스트 : CLR + 병렬 처리가 동일한 작업이 5에서 20으로 증가했습니다. 경과 시간 ~ 10 분 https : // arkadium.azuredatalakeanalytics.net/jobs/c09a8917-3425-48df-97ea-e4a84dad3c15?api-version=2015-11-01- 미리보기 CLR + 병렬 처리가 동일한 작업이 5에서 3으로 증가했습니다. 경과 시간 ~ 59 분 + 취소됨 나 https://arkadium.azuredatalakeanalytics.net/jobs/9168ea66-e988-4497-b661-417f1128ceac?api-version=2015-11-01-preview – churupaha

답변

2

더 나은 성능을 지금 듣고 있습니다.

U-SQL의 일반적인 C# 표현식 중 일부가 관리되는 코드로 실행되고 있고 C++로 변환되지 않은 표현식을 사용하여 2800 개의 매우 작은 파일에서 작업이 실행됩니다.

이 다음과 같은 문제에 이르게 :

  1. 당신의 AU의 특정 번호로 작업을 시작합니다. 그런 다음 각 AU는 작업의 일부를 수행하기 위해 YARN 컨테이너를 시작합니다. 즉, 컨테이너를 초기화 할 때 시간이 걸릴 필요가 있습니다 (Vertex Execution View에서 생성 시간으로 볼 수 있음). 이제 약간의 시간이 걸립니다. 정점이 처리량이 많은 경우 오버 헤드가 많지 않습니다. 불행히도 귀하의 경우 작은 파일에서 처리가 매우 빠르므로 큰 오버 헤드가 있습니다.

  2. 정점이 코드 생성 코드를 C++ 코드로만 실행하는 경우 재 초기화 시간없이 컨테이너를 재사용 할 수 있습니다. 유감스럽게도 잠재적 인공물이 남겨져 관리되는 런타임과 함께 실행되는 일반 사용자 코드를 재사용 할 수 없습니다. 따라서이 경우 컨테이너를 다시 초기화해야하는데 시간이 걸릴 것입니다 (2800 회 이상).

가 이제 여러분의 의견을 바탕으로, 우리는 우리의 재 초기화 로직을 (당신이 인라인 C#을 표현 공상 아무것도하지 않는 경우 우리가 아직 다시 초기화 할 수 있습니다) 개선된다. 또한 정점 당 하나의 파일 대신 단일 정점 내부에 여러 개의 작은 파일을 처리 할 수있게되면 더 좋아질 것입니다.

해결 방법은 파일 크기를 늘리고 너무 많은 정점에 사용자 지정 코드 (항상 가능한 것은 아님)를 피하는 것입니다.

+0

큰 고맙습니다. 또한 나는 AU ~ Apache YARN 컨테이너 언더 후드를 알고 있습니다. – churupaha

관련 문제