在当今信息爆炸的时代,面临着海量数据的挑战。这些数据不仅规模庞大,而且增长速度前所未有。传统的数据管理工具已无法高效地存储和处理这些数据。因此,大数据领域应运而生,它涉及研究、分析以及持续从大量非结构化或结构化数据中提取信息的方法。
Python
因其内置的特性,无论是处理小型还是大型数据集,都能提供强大的支持。这些特性使得Python能够处理非结构化和非常规数据,这也是为什么数据科学家和大数据公司更倾向于选择Python进行数据处理。除了Python,还有其他技术也能高效处理大数据,比如Hadoop
和Spark
。
Hadoop
是存储和处理大数据的最佳解决方案。它通过HDFS
(Hadoop分布式文件系统)存储大量文件,无需指定任何模式。Hadoop具有高可扩展性,可以通过添加节点来增强性能。即使发生硬件故障,Hadoop也能确保数据的高可用性。
Spark
是处理大量结构化或非结构化数据集的另一个好选择。Spark旨在将尽可能多的数据存储在内存中,如果内存不足,数据可以溢出到磁盘。这意味着Spark将部分数据集存储在内存中,其余数据存储在磁盘上。
如今,数据科学家的首选语言是Python,而Hadoop和Spark都提供了Python API,这使得处理大数据变得更加容易,并且可以轻松访问大数据平台。
1. 开源:Python是一种开源编程语言,遵循OSI批准的开源许可证开发,使其可以免费使用和分发,甚至用于商业用途。Python是一种通用的高级解释型语言,不需要编译即可运行。一个称为解释器的程序可以在几乎任何类型的系统上运行Python代码,这意味着开发者可以修改代码并快速看到结果。
2. 易学:Python非常容易学习,就像英语一样。它的语法和代码对初学者来说简单易懂。Python有很多应用,如开发Web应用程序、数据科学、机器学习等。Python允许用比其他编程语言更少的代码行编写程序。Python因其简单性而迅速流行。
3. 数据处理库:在数据处理方面,Python拥有丰富的工具和一系列好处。作为一种开源语言,Python易于学习,并且持续改进。Python包含一系列有用的数据处理库,并且可以与其他语言(如Java)以及现有结构集成。Python在库方面更加丰富,增强了其功能。
4. 与Hadoop和Spark的兼容性:Hadoop框架是用Java语言编写的;然而,Hadoop程序可以用Python或C++语言编写。可以编写MapReduce程序,而无需将代码翻译成Java jar文件。Spark提供了一个名为PySpark的Python API,由Apache Spark社区发布,以支持Python与Spark的集成。使用PySpark,可以简单地在Python编程语言中集成和使用RDD。
5. 速度和效率:Python是一种功能强大且高效的高级编程语言。无论是开发应用程序还是通过数据科学解决任何业务问题,Python都能满足这些需求。Python在优化开发者的生产力和效率方面一直表现出色。可以快速创建一个程序来解决业务问题并满足实际需求。然而,解决方案可能在快速发展的同时,无法达到优化的Python性能。
6. 可扩展性和灵活性:Python是机器学习和人工智能领域最受欢迎的语言,因为它的便利性。Python的灵活性还允许将Python代码工具化,使机器学习和人工智能的可扩展性成为可能,而无需深入了解分布式系统和许多侵入性代码更改。因此,机器学习和人工智能用户可以以最小的努力获得集群范围内的可扩展性优势。
Hadoop主要有以下两个组成部分:
Hadoop文件系统是基于分布式文件系统模型开发的。它运行在普通硬件上。与其他分布式系统相比,HDFS具有极高的容错性,并且是使用廉价硬件设计的。HDFS能够存储大量数据,并提供对这些数据的便捷访问。为了存储如此大量的数据,文件被存储在多个系统上。这些文件以冗余的方式存储,以防系统在故障情况下潜在的数据丢失。HDFS还使应用程序能够进行多进程处理。
Hadoop Streaming作为Python代码和基于Java的HDFS之间的桥梁,使能够无缝访问Hadoop集群并执行MapReduce任务。HDFS提供文件权限和认证。
Hadoop是一个基于Java的数据处理框架。让逐步在Google Colab中安装Hadoop。有两种方法,第一种是要在机器上安装Java,第二种是将在Google Colab中安装Java,因此无需在机器上安装Java。由于使用的是Google Colab,选择第二种方法来安装Hadoop:
# Install java
!apt-get install openjdk-8-jdk-headless -qq > /dev/null
#create java home variable
import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-3.0.0-bin-hadoop3.2"
# Step 1: Install Hadoop
#download hadoop
!wget https://downloads.apache.org/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz
#copying the hadoop file to user/local
!cp -r hadoop-3.3.0/ /usr/local/
# Step 2: Configure java Home variable
#finding the default Java path
!readlink -f /usr/bin/java | sed "s:bin/java::"
# Step 3: Run Hadoop
!/usr/local/hadoop-3.3.0/bin/hadoop
!mkdir ~/input
!cp /usr/local/hadoop-3.3.0/etc/hadoop/*.xml ~/input
!ls ~/input
!/usr/local/hadoop-3.3.0/bin/hadoop jar /usr/local/hadoop-3.3.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar grep ~/input ~/grep_example 'allowed[.]*'
现在,Google Colab已经准备好实现HDFS了。
MapReduce是一种与处理和生成大数据集相关的编程模型,它依赖于在集群上的并行、分布式算法规则。MapReduce程序由一个Map过程和一个Reduce技术组成,Map过程执行过滤和排序,而Reduce技术执行汇总操作。
MapReduce是一个数据处理框架,用于在集群上处理数据。它有两个连续的阶段:Map和Reduce。每个Map任务在数据的不同部分上操作。Map操作之后,Reducer在由Mapper在分布式数据节点上生成的数据上工作。MapReduce使用磁盘I/O来执行数据上的操作。
Apache Spark是一个开源的数据分析引擎,用于大规模处理结构化或非结构化数据。为了使用Python包括Spark功能,Apache Spark社区发布了一个名为PySpark的工具。Spark Python API(PySpark)向Python展示了Spark编程模型。使用PySpark,可以在Python编程语言中使用RDD。这要归功于一个名为Py4j的库,它们能够实现这一点。
弹性分布式数据集(RDD)的概念:
RDD执行的两种类型的操作:转换和动作。转换操作使用现有数据集创建新数据集。例如:Map、Filter、Join。动作在数据集上执行并返回值给驱动程序。例如:Reduce、Count、Collect、Save。如果内存不足,数据将像MapReduce一样写入磁盘。
# Install java
!apt-get install openjdk-8-jdk-headless -qq > /dev/null
#Install spark (change the version number if needed)
!wget -q https://archive.apache.org/dist/spark/spark-3.0.0/spark-3.0.0-bin-hadoop3.2.tgz
#Unzip the spark file to the current folder
!tar xf spark-3.0.0-bin-hadoop3.2.tgz
#Set your spark folder to your system path environment.
import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-3.0.0-bin-hadoop3.2"
#Install findspark using pip
!pip install -q findspark
#Spark for Python (pyspark)
!pip install pyspark
#importing pyspark
import pyspark
#importing sparksessio
from pyspark.sql import SparkSession
#creating a sparksession object and providing appName
spark=SparkSession.builder.appName("local[*]").getOrCreate()
#printing the version of spark
print("Apache Spark version: ", spark.version)