大数据技术与Hadoop生态系统

大数据技术是现代社会各领域广泛使用的一个术语,无论是农业、研究还是制造业,这项技术都发挥着重要作用。大数据领域主要关注如何分析、系统提取信息或以其他方式处理那些太大或太复杂而无法用传统数据处理应用程序处理的数据集。

大数据通常具有以下特征:

体量(Volume):体量指的是需要处理的庞大数据量。

速度(Velocity):数据到达的速度,如实时处理。

真实性(Veracity):真实性指的是数据的质量,这对于生成分析报告等非常重要。

多样性(Variety):它意味着不同类型的数据,如结构化数据、非结构化数据和半结构化数据。

为了处理大量数据,首先需要在某个地方存储或转储数据。因此,解决方案是Hadoop分布式文件系统(HDFS)。Hadoop支持主从架构,它是一种分布式系统,可以并行处理数据。Hadoop由1个主节点和多个从节点组成。

命名节点规则:对于存储的每个数据块,都有2份副本。一份在不同的数据节点,第二份在另一个数据节点。这样解决了容错问题。命名节点包含以下信息:

1) 存储在数据节点的文件的元数据信息。元数据包括2个文件——FsImage和EditLogs。FsImage包含自命名节点启动以来文件系统的完整状态。EditLogs包含对文件系统所做的最近修改。

2) 文件块存储在数据节点的位置。

3) 文件的大小。

数据节点包含实际数据。因此,HDFS支持数据完整性。存储的数据通过检查其校验和来检查是否正确。如果检测到任何故障,它会报告给命名节点。因此,它创建相同数据的额外副本,并删除损坏的副本。

HDFS包括辅助守护进程的二级命名节点。它与主命名节点同时工作,不是备份命名节点。它不断地从命名节点的RAM中读取所有文件系统和元数据到硬盘。它负责将EditLogs与来自命名节点的FSImage合并。

因此,HDFS就像一个数据仓库,可以在其中转储任何类型的数据。处理这些数据需要Hadoop工具,如Hive(用于处理结构化数据)、HBase(用于处理非结构化数据)等。Hadoop支持“写一次读多次”的概念。

使用Scala语言处理大数据

让以一个例子来理解如何使用Scala语言处理大量数据并执行许多转换。

A) 设置Eclipse IDE和Scala环境。

下载Eclipse IDE的链接:

需要根据计算机要求下载Eclipse IDE。启动Eclipse IDE后,会看到这样的屏幕。

转到Help -> Eclipse Marketplace -> Search -> Scala-Ide -> Install。安装后,在Eclipse IDE中选择Open Perspective -> Scala,将获得所有Scala组件以在IDE中使用。

在Eclipse中创建一个新项目,并更新pom文件,步骤如下:

通过右键单击Project -> Build Path -> Configure Build Path更改Scala库版本。

通过右键单击Project -> Maven -> Update Maven Project -> Force Update of Snapshots/Releases更新项目。这样pom文件就保存了,并且为项目下载了所有所需的依赖项。

之后下载带有Hadoopwinutils的Spark版本,并将其放置在bin路径中。按照此路径完成设置:

B) 创建Spark会话——2种类型。

Spark会话是创建RDD、DataFrame、Dataset的入口点或起点。要创建任何Spark应用程序,首先需要一个Spark会话。

Spark会话可以是以下两种类型:

a) 普通Spark会话:

b) 用于Hive环境的Spark会话:

enableHiveSupport()——启用Hive支持,包括连接到持久的Hive元数据存储、支持Hive serdes和Hive用户定义函数。

C) RDD(弹性分布式数据集)的创建和将RDD转换为DataFrame:

在创建Spark会话的第一步之后,可以自由地创建RDD、Dataset或DataFrame。这些是可以用来存储大量数据的数据结构。

弹性意味着容错,因此它们可以重新计算由于节点故障而丢失或损坏的分区。

分布式意味着数据分布在多个节点上(并行处理的力量)。

数据集:可以外部加载的数据,可以是任何形式,即JSON、CSV或文本文件。

RDD的特点包括:

a) 内存计算:在对数据执行转换后,结果存储在RAM中而不是磁盘上。因此,大型数据集不能由RDD使用。解决方案是使用DataFrame/Dataset而不是使用RDD。

b) 延迟评估:这意味着仅在需要值时才评估执行的转换操作。

c) 容错:Spark RDD是容错的,因为它们跟踪数据血统信息,以便在失败时自动重建丢失的数据。

d) 不可变性:不可变(不可更改)的数据始终可以安全地跨多个进程共享。可以随时重新创建RDD。

e) 分区:意味着数据被分割,因此每个分区可以由不同的节点执行,从而使数据处理变得更快。

f) 持久性:用户可以选择他们需要使用的RDD,并为它们选择存储策略。

g) 粗粒度操作:这意味着当数据被划分为不同的集群以进行不同的操作时,可以一次性对整个集群应用转换,而不是单独对不同的分区应用。

D) DataFrame的使用和执行转换:

将RDD转换为DataFrame时,需要添加import spark.implicits._在spark会话之后。

DataFrame可以以多种方式创建。让看看可以对DataFrame应用的不同转换。

步骤1:创建数据框架:

步骤2:对DataFrame执行不同类型的转换:

a) 选择:选择用户需要的数据框架的所需列。

Input1.select(“arrg_id”, “da_proc_id”).show()

b) selectExpr:选择所需的列,并同时重命名列。

Input2.selectExpr(“arrg_id11”,”prd_src_sys_id11 as prd_src_new “,”da_proc_id11”).show()

c) withColumn:withColumns帮助在选定的数据框架中添加一个新列,用户希望在其中包含特定值。

Input1.withColumn(“New_col”,lit(null))

d) withColumnRenamed:它重命名用户需要的数据框架的列。

Input1.withColumnRenamed(“da_proc_id”, “da_proc_id_newname”)

e) drop:删除用户不想要的列。

Input2.drop(“arrg_id11″,”prd_src_sys_id11″,”da_proc_id11”)

f) Join:将两个数据框架连接在一起,使用两个数据框架的连接键。

Input1.join(Input2, Input1.col(“arrg_id”) === Input2.col(“arrg_id11″),”right”).withColumn(“prd_src_sys_id”, lit(null))

g) 聚合函数:一些聚合函数包括

* 计数:它给出特定列的计数或整个数据框架的计数。

println(Input1.count())

* 最大值:它给出根据特定条件的列的最大值。

input2.groupBy(“da_proc_id”).max(“arrg_id”).withColumnRenamed(“max(arrg_id)”,“arrg_id_max”)

* 最小值:它给出数据框架列的最小值。

h) 过滤:通过执行特定条件来过滤数据框架的列。

i) printSchema:它提供详细信息,如列名、列的数据类型以及列是否可以为空。

j) 联合:它结合两个数据框架的值,前提是两个数据框架的列名相同。

E)Hive

Hive是大数据中最常用的数据库之一。它是一种关系数据库,数据以表格格式存储。Hive的默认数据库是derby。Hive处理结构化和半结构化数据。对于非结构化数据,首先在Hive中创建一个表并将数据加载到表中,使其成为结构化数据。Hive支持SQL的所有基本数据类型。

Hive支持两种类型的表:

a) 托管表:它是Hive中的默认表。当用户在Hive中创建表而没有指定为外部表时,将默认创建一个内部表在HDFS的特定位置。

默认情况下,内部表将在类似于/user/hive/warehouse目录的HDFS目录中创建。可以通过在表创建期间使用location属性来覆盖默认位置。

如果删除托管表或分区,与该表相关的表数据和元数据将从HDFS中删除。

b) 外部表:外部表存储在仓库目录之外。它们可以访问存储在远程HDFS位置或Azure存储卷等源中的数据。

每当删除外部表时,只有与表相关的元数据会被删除,表数据保持不变。

可以通过在Hive创建表语句中指定EXTERNAL关键字来创建外部表。

创建外部表的命令。

检查创建的表是否为外部表的命令:

desc formatted <table_name>

F) 在Scala Eclipse中创建Hive环境:

步骤1:将Hive Maven依赖项添加到Eclipse的pom文件中。

步骤2:在会话构建器中添加带有enableHiveSupport的spark-session。

步骤3:创建数据库的命令

Spark.sqlContext.sql(“”” create database gfrrtnsg_staging “””)

执行此命令时,会在本地系统的Hive目录中创建一个数据库。

步骤4:在Eclipse中创建表的命令

spark.sqlContext.sql(“”” LOAD DATA INPATH ‘C:sampledata OVERWRITE INTO TABLE frzn_arrg_link “””)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485