簡體   English   中英

使用 Spark 的 MapReduce 調用不同的函數並聚合

[英]Using Spark's MapReduce to call a different function and aggregate

我對 spark 非常不熟悉,但我很確定有一種好方法可以比我目前做的更快地做我想做的事情。

本質上,我有一個 S3 存儲桶,其中包含大量 JSON 的 Twitter 數據。 我想瀏覽所有這些文件,從 JSON 中獲取文本,對文本進行情感分析(目前使用斯坦福 NLP),然后將 Tweet + Sentiment 上傳到數據庫(現在我正在使用 dynamo,但是這個不是成敗)

我目前擁有的代碼是

        /**
         * Per thread:
         * 1. Download a file
         * 2. Do sentiment on the file -> output Map<String, List<Float>>
         * 3. Upload to Dynamo: (a) sentiment (b) number of tweets (c) timestamp
         *
         */

        List<String> keys = s3Connection.getKeys();

        ThreadPoolExecutor threads = new ThreadPoolExecutor(40, 40, 10000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10));
        threads.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        for (String key : keys) {
                threads.submit(new Thread(() -> {
                    try {
                        S3Object s3Object = s3Connection.getObject(key);
                        Map<String, List<Float>> listOfTweetsWithSentiment = tweetSentimentService.getTweetsFromJsonFile(s3Object.getObjectContent());
                        List<AggregatedTweets> aggregatedTweets = tweetSentimentService.createAggregatedTweetsFromMap(listOfTweetsWithSentiment, key);

                        for (AggregatedTweets aggregatedTweet : aggregatedTweets) {
                            System.out.println(aggregatedTweet);
                            tweetDao.putItem(aggregatedTweet);
                        }
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                }));
        }

這有效並且很好。 我能夠通過在某些日期范圍內運行此代碼(即 getKeys 僅獲取某些日期范圍的密鑰)並在不同的 EC2 上運行此過程的許多實例,每個實例都作用於不同的日期范圍。

然而,必須有一種更快的方法來使用一個好的 ole map-reduce 來做到這一點,但我只是不知道如何開始研究這個。 是否可以在我的地圖中進行情緒分析,然后根據時間戳減少?

此外,我正在考慮使用 AWS Glue,但我沒有看到在那里使用斯坦福 NLP 庫的好方法。

任何和所有的幫助將不勝感激。

是的,您可以使用 Apache Spark 做到這一點。 有很多方法可以設計您的應用程序、配置基礎設施等。我提出一個簡單的設計:

  1. 您在 AWS 上,因此使用 Spark 創建 EMR 集群。 包含 Zeppelin 進行交互式調試會很有用。

  2. Spark 使用多種數據抽象。 您的朋友是 RDD 和數據集(閱讀有關它們的文檔)。 讀取數據到 Datasets 的代碼可能是一樣的:

     SparkSession ss = SparkSession.builder().getOrCreate(); Dataset<Row> dataset = ss.read("s3a://your_bucket/your_path");
  3. 現在你有一個Dataset<Row> 這對於類似 SQL 的操作很有用。 為了您的分析,您需要將其轉換為 Spark RDD:

     JavaRDD<Tweet> analyticRdd = dataset.toJavaRDD().map(row -> { return TweetsFactory.tweetFromRow(row); });
  4. 因此,使用analyticRdd您可以做您的分析人員。 只是不要忘記使所有使用數據的服務都可序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM