Python海量数据处理之_Hadoop&Spark

1. 说明

 前篇介绍了安装和使用Hadoop,本篇将介绍Hadoop+Spark的安装配置及如何用Python调用Spark。
 当数据以TB,PB计量时,用单机处理数据变得非常困难,于是使用Hadoop建立计算集群处理海量数据,Hadoop分为两部分,一部分是数据存储HDFS,另一部分是数据计算MapReduce。MapReduce框架将数据处理分成map,reduce两段,使用起来比较麻烦,并且有一些限制,如:数据都是流式的,且必须所有Map结束后才能开始Reduce。我们可以引入Spark加以改进。
 Spark的优点在于它的中间结果保存在内存中,而非HDFS文件系统中,所以速度很快。用Scala 语言可以像操作本地集合对象一样轻松地操作分布式数据集。虽然它支持中间结果保存在内存,但集群中的多台机器仍然需要读写数据集,所以它经常与HDFS共同使用。因此,它并非完全替代Hadoop。
 Spark的框架是使用Scala语言编写的,Spark的开发可以使用语言有:Scala、R语言、Java、Python。

2. Scala

 Scala是一种类似java的编程语言,使用Scala语言相对来说代码量更少,调用spark更方便,也可以将它和其它程序混用。
 在不安装scala的情况下,启动hadoop和spark,python的基本例程也可以正常运行。但出于进一步开发的需要,最好安装scala。

(1) 下载scala

http://www.scala-lang.org/download/
 我下载的是与spark中一致的2.11版本的非源码tgz包

(2) 安装
$ cd /home/hadoop #用户可选择安装的文件夹
$ tar xvzf tgz/scala-2.11.12.tgz
$ ln -s scala-2.11.12/ scala

在.bashrc中加入
export PATH=/home/hadoop/scala/bin:$PATH

3. 下载安装Spark

(1) 下载spark

http://spark.apache.org/downloads.html
 我下载的版本是:spark-2.2.1-bin-hadoop.2.7.tgz

(2) 安装spark
$ cd /home/hadoop #用户可选择安装的文件夹
$ tar xvzf spark-2.2.1-bin-hadoop2.7.tgz
$ ln -s spark-2.2.1-bin-hadoop2.7/ spark

在.bashrc中加入
export SPARK_HOME=/home/hadoop/spark
export PATH=$SPARK_HOME/bin:$PATH
(3) 配置文件

 不做配置,pyspark可以在本机上运行,但不能使用集群中其它机器。配置文件在$SPARK_HOME/conf/目录下。

i. 配置spark-env.sh

$ cd $SPARK_HOME/conf/
$ cp spark-env.sh.template spark-env.sh
按具体配置填写内容
export SCALA_HOME=/home/hadoop/scala
export JAVA_HOME=/exports/android/jdk/jdk1.8.0_91/
export SPARK_MASTER_IP=master
export SPARK_WORKER_MEMORY=1g
export HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop/

ii. 设置主从服务器slave

$ cp slaves.template slaves 
在其中列出从服务器地址,单机不用设

iii. 设置spark-defaults.conf

$ cp conf/spark-defaults.conf.template conf/spark-defaults.conf
按具体配置填写内容
spark.master                     spark://master:7077
spark.eventLog.enabled           false
spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.driver.memory              1g
spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
(4) 启动

 运行spark之前,需要运行hadoop,具体见之前的Hadoop文档

$ $SPARK_HOME/sbin/start-all.sh

 该脚本启动了所有master和workers,在本机用jps查看,增加了Worker和Master,

4. 命令行调用

 下面我们来看看从程序层面如何使用Spark

(1) 准备工作

 在使用相对路径时,系统默认是从hdfs://localhost:9000/中读数据,因此需要先把待处理的本地文件复制到HDFS上,常用命令见之前的Hadoop有意思。

$ hadoop fs -mkdir -p /usr/hadoop
$ hadoop fs -copyFromLocal README.md /user/hadoop/
(2) Spark命令行
$ pyspark
>>> textFile = spark.read.text("README.md")
>>> textFile.count() # 返回行数
>>> textFile.first() # 返回第一行
>>> linesWithSpark = textFile.filter(textFile.value.contains("Spark")) # 返回所有含Spark行的数据集

5. 程序

(1) 实现功能

 统计文件中的词频

(2) 代码

 这里使用了spark自带的例程 /home/hadoop/spark/examples/src/main/python/wordcount.py,和之前介绍过的hadoop程序一样,同样是实现的针对key,value的map,reduce,一个文件就完成了,看起来更简徢更灵活,像是hadoop自带MapReduce的加强版。具体内容如下:

from __future__ import print_function

import sys 
from operator import add 

from pyspark.sql import SparkSession

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: wordcount <file>", file=sys.stderr)
        exit(-1)

    spark = SparkSession\
        .builder\
        .appName("PythonWordCount")\
        .getOrCreate()

    lines = spark.read.text(sys.argv[1]).rdd.map(lambda r: r[0])
    counts = lines.flatMap(lambda x: x.split(' ')) \
                  .map(lambda x: (x, 1)) \
                  .reduceByKey(add)
    output = counts.collect() # 收集结果
    for (word, count) in output:
        print("%s: %i" % (word, count))

    spark.stop()
(3) 运行

 spark-submit命令在$HOME_SPARK/bin目录下,之前设置了PATH,可以直接使用

$ spark-submit $SPARK_HOME/examples/src/main/python/wordcount.py /user/hadoop/README.md

 参数是hdfs中的文件路径。
 此时访问$SPARK_IP:8080端口,可以看到程序PythonWordCount正在hadoop中运行。

6. 多台机器上安装Spark以建立集群

 和hadoop的集群设置类似,同样是把整个spark目录复制集群中其它的服务器上,用slaves文件设置主从关系,然后启动$SPARK_HOME/sbin/start-all.sh。正常开启后可以通过网页查看状态:SparkMaster_IP:8080

7. 参考

(1) 官方帮助文档,具体见其python部分
http://spark.apache.org/docs/latest/quick-start.html
(2) Hadoop2.7.3+Spark2.1.0 完全分布式环境 搭建全过程
https://www.cnblogs.com/purstar/p/6293605.html


技术文章定时推送
请关注公众号:算法学习分享

近几年,云计算产业飞速发展,大数据处理技术也在不断成熟。与此同时,国内移动互联网市场规模不断扩大,用户数量已经超过5亿,并带来了海量的移动互联网流量数据。在此背景下,如何基于云计算大数据处理技术来承载海量网络数据处理业务,是一个非常有研究价值的课题。从移动互联网的现状来看,一方面移动数据流量猛增,给运营商带来了巨大的运营压力,需要其投入更多的资金来进行网络建设与升级,另一方面由于移动数据业务增长,传统的语音短信等业务出现下滑,导致运营商出现增量不增收的现状。因此研究如何使用通过流量通道获取到的海量移动互联网数据流量资源,对于电信运营商有着十分重大的意义。针对移动互联网流量数据的特性,本文对基于Hadoop海量网络数据处理平台的关键技术进行了深入研究。具体来说,本文的主要研究内容和创新点如下: 1.提出了一种针对移动互联网的海量数据处理架构针对移动互联网中海量网络数据处理业务的特点和存在的问题进行相关研究,提出了一种承载海量网络数据处理业务的分布式数据采集、存储和分析的安全云计算平台架构。整个平台包含数据采集,数据存储,数据处理及流量安全检测四个部分,可以完美解决移动互联网流量数据从数据的采集到最后的数据处理这一业务流程,通过引入云计算技术实现了对海量数据的存储及高效的数据处理,并基于云计算技术进行快速的异常流量检测来提高该平台的安全性。通过实验和具体的实际应用证明了该架构的可行性,且优化技术的应用对于提高海量网络数据处理业务的服务质量和安全性都有着明显的效果,后续基于该平台架构对其中的关键技术进行深入研究。 2.提出了一种基于分布式故障检测机制的高可靠数据采集框架数据采集是海量网络数据处理业务的首要工作,只有保证采集数据的完整和可信,后续进行的数据处理工作结果才有意义和价值。因此本文首先针对当前移动互联网流量数据采集的技术特点和难点进行了详细分析,包括分布式、高动态性、采集终端多样性、节点异构等等,然后针对这些数据采集的难度问题,本文引入了分布式网络故障检测技术,设计了一种适合移动互联网网络流量数据采集机制的分布式节点监控框架,该框架中提出了应用于数据采集的节点故障检测与处理算法和节点负载均衡算法,实现对海量网络数据采集框架的节点进行实时监控,并提供快速高效的故障检测机制,避免数据丢失。同时,该算法还实现了对节点的负载进行动态均衡,防止某些节点出现负载过重的情况。实验结果表明,该分布式节点监控框架,能够实现采集节点故障检测的快速处理和节点负载的动态均衡,保障移动互联网流量数据采集的可靠性和完整性。 3.提出了一种异构环境下的高效数据存储机制针对当前基于Hadoop海量网络数据处理平台中数据存储问题,本文对分布式数据存储技术进行深入研究,并结合服务器性能评估技术提出了一种适用于异构环境下的高效数据存储算法。该算法在存储数据时引入节点的性能参数,并将节点间的数据块分布与节点性能相关联。一方面,该算法可以提高大数据的读写效率,另一方面可以提高后续数据处理作业的运行速率,提高数据本地化的任务比率。最后实验证明,该算法可以有效地提高存储空间利用率和异构云计算集群数据处理性能。 4.提出了一种基于节点动态性能推断的任务分配算法海量网络数据的处理分析是海量网络数据处理平台最为核心的功能,数据处理的效率关系到整个海量网络数据处理平台的性能,因此对于该平台数据处理性能的优化是本文需要考虑的关键问题。当前,在构建云平台时,需要根据需求对云平台的硬件进行逐步扩容和升级,因此集群往往存在着硬件异构的情况。默认的数据处理计算主要是针对同构集群设计,在异构集群中性能会有很大程度的降低。因此结合当前海量网络数据处理平台的集群现状,本文研究并设计一种基于节点动态性能推断的任务分配算法。首先该算法在主节点中引入了节点动态性能推断模块,该模块采用基于指数平滑预测法实现对该集群中运行的作业历史数据学习分析,从而计算出集群中各个节点的计算能力。然后本文结合集群节点的性能指标对Reduce任务分配算法和推测性任务执行机制进行改进,实现集群可以动态选择最佳节点来运行数据处理任务。实验结果表明该算法可以有效地提高异构集群数据处理性能和集群的稳定性,减少异构集群的计算资源浪费,提高了云计算平台的资源利用率。5.一种基于分类器联合的分布式异常流量检测算法海量网络数据处理平台中存在着大量的实时数据流,该数据具有价值高、流量大等特点。同时,云计算平台本身具有强大的计算能力和存储资源,极易成为黑客的攻击目标。而云计算的环境极其复杂和多样化,具有跨地域、异构化、虚拟化等特点,使用传统的网络安全防御技术已经无法满足云计算的信息安全防御需求。因此在传统网络安全防御技术的基础上,本文需要进一步加强云平台的安全保障。针对当前海量网络数据处理平台的业务特点,本文对异常流量检测技术和云计算技术的结合进行了相关研究,提出了一种基于云计算技术的分类器联合检测算法。该算法联合了无监督的模糊K-均值分类算法和有监督的朴素贝叶斯分类算法,有效地避免单一分类算法在检测大流量数据时的缺陷,更为全面地对网络流量进行异常检测。同时,本文基于Mahout技术实现了这两个分类算法在MapReduce框架上的海量数据流的分类计算,极大地提高了异常流量检测的效率。最后通过实验证明,基于分类器联合的分布式异常流量检测算法可以快速有效地对海量网络数据流进行检测,并保持较高的检测准确率和较低的误报率。该算法可以有效地提高云平台的安全性,是对云平台网络安全防御体系的有效补充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值