2014-09-14 4 views
3

Azure 테이블에서 약 2 천 5 백만 행을 Azure 테이블 저장소의 세 가지 테이블로 대량로드하려고합니다. 저는 현재 50-100 행/초를 처리하고 있습니다. 즉, 현재 속도로로드를 완료하는 데 약 70-140 시간이 걸릴 것입니다. 그것은 오랜 시간이며, 속도를 높이는 것이 가능해야하는 것처럼 보입니다.Azure 테이블 저장소 대량로드의 성능 향상

  • 킥 오프 10 개 별도의 작업을 각 작업에 대한
  • , 세 대상의 각각에 대한 SQL DB
  • 에서 다음 만 개 처리되지 않은 기록을 읽어 테이블을 ATS : 여기

    내가 뭘하는지입니다 해당 테이블의 파티션 키로 10,000 레코드를 그룹화하십시오.
  • 병렬로 (동시에 최대 10 개) 각 파티션 키에 대해 파티션을 (최대) 100 개의 행 세그먼트로 분할
  • 병렬로 10 동시에) 각 세그먼트에 대해 새 TableBatchOperation을 만듭니다. 청크의 각 행에 대해
  • ,
  • 이 배치를 실행 비동기
  • 린스와 반복 (일부 데이터가 이미로드되어 있기 때문에, 나는 어떤을 모르는)을 batch.InsertOrReplace() 문을 실행

일부 노트 (흐름 제어, 오류 검사 등의 많은) :

  • 나는까지 위의 여러 숫자에 대해 서로 다른 매개 변수의 많은이 여러 가지 방법을 시도하고, 한 나는 아직도 g가 아니다. 10-20ms/event 이하로 떨어 뜨린다.
  • 로드하는 VM이 ​​평균 약 10-20 % CPU이기 때문에 CPU 바인딩되지 않은 것 같습니다.
  • SQL select 문은 연산의 가장 빠른 부분이므로 적어도 두 개의 순서로 SQL 바인딩 된 것처럼 보이지 않습니다.
  • 일괄 처리를 실행하는 VM이 ​​동일한 데이터 센터 (미국 서부)에 있기 때문에 네트워크에 연결되지 않은 것으로 추정됩니다.
  • 합리적인 파티션 밀도를 얻고 있습니다. 즉, 각 10K 레코드 세트가 각 테이블에 대해 수백 개의 파티션으로 나뉘어져 있습니다.
  • 완벽한 파티션 밀도를 사용하면 최대 3000 개의 작업 (10 개의 마스터 작업 * 3 개의 테이블 * 10 개의 파티션 * 10 개의 세그먼트)을 동시에 실행할 수 있습니다. 그러나 그들은 비동기 적으로 실행되고 있으며 거의 ​​모든 I/O 바인딩 (ATS에 의해)이므로 프로세스를 실행하는 VM에 대한 스레딩 제한을 초과하지는 않습니다. 우리는 일괄 삽입에 대한 완벽한 파티션 밀도를 얻을 수 있도록

내가 가지고 올 수있는 유일한 명백한 아이디어는 내가 SQL SELECT 문에 order by 파티션 키를 수행하는, 즉, 이전에 시도 하나 . 어려운 이유가 여러 가지 이유로, 테이블의 인덱스가 그걸 위해 준비되지 않았기 때문입니다. 그리고 일부는이 ATS 측에서 그 접근법을 사용하여 속도를 높이는 것을 기대할 수 있습니다. 이미 파티션 키를 사용하여 10K 레코드를 그룹화 했으므로 훨씬 많은 성능 향상을 기대할 수 없습니다.

과속을 빨리 방지하기위한 다른 제안 사항이 있습니까? 아니면 다른 사람이 얻을 수있는만큼 빨리 할 수 ​​있습니까?

+0

이 링크는 찾고있는 정보를 제공합니다. http://leiliweb.wordpress.com/2012/12/11/partitioned-table-and-index-strategies-using-sql-server-2008/ –

+0

@ J.Davidson - 제안 해 주셔서 감사합니다.하지만 SQL Server *에 대한 파티션 전략에 대해 이야기하고 Azure 테이블 저장소에 문제가 있습니다. 오히려 다른 짐승 :-). –

답변

1

다른 제안에 열려,하지만 난 여기에 꽤 도움이 페이지를 발견 : 특히

http://blogs.msmvps.com/nunogodinho/2013/11/20/windows-azure-storage-performance-best-practices/

를,이 : 그와

ServicePointManager.Expect100Continue = false; 
ServicePointManager.UseNagleAlgorithm = false; 
ServicePointManager.DefaultConnectionLimit = 100; 

, 나는 평균 처리를 드롭 할 수 있었다 ~ 10-20 ms/event에서 ~ 2 ms까지의 시간. 훨씬 좋습니다.

하지만 내가 말했듯이 다른 제안은 여전히 ​​열려 있습니다. ATS에서 초당 20,000 건의 작업을 수행하는 다른 사람들에 대해 읽었습니다. 아직 약 500 명이 붙어 있습니다.

0

파티션 키는 어떻게됩니까? 그들이 증분 숫자라면, Azure는 그것들을 하나의 스토리지 노드로 최적화 할 것입니다. 따라서 "1", "2"대신에 완전히 다른 파티션 키 "A1", "B2"등을 사용해야합니다. 이 경우 모든 파티션이 다른 스토리지 노드에서 처리되며 성능이 다중화됩니다.

+0

어떻게 동작하는지 문서에 대한 포인터가 있습니까? Azure는 마술처럼 분할 키 스키마를 기반으로하지 않고로드 및 크기를 기반으로 트래픽을 별도의 노드로 분리하는 결정을 내릴 것으로 생각했습니다. –

+0

여기 있습니다 : http://msdn.microsoft.com/en-us/library/azure/hh508997.aspx – martonx