25k 用户之后的大数据流程堆栈

Posted

技术标签:

【中文标题】25k 用户之后的大数据流程堆栈【英文标题】:Big Data process stack after 25k users 【发布时间】:2016-06-10 10:33:26 【问题描述】:

我有一个包含 28k 用户、60k 地点和 100 万条评论的数据集。我正在实施一个推荐系统,其中考虑到用户最终会做出的一些关于用户想去某个位置的程度的预测。

这是我如何做的代码

HashMap<String, HashMap<String, Double>> user_locIDVisitsPredictions = new HashMap<>();
HashMap<String, HashMap<String, Double>> user_locIDRatesPredictions = new HashMap<>();          


List<Future> tasks1 = new ArrayList<>();
ExecutorService executor1 = Executors.newFixedThreadPool(threads);
for(String me : wholeSetHistory.keySet())
    Runnable tokentask = new UserRun(wholeSetHistory, wholeSetRatings, lnglatStores2, user_locIDVisitsPredictions, user_locIDRatesPredictions, me, u);
    u++;
    tasks1.add(executor1.submit(tokentask));

executor1.shutdown();
boolean done1=false;
while(done1==false) 
    done1=true;
    for (int i=0; i<tasks1.size(); i++)
        try
            Future future =tasks1.get(i);
            if(future.get()!=null)
                done1=false;
                break;
            
        catch(Exception e)
            System.out.println("sto future kollise ");
        
    

tasks1.clear();

Runnable tokentask 正在为一个用户实现为他获取结果的过程。我正在使用线程,因为我在一台不在的机器上运行实验,它在 Linux 操作系统上运行。我用 nohub 运行它。

现在我的问题。在达到 25,000 个用户之前,这个过程进展顺利。最后的 3k 用户一直在为他们计算结果。

有关算法工作原理的更多详细信息。

    针对目标用户

    对于目标用户附近的所有其他用户

    2.1 获取他去过的位置并与目标用户进行比较

    2.2 获取他所做的费率并与目标用户进行比较

    2.3 做出相似之处

    2.4 做出预测

知道为什么在 25k 用户之后这个过程变得非常缓慢吗?

感谢您的宝贵时间!

【问题讨论】:

jvm 最大堆大小可能是内存问题 请注意,绝对堆大小不是必须的,但它足够大足够 【参考方案1】:

我会使用更少的任务。我猜wholeSetHistory 是 1m 集合,但是每个 CPU 只需要 1 到 2 个任务。幸运的是,有一个内置库可以为您执行此操作。

List<Result> results = wholeSetHistory.entrySet().parallelStream(e ->
    new UserRun(e.getValue(), wholeSetRatings, lnglatStores2, 
                user_locIDVisitsPredictions, user_locIDRatesPredictions, e.getKey())
    .result())
    .collect(Collectors.toList());

这将大大减少您一次创建的对象数量,并且代码更加简单。你也没有一个忙着等待线程烧 CPU。

【讨论】:

使用并行流不是一个好主意,因为它使用公共(共享)线程池,会干扰(耗尽共享线程)其他并行流 @SvetlinZarev 如果您已经使用了所有 CPU,您是说添加更多工作会减慢任何运行速度?在不使用更多硬件的情况下,您将如何防止这成为问题? @SvetlinZarev 使用两个线程池并不意味着你有更多的 CPU。 如果他使用自己的专用池,那么他的工作将并行工作,但如果他使用共享的 - 他们可能会等待直到线程变得可用 - 这与速度或更多 CPU 无关。这可能是一个问题,也可能不是。由他来决定。 假设您有 2 个任务 - 第 2 个任务取决于第 1 个任务和一个具有 1 个线程的共享池。您提交第二个询问并阻止。然后你提交第一个 - 在这里你有一个僵局。

以上是关于25k 用户之后的大数据流程堆栈的主要内容,如果未能解决你的问题,请参考以下文章

新闻网站大数据项目

大数据项目之电商数仓-用户行为数据采集

大数据项目之电商数仓-用户行为数据采集

大数据项目之电商数仓-用户行为数据采集

大数据项目之数仓相关知识

实时即未来,大数据项目车联网之原始数据实时ELT流式任务流程总结