spark築基篇-01-Eclipse開發Spark HelloWorld
1 前言
Spark這麼火,越來越多的小夥伴開始搞大資料。
通過多方查閱資料,這個單機版的Spark的HelloWorld終於跑出來了。
此HelloWorld非彼HelloWorld,並不是打印出HelloWorld那麼簡單,而是一個單詞統計程式,就是統計出一個檔案中單詞出現的次數並排序。
會通過原生的scala的方式,傳統的java方式和java8的方式分別實現同一功能。
其實單機版和運行於叢集之上的Spark程式,差別就在於執行環境,開發流程是一樣的。
以後的文章會記錄如何建立叢集。
另外,該系列文章會在本人閒暇時同時在 CSDN 和 簡書 更新。
歡迎各位道友糾錯。
2 環境搭建
本人所使用環境如下:
C:\Users\hylexus>java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
C:\Users\hylexus>scala -version
Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL
Eclipse for scala:
Scala IDE build of Eclipse SDK
Build id: 4.4.1-vfinal-2016-05-04T11:16:00Z-Typesafe
注意:使用的spark-core_2.11
依賴的jar檔案多的嚇人,耐心等待下載jar吧…………^_^
2.1 scala版
pom.xml部分內容如下:
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target >
<encoding>UTF-8</encoding>
<scala.version>2.11.5</scala.version>
<scala.compat.version>2.11</scala.compat.version>
</properties>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.11 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.specs2</groupId>
<artifactId>specs2-junit_2.11</artifactId>
<version>2.4.16</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<!-- see http://davidb.github.com/scala-maven-plugin -->
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<!-- <arg>-make:transitive</arg> -->
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<!-- <extdirs>src/main/webapp/plugins/ueditor/jsp/lib</extdirs> -->
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<useFile>false</useFile>
<disableXmlReport>true</disableXmlReport>
<!-- If you have classpath issue like NoDefClassError,... -->
<!-- useManifestOnlyJar>false</useManifestOnlyJar -->
<includes>
<include>**/*Test.*</include>
<include>**/*Suite.*</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
2.2 java版
pom.xml檔案內容如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core_2.11 -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<!-- <extdirs>src/main/webapp/plugins/ueditor/jsp/lib</extdirs> -->
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<useFile>false</useFile>
<disableXmlReport>true</disableXmlReport>
<!-- If you have classpath issue like NoDefClassError,... -->
<!-- useManifestOnlyJar>false</useManifestOnlyJar -->
<includes>
<include>**/*Test.*</include>
<include>**/*Suite.*</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
3 程式碼
3.1 scala-低調版
object WordCount {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setAppName("WordCount") //
.setMaster("local")
val sc = new SparkContext(conf)
val fileName = "E:/workspace/eclipse/scala/spark-base/src/main/scala/log4j.properties"
//獲取檔案內容
val lines = sc.textFile(fileName, 1)
//分割單詞,此處僅以空格分割作為示例
val words = lines.flatMap(line => line.split(" "))
//String===>(word,count),count==1
val pairs = words.map(word => (word, 1))
//(word,1)==>(word,count)
val result = pairs.reduceByKey((word, acc) => word + acc)
//sort by count DESC
val sorted=result.sortBy(e => { e._2 }, false, 1)
val mapped=sorted.map(e => (e._2, e._1))
mapped.foreach(e => { println("【" + e._1 + "】出現了" + e._2 + "次") })
sc.stop()
}
}
3.2 scala-高調版
object WordCount {
def main(args: Array[String]): Unit = {
val conf = new SparkConf
conf.setAppName("rank test").setMaster("local")
val sc = new SparkContext(conf)
val fileName = "E:/workspace/eclipse/scala/spark-base/src/main/scala/log4j.properties"
sc.textFile(fileName, 1) //lines
.flatMap(_.split(" ")) //all words
.map(word => (word, 1)) //to pair
.reduceByKey(_ + _) //count
.map(e => (e._2, e._1)) //
.sortByKey(false, 1) //
.map(e => (e._2, e._1)) //
.foreach(e => { println("【" + e._1 + "】出現了" + e._2 + "次") })
sc.stop()
}
}
3.3 java-傳統版
程式碼噁心的沒法看啊……
到處都是匿名內部類……
還好有java8的lambda來拯救你
import java.util.Arrays;
import java.util.Iterator;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;
public class WordCount {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setAppName("WordCounter")//
.setMaster("local");
String fileName = "E:/workspace/eclipse/scala/spark-base/src/main/scala/log4j.properties";
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile(fileName, 1);
JavaRDD<String> words = lines
.flatMap(new FlatMapFunction<String, String>() {
private static final long serialVersionUID = 1L;
// 以前的版本好像是Iterable而不是Iterator
@Override
public Iterator<String> call(String line) throws Exception {
return Arrays.asList(line.split(" ")).iterator();
}
});
JavaPairRDD<String, Integer> pairs = words
.mapToPair(new PairFunction<String, String, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public Tuple2<String, Integer> call(String word)
throws Exception {
return new Tuple2<String, Integer>(word, 1);
}
});
JavaPairRDD<String, Integer> result = pairs.reduceByKey(
new Function2<Integer, Integer, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public Integer call(Integer e, Integer acc)
throws Exception {
return e + acc;
}
}, 1);
result.map(
new Function<Tuple2<String, Integer>, Tuple2<String, Integer>>() {
private static final long serialVersionUID = 1L;
@Override
public Tuple2<String, Integer> call(
Tuple2<String, Integer> v1) throws Exception {
return new Tuple2<>(v1._1, v1._2);
}
})//
.sortBy(new Function<Tuple2<String, Integer>, Integer>() {
private static final long serialVersionUID = 1L;
@Override
public Integer call(Tuple2<String, Integer> v1)
throws Exception {
return v1._2;
}
}, false, 1)//
.foreach(new VoidFunction<Tuple2<String, Integer>>() {
private static final long serialVersionUID = 1L;
@Override
public void call(Tuple2<String, Integer> e)
throws Exception {
System.out.println("【" + e._1 + "】出現了" + e._2 + "次");
}
});
sc.close();
}
}
3.4 java-lambda版
用上java8的lambda之後,還是挺清爽的嘛^_^
import java.util.Arrays;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;
public class WordCountByJava8 {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setAppName("WordCounter")//
.setMaster("local");
String fileName = "src/main/java/hylexus/spark/test1/WordCountByJava8.java";
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile(fileName, 1);
lines.flatMap(line -> Arrays.asList(line.split(" ")).iterator())
.mapToPair(word -> new Tuple2<>(word, 1))
.reduceByKey((e, acc) -> e + acc, 1)
.map(e -> new Tuple2<>(e._1, e._2))
.sortBy(e -> e._2, false, 1)
.foreach(e -> {
System.out.println("【" + e._1 + "】出現了" + e._2 + "次");
});
sc.close();
}
}
4 執行效果
//...............
//...............
【->】出現了6次
【+】出現了5次
【import】出現了5次
【new】出現了4次
【=】出現了4次
//...............
//...............
相關推薦
spark築基篇-01-Eclipse開發Spark HelloWorld
1 前言 Spark這麼火,越來越多的小夥伴開始搞大資料。 通過多方查閱資料,這個單機版的Spark的HelloWorld終於跑出來了。 此HelloWorld非彼HelloWorld,並不是打印出HelloWorld那麼簡單,而是
Spark效能優化篇二: 開發調優
Spark效能優化 篇二 : 開發調優 1、前言 在大資料計算領域,Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大資料領域的離線批處理、SQL類處理、流式/實時計
docker築基篇-03-使用docker-commit構建自己的映象
docker構建映象,至少有兩種方法: docker commit 命令 Dockerfile 本篇文章介紹如何使用docker commit命令來構建自己的映象。並推送到DockerHub。 1 準備 登入到Dockerhub,如下所
docker築基篇-04-使用Dockerfile構建自己的映象
上一篇文章介紹了使用docker commit命令來構建自己的映象。 本篇文章將使用Dockerfile實現上篇文章中的需求。 1 構建自己的映象 此處我們打算,給一個centos:6.8容器安裝nginx伺服器。 並將其狀態保留,以便不用每次
基礎篇--01 JAVA開發環境
1、Java簡介(1)Java SE簡介 Java SE(Java Platform,Standard Edition)稱之為“Java平臺標準版,是Java平臺的基礎。 Java SE包含了執行Java應用所需要的基礎環境和核心類庫 Java SE還定義了
docker築基篇-02-映象管理
映象再探 基礎命令 1 檢視映象 2 拉取映象 3 搜尋映象 4 刪除映象 1 映象再探 docker映象是由FileSystem疊加而成的。 和傳統的linux一樣,最底層是bootfs;之上是rootfs。 和linux不同的是,d
Java執行緒池的瞭解使用—築基篇
## 前言 Java中的執行緒池是一個很重要的概念,它的應用場景十分廣泛,可以被廣泛的用於高併發的處理場景。J.U.C提供的執行緒池:ThreadPoolExecutor類,可以幫助我們管理執行緒並方便地並行執行任務。因此瞭解併合理使用執行緒池非常重要。 本文對執行緒池採用 3W 的策略結合原始碼進行思考
【spark你媽喊你回家吃飯-05】RDD程式設計之旅基礎篇-01
1.RDD工作流程 1.1 RDD理解 RDD是spark特有的資料模型,談到RDD就會提到什麼彈性分散式資料集,什麼有向無環圖,本文暫時不去展開這些高深概念,在閱讀本文時候,大家可以就把RDD當作一個數組,這樣的理解對我們學習RDD的API是非常有幫助的。本文所有示例程式
eclipse配置spark開發環境
前言 無論Windows 或Linux 作業系統,構建Spark 開發環境的思路一致,基於Eclipse 或Idea,通過Java、Scala 或Python 語言進行開發。安裝之前需要提前準備好JDK、Scala 或Python 環境,然後在Eclipse 中下載安裝Scala 或Python 外掛(
spark windows單機安裝,intellij、eclipse開發
1.首先到官網下載spark包,我下載的是spark-1.4.1-bin-hadoop2.6 2.下載hadoop Windwos的工具,下載地址為:http://download.csdn.net/detail/wangyang_software/9030945 3.配置
基於eclipse的spark開發環境搭建
1、下載spark安裝包,然後直接解壓即可。 2、配置環境變數 SPARK_HOME F:\spark-2.1.0-bin-hadoop2.6 Path追加F:\spark-2.1.0-bin-hadoop2.6\bin; 3、建立maven工程。加
機器學習 - 開發環境安裝pycharm + pyspark + spark集成篇
package ron latest flat 數據量 oop ima 1.0 sklearn AS WE ALL KNOW,學機器學習的一般都是從python+sklearn開始學,適用於數據量不大的場景(這裏就別計較“不大”具體指標是啥了,哈
在Windows下用Eclipse開發和執行Spark程式
我們想現在windows環境下開發除錯好spark程式,然後打包,最後放到linux spark叢集環境去執行。 Windows環境準備 Windows本地測試執行 打包 為了可以選擇哪些第三方庫打進jar包,我們需要安裝Fat Jar
01. Eclipse for PHP + phpStudy 搭建php開發環境
alt img lips 編譯器 phpstudy 服務 border php編譯 -1 配置php編譯器 配置phpStudy服務器項目發布目錄 修改hosts文件127.0.0.1 www.350zx.cn 新建項目 啟動的你的phpStudy
spark學習(基礎篇)--(第三節)Spark幾種運行模式
一些記錄 image ica runner 1.3 函數 ive 啟動 driver h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff
spark2.x由淺入深深到底系列五之python開發spark環境配置
spark 大數據 rdd 開發環境 python 學習spark任何的技術前,請先正確理解spark,可以參考: 正確理解spark以下是在mac操作系統上配置用python開發spark的環境一、安裝pythonspark2.2.0需要python的版本是Python2.6+ 或者 P
Spark 2.0視頻|快學Spark 2.0(新特性、含真實項目、純Scala語言開發、CDH5.7)
spark快學Spark 2.0(新特性、含真實項目、純Scala語言開發、CDH5.7)分享網盤下載——https://pan.baidu.com/s/1c2F9zO0 密碼: pzx9Spark進入2.0時代,引入了很多優秀特性,性能上有較大提升,API更易用。在“編程統一”方面非常驚艷,實現了離線計算和
Spark筆記整理(三):Spark WC開發與應用部署
大數據 Spark [TOC] Spark WordCount開發 創建的是maven工程,使用的依賴如下: <dependency> <groupId>org.scala-lang</groupId> <artifactId>scal
利用KNIME建立Spark Machine learning 模型 1:開發環境搭建
大數據分析 KNIME Machine Learning Spark 建模 1、Knime Analytics 安裝從官方網站下載合適的版本 https://www.knime.com/downloads 將下載的安裝包在安裝路徑解壓 https://www.knime.com/insta
IDEA搭建scala開發環境開發spark應用程序
編寫 運行程序 通過 https apach import input inf 搭建 一、idea社區版安裝scala插件 因為idea默認不支持scala開發環境,所以當需要使用idea搭建scala開發環境時,首先需要安裝scala插件,具體安裝辦法如下。 1、