.NET for Spark可用于处理成批数据、实时流、机器学习和ad-hoc查询。在这篇博客文章中,我们将探讨如何使用.NET for Spark执行一个非常流行的大数据任务,即日志分析。

1 什么是日志分析?

    日志分析的目标是从这些日志中获得有关工具或服务的活动和性能的有意义的见解。NET for Spark使我们能够快速高效地分析从兆字节到千兆字节的日志数据!
    在这篇文章中,我们将分析一组Apache日志条目,这些条目表示用户如何与web服务器上的内容交互。您可以在这里查看Apache日志条目的示例。

2 编写一个应用

    日志分析是Spark批量处理的一个例子。批处理是静态数据的转换,意味着源数据已经加载到数据存储中。在我们的例子中,输入文本文件已经填充了日志,并且在处理时不会接收新的或更新的日志。
    在为Spark应用程序创建新的.NET时,我们只需要遵循以下几个步骤,就可以开始从我们的数据中获得这些有趣的见解:

      • 创建Spark会话
      • 读取输入数据,通常使用DataFrame
      • 操作和分析输入数据,通常使用Spark SQL

2.1 创建Spark会话

    在任何Spark应用程序中,我们首先建立一个新的SparkSession,它是使用Spark编程的入口点:

SparkSession spark = SparkSession
.Builder()
.AppName("Apache User Log Processing")
.GetOrCreate();

2.2 读取输入数据

    我们将输入数据存储在DataFrame中,DataFrame是数据的分布式集合,它把数据组织为命名列的集合:

DataFrame generalDf = spark.Read().Text("<path to input data set>");

2.3 操纵和分析输入的数据

    重要的第一步是数据准备。数据准备包括以某种方式清理我们的数据。这可能包括删除不完整的条目以避免以后计算中出现错误,或者删除不相关的输入以提高性能。
    在我们的示例中,我们应该首先确保所有条目都是完整的日志。我们可以通过将每个日志条目与一个正则表达式进行匹配来实现这一点。
string s_apacheRx = "^(\S+) (\S+) (\S+) [([\w:/]+\s[+-]\d{4})] \"(\S+) (\S+) (\S+)\" (\d{3}) (\d+)";

我们如何对DataFrame的每一行执行计算,比如将每个日志条目与上面的s_apacheRx进行匹配?答案是Spark SQL。

2.4 Spark SQL

    Spark SQL为处理DataFrame中存储的结构化数据提供了许多很棒的函数。Spark SQL最流行的特性之一是UDF(用户自定义函数)。我们定义它们接受的输入类型和产生的输出类型,然后定义它们如何执行计算或筛选。
    让我们定义一个新的UDF GeneralReg,将每个日志条目与s_apacheRx 进行匹配。我们的UDF需要一个Apache日志条目,它是一个字符串,并根据日志是否与s_apacheRx匹配返回true或false:

spark.Udf().Register<string, bool>("GeneralReg", log => Regex.IsMatch(log, s_apacheRx));
    除了UDF之外,Spark SQL还提供了编写SQL调用来分析我们的数据的能力,通常编写一个SQL调用来将UDF应用于每一行数据:

DataFrame generalDf = spark.Sql("SELECT logs.value, GeneralReg(logs.value) FROM Logs");
    这个SQL调用测试generalDf的每一行,以确定它是否是一个有效且完整的日志。
    我们可以使用.Filter()只在数据中保留完整的日志条目,然后使用.Show()显示新筛选的DataFrame:

generalDf = generalDf.Filter(generalDf["GeneralReg(value)"]);
generalDf.Show();
    现在我们已经完成了一些初始数据准备,我们可以继续过滤和分析我们的数据。让我们从以10开头的IP地址中查找与垃圾邮件相关的日志条目:

// Choose valid log entries that start with 10
spark.Udf().Register<string, bool>(
"IPReg",
log => Regex.IsMatch(log, "^(?=10)")); generalDf.CreateOrReplaceTempView("IPLogs"); // Apply UDF to get valid log entries starting with 10
DataFrame ipDf = spark.Sql(
"SELECT iplogs.value FROM IPLogs WHERE IPReg(iplogs.value)");
ipDf.Show(); // Choose valid log entries that start with 10 and deal with spam
spark.Udf().Register<string, bool>(
"SpamRegEx",
log => Regex.IsMatch(log, "\\b(?=spam)\\b")); ipDf.CreateOrReplaceTempView("SpamLogs"); // Apply UDF to get valid, start with 10, spam entries
DataFrame spamDF = spark.Sql(
"SELECT spamlogs.value FROM SpamLogs WHERE SpamRegEx(spamlogs.value)");
    最后,让我们计算最后清理的数据集中GET请求的数量。.NET for Spark的神奇之处在于,我们可以将其与其他流行的.NET功能结合起来编写我们的应用程序。我们将使用LINQ分析Spark应用程序中的数据:

int numGetRequests = spamDF
.Collect()
.Where(r => ContainsGet(r.GetAs<string>("value")))
.Count();
    在上面的代码中,ContainsGet()使用regex匹配检查GET请求:

// Use regex matching to group data
// Each group matches a column in our log schema
// i.e. first group = first column = IP
public static bool ContainsGet(string logLine)
{
Match match = Regex.Match(logLine, s_apacheRx); // Determine if valid log entry is a GET request
if (match.Success)
{
Console.WriteLine("Full log entry: '{0}'", match.Groups[].Value); // 5th column/group in schema is "method"
if (match.Groups[].Value == "GET")
{
return true;
}
} return false; }
    作为最后一步,我们调用Spark.Stop()关闭底层的Spark会话和Spark上下文。

3 运行程序

    需要使用spark-submit命令,该命令将提交您的应用程序以便在Apache Spark上运行。
    spark-submit命令包括:
      • –class,用于调用DotnetRunner
      • –master, 用于定义是本地还是云端的Spark提交
      • Path,Microsoft.Spark jar的路径
      • 应用程序的其他参数或依赖项,例如输入文件或包含UDF定义的dll的路径。
    运行应用程序的Windows命令示例如下:

spark-submit --class org.apache.spark.deploy.dotnet.DotnetRunner --master local /path/to/microsoft-spark-<version>.jar dotnet /path/to/netcoreapp<version>/LoggingApp.dll

4 .NET for Apache Spark总结

    这里只是一个简单的介绍,.NET for Apache Spark是一个免费、开源、跨平台的大数据分析框架,更多的功能需要读者进一步深入学习。

名词解释

Ad-hoc Query

    Ad-hoc Query是一种“on-the-fly”的特殊查询。也就是说,在每一个查询操作被执行之前,查询的目标对象是不明确的。
    比如下面这样一条语句:
var mySqlQuery = "SELECT * FROM table WHERE id = " + std_name;

每次执行这一条查询的时候返回的结果都可能会不一样,这取决于std_name的值。

原文链接

【译】Using .NET for Apache Spark to Analyze Log Data的更多相关文章

  1. Introducing DataFrames in Apache Spark for Large Scale Data Science(中英双语)

    文章标题 Introducing DataFrames in Apache Spark for Large Scale Data Science 一个用于大规模数据科学的API——DataFrame ...

  2. Using Apache Spark and MySQL for Data Analysis

    What is Spark Apache Spark is a cluster computing framework, similar to Apache Hadoop. Wikipedia has ...

  3. Apache Spark 2.2.0 中文文档

    Apache Spark 2.2.0 中文文档 - 快速入门 | ApacheCN Geekhoo 关注 2017.09.20 13:55* 字数 2062 阅读 13评论 0喜欢 1 快速入门 使用 ...

  4. Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN

    Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Datasets(数据集) RDD 操作 基础 传递 Functio ...

  5. Structured streaming: A Declarative API for Real-Time Applications in Apache Spark(Abstract: 原文+注译)

    题目中文:结构化流: Apache spark中,处理实时数据的声明式API Abstract with the ubiquity of real-time data, organizations n ...

  6. 使用Apache Spark 对 mysql 调优 查询速度提升10倍以上

    在这篇文章中我们将讨论如何利用 Apache Spark 来提升 MySQL 的查询性能. 介绍 在我的前一篇文章Apache Spark with MySQL 中介绍了如何利用 Apache Spa ...

  7. Apache Spark 2.2.0 中文文档 - Spark SQL, DataFrames and Datasets Guide | ApacheCN

    Spark SQL, DataFrames and Datasets Guide Overview SQL Datasets and DataFrames 开始入门 起始点: SparkSession ...

  8. Apache Spark 2.2中基于成本的优化器(CBO)(转载)

    Apache Spark 2.2最近引入了高级的基于成本的优化器框架用于收集并均衡不同的列数据的统计工作 (例如., 基(cardinality).唯一值的数量.空值.最大最小值.平均/最大长度,等等 ...

  9. How-to: Tune Your Apache Spark Jobs (Part 1)

    Learn techniques for tuning your Apache Spark jobs for optimal efficiency. When you write Apache Spa ...

随机推荐

  1. 常用vscode 插件第一季

    VSCODE 常用插件第一季 1.chinese 此插件中文(简体)语言包为 VS Code 提供本地化界面. https://marketplace.visualstudio.com/items?i ...

  2. linq 高集成化数据访问技术

    一:  新建名为linq的项目 创建 linq 1 在项目里添加文件夹 App_Code; 2 在文件夹(App_Code) 添加  名为db的    Linq To Sql 类  :一个Linq T ...

  3. PHP代码审计理解(一)----Metinfo5.0变量覆盖

    0x01 漏洞简介 这个漏洞是metinfo5.0变量覆盖漏洞,并且需要结合文件包含.我使用的cms版本是5.3,事实上已经修复了这个漏洞(5.0的cms源码已经找不到了哈),但是我们可以借他来学习理 ...

  4. Springboot:thymeleaf模板(八)

    存放位置:resources\templates 访问方式:通过Controller请求访问,不可直接访问(相当于web项目的WEB-INF目录) 环境依赖: <!--thymeleaf模板支持 ...

  5. 微信自动关闭内置浏览器页面,返回公众号窗口 WeixinJSBridge.call('closeWindow')

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 微信小程序弹出层动画特效

    .rules_modal_cont{ height:800rpx; width:200rpx; -webkit-animation: showZeroAlert .3s; animation: sho ...

  7. Inno Setup, Pascal 字符串带双引号如何写

    Windows 的路径中如果有空格,就需要用双引号括起来.只能填 ASCII-Code-Number (decimal),不能用一般的 escape 方法. # + path + # 查询这个表的第一 ...

  8. Java第一阶段作业总结

    目录 0.前言 1.作业过程总结 2.OO设计心得 3.测试的理解与实践 4.课程收获 5.对课程的建议 前言 本次博客针对第一阶段的三次作业发表总结,作业要求主要是初学者对于Java的基本语法.用法 ...

  9. KVM虚拟化平台环境部署

    一:安装依赖包 二:配置网卡 三:配置环境 实验环境: KVM01   192.168.200.10 关闭防火墙及相关的安全机制 [root@KVM01 ~]# systemctl stop fire ...

  10. 第十二章Linux文件系统与日志

    1.inode 包含文件的元信息(1)inode 内容:文件的字节数.拥有者的 UID.GID.文件的读写执行权限.时间戳等,但不包含文件名.文件名是储存在目录的目录项中.(2)查看文件的 inode ...