将百万行加载到分区有状态服务中

时间:2018-02-14 10:45:21

标签: azure-service-fabric service-fabric-stateful

我试图将2000万行加载到分区有状态服务ReliableDictionary中。我将有状态服务划分为10个分区。基于MSDN文档,我理解我需要使用一些散列算法来找到正确的分区并将数据发送到它以加载到IReliabledictionary中。所以我使用Hydra根据值获取分区号。我存储的所有内容都是List<long>中的IReliableDictionary

所以我创建了一个无状态服务作为包装器,

  1. 将从SQL Server(2000万)中获取行,
  2. 为每行使用Hydra获取分区号
  3. 按分区号
  4. 对它们进行分组
  5. 使用ServiceRemoting为每个分区调用Stateful服务。但是,如果我每个请求发送100万行数据,我会得到fabric message too large异常,所以我将每个请求分成100000个。
  6. 这需要74分钟才能完成。这太长了。以下是上传代码 -

    请告知。

     foreach (var itemKvp in ItemsDictionary)
                {
                    var ulnv2Uri = new Uri("fabric:/TestApp/dataservice");
    
    
                    //Insert to the correct shard based on the hash algorithm 
                    var dataService = _serviceProxyFactory.CreateServiceProxy<IDataService>(
                    dataStoreUri,
                     new ServicePartitionKey(itemKvp.Key), TargetReplicaSelector.PrimaryReplica, "dataServiceRemotingListener");
    
                    var itemsShard = itemKvp.Value;
                    //if the total records count is greater then 100000 then send it in chunks
                    if (itemsShard.Count > 1_000_000)
                    {
                        //var tasks = new List<Task>();
                        var totalCount = itemsShard.Count;
                        var pageSize = 100000;
                        var page = 1;
                        var skip = 0;
                        while (skip < totalCount)
                        {
                            await dataService.InsertData(itemsShard.Skip(skip).Take(pageSize).ToList());
                            page++;
                            skip = pageSize * (page - 1);
                        }
    
                    }
                    else
                    {
                       //otherwise send all together
                        await dataService.InsertData(itemsShard);
                    }
    
                }
    

1 个答案:

答案 0 :(得分:1)

通过并行上传到所有分区,您可以节省一些时间。 因此,创建10个服务代理(每个分区一个)并同时使用它们。