参考:http://www.cnblogs.com/zlslch/p/5880926.html
下载Hadoop:E:\software\Spark\spark-2.3.1-bin-hadoop2.7\spark-2.3.1-bin-hadoop2.7
解压tgz文件,下载7zip提取成tgz文件(tar压缩),再解压;
按参考教程运行WordCount.scala的程序;
报这个错:
windows idea Failed to locate the winutils binary in the hadoop binary path java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
参考教程定位问题的方法:
https://blog.csdn.net/woshixuye/article/details/53461975
分析问题
打开源码,查看getQualifiedBinPath方法
解决方案:
exeFile不存在会报错,也就是fullExeName不存在。即windows中没有配置HADOOP_HOME。
3 解决问题
配置环境变量E:\Program Files\hadoop-2.7.0重启电脑。或者代码中设置System.setProperty(“hadoop.home.dir”, “E:\Program Files\hadoop-2.7.0”);还有一种可能HADOOP_HOME的bin目录下根本没有winutils.exe,下载地址https://github.com/srccodes/hadoop-common-2.2.0-bin
要跑scala程序:
安装java 1.8
安装scala
安装idea
安装Hadoop
每一个步骤都有设置
【没有assembly目录】spark2.0.0启动时无法访问spark-assembly-*.jar的解决办法
但是spark升级到spark2以后,原有lib目录下的大JAR包被分散成多个小JAR包,原来的spark-assembly-*.jar已经不存在,所以hive没有办法找到这个JAR包。
参考:
https://blog.csdn.net/dax1n/article/details/58197361
package com.zhouls.spark
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import java.lang.System
object WordCount {
System.setProperty("hadoop.home.dir", "E:\\software\\Spark\\spark-2.3.1-bin-hadoop2.7\\spark-2.3.1-bin-hadoop2.7")
def main(args: Array[String]): Unit = {
/*
* 第1步:创建spark的配置对象sparkconf,设置spark程序的运行时的配置信息,
* 例如说通过setMaster来设置程序要链接的spark集群的master的URL,如果设置为local,则代表spark程序在本地运行,
* 特别适合于机器配置条件非常差(例如只有1G内存)的初学者
*/
val conf = new SparkConf()//创建SparkConf对象
conf.setAppName("Wow,My First Spark App!")//设置应用程序的名称,在程序运行的监控界面可以看到名称
conf.setMaster("local")//此时,程序在本地运行,不需要安装spark集群
/*
* 第2步:创建SparkContext对象
* SparkContext是spark程序所有功能的唯一入口,无论是采用scala、java、pthon、R等都必须有一个SparkContext
* SparkContext核心作用:初始化spark应用程序运行所需要的核心组件、包括DAGScheduler、TaskScheduler、SchedulerBackend
* 同时还会负责spark程序往master注册程序等
* SparkContext是整个spark应用程序中最为至关重要的一个对象
*/
val sc = new SparkContext(conf)
/*
* 第3步:根据具体的数据源(HDFS、HBase、Local FS、DB、S3等)通过SparkContext来创建RDD
* RDD的创建基本有三种方式:根据外部的数据来源(如HDFS)、根据Scala集合、由其它的RDD操作数据会被RDD划分成
* 一系列的Partitions,分配到每个Partition的数据属于一个Task的处理范畴
*/
// val lines:RDD[String] = sc.textFile("D://SoftWare//spark-1.6.2-bin-hadoop2.6//README.md", 1)//path指的是文件路径,minPartitions指的是最小并行度
val lines = sc.textFile("E://software//Spark//spark-2.3.1-bin-hadoop2.7//spark-2.3.1-bin-hadoop2.7//README.md", 1)//path指的是文件路径,minPartitions指的是最小并行度
/*
* 第4步:对初始的RDD进行Transformation级别的处理,例如map、filter等高阶函数等的编程,来进行具体的数据计算
* 第4.1步:将每一行的字符串拆分成单个的单词
*/
val words = lines.flatMap{ line => line.split(" ")}//对每一行的字符串进行单词拆分并把所有行的拆分结果通过flat合并成为一个
/*
* 4.2步:在单词拆分的基础上对每个单词实例计数为1,也就是 word => (word,1)
*/
val pairs = words.map { word => (word,1) }
/*
* 4.3步:在每个单词实例计数为1基础之上统计每个单词在文件中出现的总次数
*/
val wordCounts = pairs.reduceByKey(_+_)//对相同的key,进行value的累计(包括local和reducer级别同时reduce)
wordCounts.foreach(wordNumberPair => println(wordNumberPair._1 + ":" + wordNumberPair._2))
/*
* 第5步
*/
sc.stop();
}