56、大数据处理:Azure 上的 Spark 实践与 Twitter 标签统计

大数据处理:Azure 上的 Spark 实践与 Twitter 标签统计

1. 在 Microsoft Azure HDInsight Spark 集群上实现 Spark 词频统计

在 Azure 上实现 Spark 词频统计,可按以下步骤操作:
1. 创建 Apache Spark 集群 :通过 Azure 门户创建,参考链接:https://docs.microsoft.com/en-us/azure/hdinsight/spark/apache-spark-jupyter-spark-sql-use-portal 。创建时注意选择集群类型为 Spark,默认配置资源较多,可将工作节点数改为 2,并配置工作节点和头节点使用 D3 v2 计算机。点击创建后,配置和部署集群需 20 - 30 分钟。
2. 安装库到集群 :若 Spark 代码需要未安装的库,可使用以下命令查看默认安装的库:

/usr/bin/anaconda/envs/py35/bin/conda list

使用提供的安装脚本安装所需库,步骤如下:
1. 在 Azure 门户中选择集群。
2. 点击集群搜索框下的“Script Actions”。
3. 点击“Submit new”,脚本类型选“Custom”,名称指定为“libraries”,Bash 脚本 URI 使用:http://deitel.com/bookresources/IntroToPython/install_libraries.sh 。
4. 勾选“Head”和“Worker”确保脚本在所有节点安装库。
5. 点击“Create”。执行成功会在脚本操作列表中显示绿色对勾,否则 Azure 会通知错误。
3. 复制 RomeoAndJuliet.txt 到 HDInsight 集群
1. 使用 scp 命令上传文件,命令如下:

scp RomeoAndJuliet.txt sshuser@YourClusterName-ssh.azurehdinsight.net:
2. 使用 `ssh` 登录集群:
ssh sshuser@YourClusterName-ssh.azurehdinsight.net 
3. 将文件复制到集群的 Hadoop 文件系统:
hadoop fs -copyFromLocal RomeoAndJuliet.txt /example/data/RomeoAndJuliet.txt
  1. 访问 HDInsight 中的 Jupyter 笔记本 :HDInsight 使用旧版 Jupyter Notebook 界面,可参考:https://jupyter-notebook.readthedocs.io/en/stable/examples/Notebook/Notebook%20Basics.html 。在 Azure 门户选择所有资源,再选集群,在“Overview”标签下选择“Jupyter notebook”,使用集群设置时的用户名和密码登录。
  2. 上传 RomeoAndJulietCounter.ipynb 笔记本 :点击“Upload”按钮,选择 ch16 示例文件夹的 SparkWordCount 文件夹中的 RomeoAndJulietCounter.ipynb 文件,点击“Open”,再点击右侧“Upload”将笔记本放入当前文件夹,点击笔记本名称在新标签页打开,选择“PySpark3”内核。
  3. 修改笔记本以适配 Azure
    1. 修改 nltk.download('stopwords') 为:
nltk.download('stopwords', download_dir='.')
2. 在第二个单元格的导入语句后添加:
nltk.data.path.append('.')
3. 删除原笔记本的第三和第四个单元格。
4. 将 `'RomeoAndJuliet.txt'` 替换为 `'wasb:///example/data/RomeoAndJuliet.txt'`。
5. 将最后一个单元格的 f - 字符串替换为:
print('{:>{width}}: {}'.format(word, count, width=max_len))
2. 使用 pyspark - notebook Docker 栈统计 Twitter 标签

此部分将创建并运行 Spark 流式应用,接收指定主题的推文流,并每 10 秒更新一次前 20 个标签的柱状图。
1. 启动 Docker 容器并安装 Tweepy :按照相关说明启动容器并安装 Python 库,使用以下命令安装 Tweepy:

pip install tweepy
  1. 将推文流式传输到套接字
    • 执行脚本 :在 JupyterLab 的终端窗口执行 starttweetstream.py 脚本。先导航到 SparkHashtagSummarizer 文件夹:
cd work/SparkHashtagSummarizer
然后执行脚本,例如获取 1000 条关于足球的推文:
ipython starttweetstream.py 1000 football
此时脚本会显示“Waiting for connection”,等待 Spark 连接。
- **starttweetstream.py 脚本分析**:
# starttweetstream.py
"""Script to get tweets on topic(s) specified as script argument(s) 
   and send tweet text to a socket for processing by Spark."""
import keys
import socket
import sys
import tweepy

class TweetListener(tweepy.StreamListener):
    """Handles incoming Tweet stream."""
    def __init__(self, api, connection, limit=10000):
        """Create instance variables for tracking number of tweets."""
        self.connection = connection
        self.tweet_count = 0
        self.TWEET_LIMIT = limit  # 10,000 by default
        super().__init__(api)  # call superclass's init

    def on_connect(self):
        """Called when your connection attempt is successful, enabling 
        you to perform appropriate application tasks at that point."""
        print('Successfully connected to Twitter\n')

    def on_status(self, status):
        """Called when Twitter pushes a new tweet to you."""
        # get the hashtags
        hashtags = []
        for hashtag_dict in status.entities['hashtags']:
            hashtags.append(hashtag_dict['text'].lower())
        hashtags_string = ' '.join(hashtags) + '\n'
        print(f'Screen name: {status.user.screen_name}:')
        print(f'   Hashtags: {hashtags_string}')
        self.tweet_count += 1  # track number of tweets processed
        try:
            # send requires bytes, so encode the string in utf-8 format
            self.connection.send(hashtags_string.encode('utf-8'))  
        except Exception as e:
            print(f'Error: {e}')
        # if TWEET_LIMIT is reached, return False to terminate streaming
        return self.tweet_count != self.TWEET_LIMIT

    def on_error(self, status):
        print(status)
        return True

if __name__ == '__main__':
    tweet_limit = int(sys.argv[1])  # get maximum number of tweets
    client_socket = socket.socket()  # create a socket 
    # app will use localhost (this computer) port 9876
    client_socket.bind(('localhost', 9876))  
    print('Waiting for connection')
    client_socket.listen()  # wait for client to connect
    # when connection received, get connection/client address
    connection, address = client_socket.accept()  
    print(f'Connection received from {address}')
    # configure Twitter access
    auth = tweepy.OAuthHandler(keys.consumer_key, keys.consumer_secret)
    auth.set_access_token(keys.access_token, keys.access_token_secret)
    # configure Tweepy to wait if Twitter rate limits are reached
    api = tweepy.API(auth, wait_on_rate_limit=True, 
                     wait_on_rate_limit_notify=True)               
    # create the Stream
    twitter_stream = tweepy.Stream(api.auth, 
        TweetListener(api, connection, tweet_limit))
    # sys.argv[2] is the first search term
    twitter_stream.filter(track=sys.argv[2:]) 
    connection.close()
    client_socket.close()
- **关键说明**:
    - `__init__` 方法接收套接字参数并存储在 `self.connection` 中,用于向 Spark 应用发送标签。
    - `on_status` 方法提取标签,转换为小写并发送到套接字。

以下是创建 Apache Spark 集群和安装库的流程 mermaid 流程图:

graph LR
    A[开始] --> B[创建 Apache Spark 集群]
    B --> C[安装库到集群]
    C --> D[复制文件到集群]
    D --> E[访问 Jupyter 笔记本]
    E --> F[上传笔记本]
    F --> G[修改笔记本适配 Azure]
    G --> H[完成]
3. 总结推文标签;引入 Spark SQL

可创建新笔记本或加载提供的 hashtagsummarizer.ipynb 笔记本进行操作。
1. 导入库

from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.sql import Row, SparkSession
from IPython import display
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline 
  1. 获取 SparkSession 的实用函数
def getSparkSessionInstance(sparkConf):
    """Spark Streaming Programming Guide's recommended method 
       for getting an existing SparkSession or creating a new one."""
    if ("sparkSessionSingletonInstance" not in globals()):
        globals()["sparkSessionSingletonInstance"] = SparkSession \
            .builder \
            .config(conf=sparkConf) \
            .getOrCreate()
    return globals()["sparkSessionSingletonInstance"]
  1. 基于 Spark DataFrame 显示柱状图的实用函数
def display_barplot(spark_df, x, y, time, scale=2.0, size=(16, 9)):
    """Displays a Spark DataFrame's contents as a bar plot."""
    df = spark_df.toPandas()
    # remove prior graph when new one is ready to display
    display.clear_output(wait=True) 
    print(f'TIME: {time}')
    # create and configure a Figure containing a Seaborn barplot 
    plt.figure(figsize=size)
    sns.set(font_scale=scale)
    barplot = sns.barplot(data=df, x=x, y=y, palette=sns.color_palette('cool', 20))
    # rotate the x-axis labels 90 degrees for readability
    for item in barplot.get_xticklabels():
        item.set_rotation(90)
    plt.tight_layout()
    plt.show()
  1. 总结前 20 个标签的实用函数
def count_tags(time, rdd):
    """Count hashtags and display top-20 in descending order."""
    try:
        # get SparkSession
        spark = getSparkSessionInstance(rdd.context.getConf()) 
        # map hashtag string-count tuples to Rows 
        rows = rdd.map(
            lambda tag: Row(hashtag=tag[0], total=tag[1])) 
        # create a DataFrame from the Row objects
        hashtags_df = spark.createDataFrame(rows)
        # create a temporary table view for use with Spark SQL
        hashtags_df.createOrReplaceTempView('hashtags')
        # use Spark SQL to get top 20 hashtags in descending order
        top20_df = spark.sql(
            """select hashtag, total 
               from hashtags 
               order by total, hashtag desc 
               limit 20""")
        display_barplot(top20_df, x='hashtag', y='total', time=time)
    except Exception as e:
        print(f'Exception: {e}')
  1. 设置 Spark 流式处理
    • 获取 SparkContext
sc = SparkContext()
- **获取 StreamingContext**:
ssc = StreamingContext(sc, 10)
- **设置检查点**:
ssc.checkpoint('hashtagsummarizer_checkpoint')  
- **连接到流**:
stream = ssc.socketTextStream('localhost', 9876)
- **分词**:
tokenized = stream.flatMap(lambda line: line.split())
- **映射标签到标签 - 计数对**:
mapped = tokenized.map(lambda hashtag: (hashtag, 1))
- **汇总标签计数**:
hashtag_counts = tokenized.updateStateByKey(
    lambda counts, prior_total: sum(counts) + (prior_total or 0)) 
- **指定处理每个 RDD 的方法**:
hashtag_counts.foreachRDD(count_tags)
- **启动 Spark 流**:
ssc.start()  # start the Spark streaming

以下是统计 Twitter 标签的流程 mermaid 流程图:

graph LR
    A[开始] --> B[启动 Docker 容器并安装 Tweepy]
    B --> C[将推文流式传输到套接字]
    C --> D[总结推文标签;引入 Spark SQL]
    D --> E[设置 Spark 流式处理]
    E --> F[启动 Spark 流]
    F --> G[完成]

在完成操作后,务必删除集群和其他资源以避免产生费用,可参考:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-group-portal 。同时,可在 Jupyter 中选择“File > Download as > Notebook (.ipynb)”下载执行的笔记本。

大数据处理:Azure 上的 Spark 实践与 Twitter 标签统计

4. 操作步骤总结与注意事项

为了更清晰地展示整个大数据处理流程,下面将操作步骤进行总结,并列出一些需要注意的事项。

4.1 操作步骤总结
操作阶段 具体步骤
创建 Apache Spark 集群 1. 通过 Azure 门户,参考指定链接创建集群,选择集群类型为 Spark。
2. 修改默认配置,将工作节点数改为 2,配置工作节点和头节点使用 D3 v2 计算机。
3. 点击创建,等待 20 - 30 分钟完成配置和部署。
安装库到集群 1. 使用 ssh 登录集群,执行命令查看默认安装的库。
2. 在 Azure 门户选择集群,点击“Script Actions”,再点击“Submit new”。
3. 配置脚本类型、名称和 Bash 脚本 URI。
4. 勾选“Head”和“Worker”,点击“Create”。
复制文件到集群 1. 使用 scp 命令上传文件到集群。
2. 使用 ssh 登录集群。
3. 将文件复制到集群的 Hadoop 文件系统。
访问 Jupyter 笔记本 1. 在 Azure 门户选择所有资源和集群,在“Overview”标签下选择“Jupyter notebook”。
2. 使用集群设置时的用户名和密码登录。
上传笔记本 1. 点击“Upload”按钮,选择指定文件夹中的文件,点击“Open”。
2. 点击右侧“Upload”将笔记本放入当前文件夹,点击笔记本名称在新标签页打开,选择“PySpark3”内核。
修改笔记本适配 Azure 1. 修改 nltk.download('stopwords')
2. 在第二个单元格添加语句。
3. 删除原笔记本的第三和第四个单元格。
4. 替换文件路径。
5. 替换最后一个单元格的 f - 字符串。
启动 Docker 容器并安装 Tweepy 1. 按照相关说明启动容器。
2. 使用 pip install tweepy 命令安装 Tweepy。
将推文流式传输到套接字 1. 在 JupyterLab 的终端窗口导航到指定文件夹。
2. 执行脚本获取指定数量和主题的推文。
总结推文标签;引入 Spark SQL 1. 导入所需库。
2. 定义获取 SparkSession、显示柱状图和总结标签的实用函数。
设置 Spark 流式处理 1. 获取 SparkContext 和 StreamingContext。
2. 设置检查点。
3. 连接到流,进行分词、映射、汇总标签计数等操作。
4. 指定处理每个 RDD 的方法,启动 Spark 流。
4.2 注意事项
  • 资源管理 :完成操作后,务必删除集群和其他资源,避免产生不必要的费用。可参考相关链接进行资源删除操作。
  • 笔记本保存 :在 Jupyter 中可选择“File > Download as > Notebook (.ipynb)”下载执行的笔记本,防止资源删除时笔记本丢失。
  • 代码兼容性 :Azure 目前使用 Python 3.5.x,不支持 f - 字符串,需进行相应替换。
  • 文件路径 :在修改笔记本适配 Azure 时,要注意文件路径的替换,确保代码能正确访问文件。
5. 技术点分析

在整个大数据处理过程中,涉及到多个关键技术点,下面对这些技术点进行详细分析。

5.1 Spark 与 Azure HDInsight

Spark 是一个快速通用的集群计算系统,而 Azure HDInsight 是微软提供的托管式云服务,可轻松在 Azure 上运行 Spark 集群。通过在 HDInsight 上创建 Spark 集群,我们可以利用其强大的计算能力处理大规模数据。在创建集群时,需要注意配置资源,避免资源浪费。同时,安装所需库时,要确保脚本能在所有节点上正确执行。

5.2 数据处理与分析
  • 文本处理 :在处理 RomeoAndJuliet.txt 文件时,需要进行文本清洗和分词操作,以便后续进行词频统计。在统计 Twitter 标签时,同样需要对推文进行处理,提取标签并进行计数。
  • Spark SQL :Spark SQL 提供了一种统一的方式来处理结构化数据,可将 Spark DataFrame 视为关系数据库中的表,使用 SQL 语句进行查询和分析。在统计 Twitter 标签时,我们使用 Spark SQL 从临时表中查询前 20 个标签。
5.3 流式处理

Spark Streaming 是 Spark 的一个扩展,用于处理实时数据流。在统计 Twitter 标签的示例中,我们使用 Spark Streaming 接收推文流,并每 10 秒更新一次前 20 个标签的柱状图。通过设置检查点,可实现容错和状态管理,确保在集群节点或应用程序故障时能恢复流处理。

6. 总结

通过本文的介绍,我们详细了解了在 Azure 上使用 Spark 进行大数据处理的完整流程,包括创建集群、安装库、处理文件、统计 Twitter 标签等操作。同时,我们还对涉及的关键技术点进行了分析,深入理解了 Spark、Azure HDInsight、数据处理和流式处理等技术的应用。

在实际应用中,我们可以根据具体需求调整参数和配置,优化处理性能。例如,根据数据量和处理速度调整批处理间隔,根据集群资源情况调整节点数量等。希望本文能为你在大数据处理领域的实践提供有价值的参考。

以下是整个大数据处理流程的 mermaid 流程图:

graph LR
    A[开始] --> B[创建 Apache Spark 集群]
    B --> C[安装库到集群]
    C --> D[复制文件到集群]
    D --> E[访问 Jupyter 笔记本]
    E --> F[上传笔记本]
    F --> G[修改笔记本适配 Azure]
    G --> H[启动 Docker 容器并安装 Tweepy]
    H --> I[将推文流式传输到套接字]
    I --> J[总结推文标签;引入 Spark SQL]
    J --> K[设置 Spark 流式处理]
    K --> L[启动 Spark 流]
    L --> M[完成]
复杂几何的多球近似MATLAB类及多球模型的比较 MATLAB类Approxi提供了一个框架,用于使用具有迭代缩放的聚集球体模型来近似解剖体积模型,以适应目标体积和模型比较。专为骨科、生物力学和计算几何应用而开发。 MATLAB class for multi-sphere approximation of complex geometries and comparison of multi-sphere models 主要特点: 球体模型生成 1.多球体模型生成:Sihaeri的聚集球体算法的接口 2.音量缩放 基于体素的球体模型和参考几何体的交集。 迭代缩放球体模型以匹配目标体积。 3.模型比较:不同模型体素占用率的频率分析(多个评分指标) 4.几何分析:原始曲面模型和球体模型之间的顶点到最近邻距离映射(带颜色编码结果)。 如何使用: 1.代码结构:Approxi类可以集成到相应的主脚本中。代码的关键部分被提取到单独的函数中以供重用。 2.导入:将STL(或网格)导入MATLAB,并确保所需的函数,如DEM clusteredSphere(populateSpheres)和inpolyhedron,已添加到MATLAB路径中 3.生成多球体模型:使用DEM clusteredSphere方法从输入网格创建多球体模型 4.运行体积交点:计算多球体模型和参考几何体之间的基于体素的交点,并调整多球体模型以匹配目标体积 5.比较和可视化模型:比较多个多球体模型的体素频率,并计算多球体模型原始表面模型之间的距离,以进行2D/3D可视化 使用案例: 骨科和生物力学体积建模 复杂结构的多球模型形状近似 基于体素拟合度量的模型选择 基于距离的患者特定几何形状和近似值分析 优点: 复杂几何的多球体模型 可扩展模型(基于体素)-自动调整到目标体积 可视化就绪输出(距离图)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值