大数据处理:Hadoop与Spark实战
1. Hadoop处理《罗密欧与朱丽叶》文本
在大数据处理中,Hadoop是一个强大的工具。下面我们将使用Hadoop对《罗密欧与朱丽叶》的文本进行处理,统计单词长度的数量。
1.1 复制文件到Hadoop文件系统
要让Hadoop读取《罗密欧与朱丽叶》的文本内容,首先需要将文件复制到Hadoop的文件系统中。操作步骤如下:
1. 使用 ssh 登录到集群并访问其命令行,在命令提示符、终端或shell中执行以下命令,记得将 YourClusterName 替换为你的集群名称,同时会提示输入集群密码:
ssh sshuser@YourClusterName-ssh.azurehdinsight.net
- 对于Windows用户,如果
ssh无法正常工作,可以按照 此链接 的说明安装并启用它。安装完成后,注销并重新登录或重启系统以启用ssh。 - 使用以下Hadoop命令将文本文件复制到集群提供的
/example/data文件夹中:
hadoop fs -copyFromLocal RomeoAndJuliet.txt /example/data/RomeoAndJuliet.txt
1.2 运行MapReduce作业
现在可以在集群上运行《罗密欧与朱丽叶》文本的MapReduce作业,执行以下命令:
yarn jar /usr/hdp/current/hadoop-mapreduce-client/hadoop-streaming.jar \
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
-D mapred.text.key.comparator.options=-n \
-files length_mapper.py,length_reducer.py \
-mapper length_mapper.py \
-reducer length_reducer.py \
-input /example/data/RomeoAndJuliet.txt \
-output /example/wordlengthsoutput
命令参数说明:
| 参数 | 说明 |
| ---- | ---- |
| -files | 逗号分隔的文件名列表,Hadoop会将这些文件复制到集群的每个节点,以便在每个节点上本地执行。 |
| -mapper | 映射器脚本文件的名称。 |
| -reducer | 归约器脚本文件的名称。 |
| -input | 提供给映射器的输入文件或文件目录。 |
| -output | 输出将写入的HDFS目录,如果该文件夹已存在,将出现错误。 |
作业执行时,Hadoop会产生一些反馈信息,例如:
18/12/05 16:46:25 INFO mapred.FileInputFormat: Total input paths to process : 1
18/12/05 16:46:26 INFO mapreduce.JobSubmitter: number of splits:2
...
18/12/05 16:46:50 INFO mapreduce.Job: Job job_1543953844228_0025 completed successfully
1.3 查看单词计数结果
Hadoop MapReduce将输出保存到HDFS中,要查看实际的单词计数,需要在集群的HDFS中查看文件,执行以下命令:
hdfs dfs -text /example/wordlengthsoutput/part-00000
结果示例:
1
1140
2
3869
3
4699
4
5651
5
3668
6
2719
7
1624
8
1062
9
855
10
317
11
189
12
95
13
35
14
13
15
9
16
6
17
3
18
1
23
1
2. Spark简介
当处理真正的大数据时,性能至关重要。Hadoop适用于基于磁盘的批处理,但许多大数据应用需要比磁盘密集型操作更好的性能。Spark就是为了解决这些问题而开发的。
2.1 Spark历史与优势
Spark最初于2009年在加州大学伯克利分校开发,并由美国国防高级研究计划局(DARPA)资助。它最初是作为高性能机器学习的分布式执行引擎而创建的。Spark使用内存架构,在处理某些工作负载时比Hadoop快达100倍,这使得许多公司开始用Spark取代Hadoop MapReduce。
2.2 Spark架构与组件
Spark可以独立运行在单台计算机上(通常用于学习和测试),也可以在集群上独立运行,或者使用各种集群管理器和分布式存储系统。它可以运行在Hadoop YARN、Apache Mesos、Amazon EC2和Kubernetes上,并支持许多分布式存储系统,如HDFS、Apache Cassandra、Apache HBase和Apache Hive。
Spark的核心是弹性分布式数据集(RDD),它允许使用函数式编程技术处理分布式数据。与Hadoop不同,RDD通过驻留在内存中(仅在数据无法容纳在内存中时才使用磁盘)并避免数据复制来消除磁盘开销。Spark通过记录创建每个RDD的步骤来处理容错问题,因此如果集群节点发生故障,它可以重建给定的RDD。
Spark还提供了Spark Streaming用于实时数据处理,Spark DataFrames类似于pandas DataFrames,可用于将RDD视为命名列的集合,以及Spark SQL用于对分布式数据执行查询,还有Spark MLlib用于执行机器学习算法。
2.3 Spark提供商
Hadoop提供商通常也提供Spark支持,此外还有像Databricks这样的Spark特定供应商。Databricks提供了一个围绕Spark构建的“零管理云平台”,其网站也是学习Spark的优秀资源。Databricks有付费平台,可运行在Amazon AWS或Microsoft Azure上,同时还提供免费的Databricks Community Edition,是开始使用Spark和Databricks环境的好方法。
3. 使用Docker和Jupyter Docker Stacks运行Spark
为了方便地运行Spark应用程序,我们可以使用Docker和Jupyter Docker Stacks。
3.1 Docker概述
Docker是一种将软件打包成容器(也称为镜像)的工具,这些容器包含了在不同平台上执行该软件所需的一切。对于一些需要复杂设置和配置的软件包,有许多预先存在的Docker容器可以免费下载并在本地桌面或笔记本电脑上执行。Docker还有助于研究和分析研究的可重复性,你可以创建自定义的Docker容器,配置好研究中使用的每个软件和库的版本,以便其他人可以重现你的环境和工作。
3.2 安装Docker
不同操作系统的安装方式如下:
- Windows 10 Pro或macOS :可以在 此链接 安装Docker。在Windows 10 Pro上,需要允许“Docker for Windows.exe”安装程序对系统进行更改,当Windows询问是否允许安装程序进行更改时,点击“是”。
- Windows 10 Home :需要使用Virtual Box,具体说明见 此链接 。
- Linux :应按照 此链接 的说明安装Docker Community Edition。
同时,可以阅读 此指南 了解Docker的一般概述。
3.3 Jupyter Docker Stacks
Jupyter Notebooks团队为常见的Python开发场景预配置了几个Jupyter“Docker栈”容器。我们将使用 jupyter/pyspark-notebook Docker栈,它预配置了在计算机上创建和测试Apache Spark应用所需的一切。
运行Jupyter Docker栈的步骤如下:
1. 确保JupyterLab当前未在计算机上运行。
2. 下载并运行 jupyter/pyspark-notebook Docker栈,执行以下命令,Windows用户需要将 \ 替换为 ^ :
docker run -p 8888:8888 -p 4040:4040 -it --user root \
-v fullPathToTheFolderYouWantToUse:/home/jovyan/work \
jupyter/pyspark-notebook:14fdfbf9cfc1 start.sh jupyter lab
第一次运行该命令时,Docker会下载名为 jupyter/pyspark-notebook:14fdfbf9cfc1 的Docker容器,该容器接近6GB,初始下载时间取决于你的互联网连接速度。
3.4 打开JupyterLab
容器下载并运行后,在命令提示符、终端或shell窗口中会看到类似以下的语句:
Copy/paste this URL into your browser when you connect for the first time, to login with a token:
http://(bb00eb337630 or 127.0.0.1):8888/?token= 9570295e90ee94ecef75568b95545b7910a8f5502e6f5680
复制长十六进制字符串,然后在浏览器中打开 http://localhost:8888/lab ,将令牌粘贴到“密码或令牌”字段,点击“登录”即可进入JupyterLab界面。如果不小心关闭了浏览器,可访问 http://localhost:8888/lab 继续会话。
3.5 访问Docker容器的命令行
要访问Docker容器的命令行,可按以下步骤操作:
1. 打开一个单独的Anaconda命令提示符、终端或shell,使用以下命令列出当前运行的Docker容器:
docker ps
输出示例:
CONTAINER ID IMAGE COMMAND
CREATED STATUS PORTS
NAMES
f54f62b7e6d5 jupyter/pyspark-notebook:14fdfbf9cfc1 "tini -g -- /bin/bash" 2 minutes ago Up 2 minutes 0.0.0.0:8888->8888/tcp
friendly_pascal
- 执行以下命令访问容器的命令行,将
container_name替换为运行容器的名称:
docker exec -it container_name /bin/bash
在容器中,可以安装Python包,例如安装NLTK和TextBlob:
conda install -c conda-forge nltk textblob
3.6 停止和重启Docker容器
为了保留之前安装的库,需要记录容器名称,使用以下命令停止和重启容器:
- 停止容器:
docker stop container_name
- 重启容器:
docker restart container_name
此外,Docker还提供了一个名为Kitematic的GUI应用程序,可用于管理容器,包括停止和重启它们,可从 此链接 获取该应用程序。
4. 使用Spark进行单词计数
下面我们将使用Spark的过滤、映射和归约功能来实现一个简单的单词计数示例,统计《罗密欧与朱丽叶》中的单词数量。
4.1 加载NLTK停用词
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
4.2 配置SparkContext
from pyspark import SparkConf
configuration = SparkConf().setAppName('RomeoAndJulietCounter').setMaster('local[*]')
from pyspark import SparkContext
sc = SparkContext(conf=configuration)
4.3 读取文本文件并映射为单词
from textblob.utils import strip_punc
tokenized = sc.textFile('RomeoAndJuliet.txt') \
.map(lambda line: strip_punc(line, all=True).lower()) \
.flatMap(lambda line: line.split())
4.4 移除停用词
filtered = tokenized.filter(lambda word: word not in stop_words)
4.5 统计每个剩余单词的数量
from operator import add
word_counts = filtered.map(lambda word: (word, 1)).reduceByKey(add)
4.6 筛选出现次数大于等于60的单词
filtered_counts = word_counts.filter(lambda item: item[1] >= 60)
4.7 排序并显示结果
from operator import itemgetter
sorted_items = sorted(filtered_counts.collect(), key=itemgetter(1), reverse=True)
max_len = max([len(word) for word, count in sorted_items])
for word, count in sorted_items:
print(f'{word:>{max_len}}: {count}')
结果示例:
romeo: 298
thou: 277
juliet: 178
thy: 170
nurse: 146
综上所述,通过Hadoop和Spark,我们可以高效地处理大数据,实现文本分析等任务。无论是Hadoop的MapReduce作业,还是Spark的函数式编程处理方式,都为大数据处理提供了强大的工具。同时,使用Docker和Jupyter Docker Stacks可以方便地搭建和运行这些应用程序。
大数据处理:Hadoop与Spark实战
5. 技术对比与总结
在大数据处理领域,Hadoop和Spark是两款备受关注的技术,下面我们对它们进行详细对比,并总结各自的特点和适用场景。
5.1 Hadoop与Spark对比
| 对比项 | Hadoop | Spark |
|---|---|---|
| 处理性能 | 基于磁盘的批处理,处理速度相对较慢,适合大规模数据的离线处理 | 使用内存架构,处理速度快,在某些工作负载上比Hadoop快达100倍,适合实时和近实时处理 |
| 数据存储 | 通过HDFS进行数据存储,并使用复制来实现容错,增加了磁盘开销 | 核心是弹性分布式数据集(RDD),驻留在内存中,仅在必要时使用磁盘,避免了数据复制,减少了磁盘开销 |
| 任务执行 | MapReduce作业需要将任务拆分为映射和归约阶段,执行过程相对复杂 | 提供了函数式编程接口,如映射、过滤和归约,代码简洁,易于编写和维护 |
| 适用场景 | 大规模数据的离线处理,如数据仓库、数据分析等 | 实时数据处理、机器学习、交互式查询等场景 |
5.2 总结
Hadoop和Spark各有优势,在实际应用中,需要根据具体的业务需求和数据特点来选择合适的技术。如果处理的是大规模的离线数据,对处理速度要求不高,那么Hadoop是一个不错的选择;如果需要实时处理数据,或者进行机器学习等复杂计算,那么Spark更适合。
同时,Docker和Jupyter Docker Stacks为我们提供了便捷的开发和运行环境,使得我们可以快速搭建和测试大数据应用程序。通过使用这些工具,我们可以更加高效地进行大数据处理和分析。
6. 应用拓展与未来展望
随着大数据技术的不断发展,Hadoop和Spark的应用场景也在不断拓展。下面我们探讨一下它们的应用拓展方向以及未来的发展趋势。
6.1 应用拓展
- 物联网(IoT) :随着物联网设备的普及,产生了大量的实时数据。Hadoop和Spark可以用于处理和分析这些数据,例如对传感器数据进行实时监测和预警。
- 人工智能(AI) :Spark的机器学习库(Spark MLlib)可以用于训练和部署人工智能模型,如深度学习、自然语言处理等。结合Hadoop的大规模数据存储能力,可以处理海量的训练数据。
- 金融科技(Fintech) :在金融领域,需要对大量的交易数据进行实时分析和风险评估。Hadoop和Spark可以用于构建实时数据分析平台,帮助金融机构做出更明智的决策。
6.2 未来展望
- 性能优化 :未来,Hadoop和Spark可能会进一步优化性能,提高处理速度和资源利用率。例如,采用更高效的算法和数据结构,以及更好的内存管理技术。
- 集成与融合 :随着大数据生态系统的不断发展,Hadoop和Spark可能会与其他技术进行更紧密的集成,如与云计算、容器化技术等结合,提供更加便捷和高效的大数据解决方案。
- 智能化发展 :随着人工智能和机器学习的发展,Hadoop和Spark可能会引入更多的智能化功能,如自动调优、智能预测等,提高大数据处理的自动化程度。
7. 技术实践流程总结
为了帮助读者更好地理解和应用上述技术,下面我们总结了使用Hadoop和Spark进行大数据处理的实践流程。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(选择技术):::process
B --> C{Hadoop or Spark}:::decision
C -->|Hadoop| D(配置集群):::process
C -->|Spark| E(安装Docker和Jupyter Docker Stacks):::process
D --> F(复制文件到HDFS):::process
E --> G(运行Jupyter Docker栈):::process
F --> H(运行MapReduce作业):::process
G --> I(打开JupyterLab):::process
H --> J(查看单词计数结果):::process
I --> K(编写Spark代码):::process
K --> L(加载数据和处理):::process
L --> M(执行单词计数):::process
J --> N([结束]):::startend
M --> N
实践流程步骤如下:
1. 选择技术 :根据业务需求和数据特点,选择Hadoop或Spark。
2. Hadoop流程 :
- 配置集群,确保集群正常运行。
- 将数据文件复制到HDFS中。
- 运行MapReduce作业进行数据处理。
- 查看处理结果。
3. Spark流程 :
- 安装Docker和Jupyter Docker Stacks。
- 运行Jupyter Docker栈,启动Spark环境。
- 打开JupyterLab,编写Spark代码。
- 加载数据并进行处理,执行单词计数等任务。
通过以上流程,我们可以使用Hadoop和Spark完成大数据处理的基本任务。在实际应用中,可以根据具体需求进行扩展和优化。
总之,Hadoop和Spark作为大数据处理的重要技术,为我们提供了强大的工具和解决方案。通过合理选择和应用这些技术,结合Docker和Jupyter Docker Stacks等工具,我们可以更加高效地处理和分析大数据,为企业和社会创造更大的价值。未来,随着技术的不断发展,我们有理由相信大数据处理技术将在更多领域发挥重要作用。
超级会员免费看
322

被折叠的 条评论
为什么被折叠?



