基于RDD实现简单的WordCount程序
写在前面
因为觉得自己的代码量实在是太少了,所以,想着,每周至少写5个小的demo程序。现在的想法是,写一些Spark,Storm,MapReduce,Flume,kafka等等单独或组合使用的一些小的Demo。
然后,我会尽力记录好,自己编码过程中遇到的问题,方便自己巩固复习。
废话不多说,我们直接干吧。
开发环境
本地开发
| 工具 | 版本 |
|---|---|
| Spark | 2.2.0 |
| Scala | 2.11.8 |
| Sbt | 1.2.8 项目构建管理,类似maven |
集群提交,启动的是Spark集群
| 工具 | 版本 |
|---|---|
| Spark | 2.2.0 |
| Hadoop | cdh-2.6.0-5.7.0 |
因为之前我只是使用的是Maven进行管理的,然后,后面的Spark项目还是打算使用SBT进行管理,所以,本机IDEA需要安装SBT。IDEA在安装Scala插件的时候,就自带了SBT工具的。很方便。
仅仅需要简单的配置一下,国内源会比较快一些

-Dsbt.override.build.repos=true
-Dsbt.repository.config=c:\sbt\repositories
c:\sbt\repositories文件内容如下:
[repositories]
local
aliyun: http://maven.aliyun.com/nexus/content/groups/public
typesafe-ivy-releases: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sonatype-oss-releases
maven-central
sonatype-oss-snapshots
新建项目
在IDEA中新建Scala项目,注意这里选择的Scala版本为2.11.8,其余的按照常规来就行。
过一会儿,项目就构建完成了。
接着,为项目,添加,需要的依赖build.sbt
ps:需要什么依赖,可以去maven镜像仓库百度
name := "SparkDayDemo"
version := "0.1"
scalaVersion := "2.11.8"
//依赖库
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-core" % "2.2.0"
)
// https://mvnrepository.com/artifact/org.apache.spark/spark-sql
libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.2.0"
本地wordCount代码
package february
import org.apache.spark.{SparkConf, SparkContext}
/**
* Description: 本地运行模式
*
* @Author: 留歌36
* @Date: 2019/2/20 15:30
*/
object LocalWordCountFromTxt {
def main(args: Array[String]): Unit = {
val conf=new SparkConf()
.setAppName("LocalWordCountFromTxt")
.setMaster("local[2]") //注意submit模式 需要注释掉
val sc=new SparkContext(conf)
val textFile=sc.textFile("f:\\hello.txt")
// flatMap就是把每一行,拿来进行split ,切分后的每个元素,独占一行
val lines=textFile.flatMap(line=>line.split(","))
lines.foreach(println)
val count=lines.map(word=>(word,1)).reduceByKey{case(x,y)=>x+y}
val output=count.saveAsTextFile("f:\\tmp3")
}
}
这里是可以直接右键,运行的,一般来说,在开发阶段,都是这样子运行方式,本地测试过了,才会提交到集群中去运行
提交Submit 模式代码
package february
import org.apache.spark.{SparkConf, SparkContext}
/**
* Description: 独立运行模式
* spark集群模式(独立运行模式)下textFile读取file本地文件报错解决
* 前言
* 如果在spark-shell中使用textFile("file:///path")演示,在local模式下是没有问题的,
* 因为毕竟就是在本机运行,读取本地的文件。但是如果spark-shell --master指定spark集群的话,
* 这样运行就会有问题,会报找不到文件的错误。
*
* 解决方案
* 那么解决的方案其实也比较简单,就是在所有的集群节点上相同的path下上传该文件。
* 然后在textFile("file:///path")中指定该path即可。
*
* 注意: 各个节点的文件必须相同,否则依然会报错。
*
* @Author: 留歌36
* @Date: 2019/2/20 15:30
*/
object StandaloneWordCountFromTxt {
def main(args: Array[String]): Unit = {
val conf=new SparkConf()
.setAppName("StandaloneWordCountFromTxt")
val sc=new SparkContext(conf)
val textFile=sc.textFile("file:///home/liuge36/feb/wordCountFrom.txt")
val lines=textFile.flatMap(line=>line.split(","))
val count=lines.map(word=>(word,1)).reduceByKey{case(x,y)=>x+y}
val output=count.saveAsTextFile("file:///home/liuge36/feb/wordCountFrom")
}
}
这里,再想说明一下,集群中去提交代码,千万注意集群中的每一个节点都必要要有相同的一份文件才行,不然,会报错的。
代码,开发完毕,就可以打包上传,打包方式值是,菜单栏的Build
集群中需要启动:
关闭所有jps出现的进程先
启动hadoop start-all.sh
启动saprk start-all.sh
启动mysql元数据库 service mysqld restart (spark003)
启动hive metastore服务 nohup hive --service metastore &
这里可能和你不太一致,其实,如果你没有配置Hadoop或Hive连接SparkSQL的话,你只需要启动Spark就可以了
到这里,你应该有一个待运行的jar包了
这里为了效果方便,我使用的是直接输出结果的jar包
提交到spark集群中去,
StandAlone 独立运行模式,不需要Hadoop
模式一 client模式
[root@spark001 bin]# spark-submit --master spark://spark001:7077 --deploy-mode client --class february.StandaloneWordCountFromTxt /home/liuge36/jars/SparkDayDemo.jar
19/02/14 09:09:21 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
==================华丽分割线开始============================
(Zookeeper,1)
(Kafka,1)
(Hello,5)
(,1)
(World,1)
(Hive,1)
(Sqoop,1)
(Spark,1)
(People,1)
(Storm,1)
(Flume,1)
(Person,1)
(Hbase,1)
(Hadoop,1)
==================华丽分割线结束============================
其中 需要注意的是你的Spark集群的地址,这个可以从你Master节点的8080 (8081)详情页面查看到,这个地址一定要写对才行
如果,一切顺利的话,那么你就可以在保存的目录中找到结果文件了
模式二 cluster模式
spark-submit --master spark://spark001:7077 --deploy-mode cluster --class february.StandaloneWordCountFromTxt /home/liuge36/jars/SparkDayDemo.jar
Spark On Yarn
Spark可以和Yarn整合,将Application提交到Yarn上运行,和StandAlone提交模式一样,Yarn也有两种提交任务的方式。
1提交到代码到Yarn,Spark On Yarn 模式1
在client节点配置中spark-env.sh添加Hadoop_HOME的配置目录即可提交yarn 任务,具体步骤如下:
export HADOOP_CONF_DIR=/root/apps/hadoop-2.6.0-cdh5.7.0/etc/hadoop
[root@spark001 bin]# spark-submit --master yarn --deploy-mode client --class february.StandaloneWordCountFromTxt /home/liuge36/jars/SparkDayDemo.jar
19/02/14 08:57:26 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
==================华丽分割线开始============================
(Zookeeper,1)
(Kafka,1)
(Hello,5)
(,1)
(World,1)
(Hive,1)
(Sqoop,1)
(Spark,1)
(People,1)
(Storm,1)
(Flume,1)
(Person,1)
(Hbase,1)
(Hadoop,1)
==================华丽分割线结束============================
执行流程
客户端提交一个Application,在客户端启动一个Driver进程。
Driver进程会向RS(ResourceManager)发送请求,启动AM(ApplicationMaster)的资源。
RS收到请求,随机选择一台NM(NodeManager)启动AM。这里的NM相当于Standalone中的Worker节点。
AM启动后,会向RS请求一批container资源,用于启动Executor.
RS会找到一批NM返回给AM,用于启动Executor。
AM会向NM发送命令启动Executor。
Executor启动后,会反向注册给Driver,Driver发送task到Executor,执行情况和结果返回给Driver端。
总结:
1、Yarn-client模式同样是适用于测试,因为Driver运行在本地,Driver会与yarn集群中的Executor进行大量的通信,会造成客户机网卡流量的大量增加.
2、 ApplicationMaster的作用:
为当前的Application申请资源
给NodeManager发送消息启动Executor。
注意:ApplicationMaster有launchExecutor和申请资源的功能,并没有作业调度的功能。
2提交到代码到Yarn,Spark On Yarn 模式2
spark-submit --master yarn --deploy-mode cluster --class february.StandaloneWordCountFromTxt /home/liuge36/jars/SparkDayDemo.jar
执行流程
客户机提交Application应用程序,发送请求到RS(ResourceManager),请求启动AM(ApplicationMaster)。
RS收到请求后随机在一台NM(NodeManager)上启动AM(相当于Driver端)。
AM启动,AM发送请求到RS,请求一批container用于启动Executor。
RS返回一批NM节点给AM。
AM连接到NM,发送请求到NM启动Executor。
Executor反向注册到AM所在的节点的Driver。Driver发送task到Executor。
总结
1、Yarn-Cluster主要用于生产环境中,因为Driver运行在Yarn集群中某一台nodeManager中,每次提交任务的Driver所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过yarn查看日志。
2.ApplicationMaster的作用:
为当前的Application申请资源 给nodemanager发送消息 启动Excutor。
任务调度。(这里和client模式的区别是AM具有调度能力,因为其就是Driver端,包含Driver进程)
3、 停止集群任务命令:yarn application -kill applicationID
yarn logs -applicationId application_1517538889175_2550 > logs.txt
参考:https://blog.csdn.net/LHWorldBlog/article/details/79300050
基于RDD实现简单的WordCount程序的更多相关文章
- 实验一:基于Winsock完成简单的网络程序开发
第一部分:简答的UDP网络通信程序 // UDP5555.cpp : Defines the entry point for the application. //================== ...
- 55、Spark Streaming:updateStateByKey以及基于缓存的实时wordcount程序
一.updateStateByKey 1.概述 SparkStreaming 7*24 小时不间断的运行,有时需要管理一些状态,比如wordCount,每个batch的数据不是独立的而是需要累加的,这 ...
- Netty学习——基于netty实现简单的客户端聊天小程序
Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import ...
- 输入DStream之基础数据源以及基于HDFS的实时wordcount程序
输入DStream之基础数据源以及基于HDFS的实时wordcount程序 一.Java方式 二.Scala方式 基于HDFS文件的实时计算,其实就是,监控一个HDFS目录,只要其中有新文件出现,就实 ...
- 09、高级编程之基于排序机制的wordcount程序
package sparkcore.java; import java.util.Arrays; import java.util.Iterator; import org.apache.spark. ...
- Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码
Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本文主要是记录一写我在学习MapReduce时的一些 ...
- 在Spark上运行WordCount程序
1.编写程序代码如下: Wordcount.scala package Wordcount import org.apache.spark.SparkConf import org.apache.sp ...
- 编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本]
编写Spark的WordCount程序并提交到集群运行[含scala和java两个版本] 1. 开发环境 Jdk 1.7.0_72 Maven 3.2.1 Scala 2.10.6 Spark 1.6 ...
- Hive数据分析——Spark是一种基于rdd(弹性数据集)的内存分布式并行处理框架,比于Hadoop将大量的中间结果写入HDFS,Spark避免了中间结果的持久化
转自:http://blog.csdn.net/wh_springer/article/details/51842496 近十年来,随着Hadoop生态系统的不断完善,Hadoop早已成为大数据事实上 ...
随机推荐
- python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
1. 场景描述 一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的K-means聚类算法,算法原理就不介绍了,只从代码层面 ...
- Codeforces 976E
题意略. 思路: 容易知道那a次倍增放在同一个怪身上是最优的,其余的怪我们只需要取hp值和damage值中间最大的那个就好了(在b值的限制下). 然而我们并不知道把那a次倍增放在哪个怪身上最好,那么我 ...
- CSS文件引入link和@import 区别
1.(本质区别)link 属于 HTML 标签,而 @import 完全是 css 提供的一种导入 css 文件的规则. 2.文件加载时机有差别: 当一个页面被加载的时候,link 引用的 css 会 ...
- 《高效休息法》IT从业者如何高效休息
这本书主要讲什么? 大脑疲劳和身体疲劳不同,身体再怎么休息,大脑疲劳还是会在不知不觉中积累 大脑是一个重量仅仅占体重2%,却消耗着20%能量的大胃王,这些能量大部分都用在了预设模式网络(Default ...
- 2019-04-23-Python爬取有声小说
目录 Python爬取有声小说 摘要 1.获取下载链接 2.分析规律,循环爬取 3.保存到本地,批量命名 4.界面设计 5.效果展示 Python爬取有声小说 通过python爬取网站的资源,实现批量 ...
- Mysql主从同步配置方案(Centos7)
最近在做项目高可用时,需要使用数据同步.由于只有双节点,且采用主主同步可能存在循环同步的风险,故综合考虑采用Mysql主从同步(Master-Slave同步). 可能没有接触过Mysql数据同步时,可 ...
- Keras(六)Autoencoder 自编码 原理及实例 Save&reload 模型的保存和提取
Autoencoder 自编码 压缩与解压 原来有时神经网络要接受大量的输入信息, 比如输入信息是高清图片时, 输入信息量可能达到上千万, 让神经网络直接从上千万个信息源中学习是一件很吃力的工作. 所 ...
- 牛客-小a的旅行计划 + 数学推导
小a的旅行计划 题意: 小a终于放假了,它想在假期中去一些地方游玩,现在有N个景点,编号为,同时小b也想出去游玩.由于一些特殊♂原因,他们的旅行计划必须满足一些条件 首先,他们可以从这N个景点中任意选 ...
- CodeForces-714B-Filya and Homework+思路
Filya and Homework 题意: 给定一串数字,任选一个数a,把若干个数加上a,把若干个数减去a,能否使得数列全部相同: 思路: 我开始就想找出平均数,以为只有和偶数的可以,结果wa在 1 ...
- BZOJ-3343教主的魔法+分块(大块排序二分)
传送门:https://www.luogu.org/problemnew/show/P2801 参考:http://hzwer.com/2784.html 感觉思路无比清晰:) ps:我在洛谷A的, ...