SpringBoot構建大數據開發框架

爲什麼使用SpringBoot
1、web工程分層設計,表現層、業務邏輯層、持久層,按照技術職能分爲這幾個內聚的部分,從而促進技術人員的分工

2、需要各種XML配置,還需要搭建Tomcat或者jetty作爲容器來運行,每次構建項目,都需要經歷此流程

3、一個整合良好的項目框架不僅僅能實現技術、業務的分離,還應該關注並滿足開發人員的“隔離”

springBoot是什麼

Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架致力於實現免XML配置,提供便捷,獨立的運行環境,實現“一鍵運行”滿足快速應用開發的需求。從而使開發人員不再需要定義樣板化的配置。

從根本上講,Spring Boot就是一些庫的集合,它能夠被任意項目的構建系統所使用。

它的優點

使編碼變得簡單

spring boot採用java config的方式,對spring進行配置,並且提供了大量的註解,極大地提高了工作效率。

使配置變得簡單

spring boot提供許多默認配置,當然也提供自定義配置。但是所有spring boot的項目都只有一個配置文件:application.properties/application.yml。用了spring boot,再也不用擔心配置出錯找不到問題所在了。

使部署變得簡單

spring boot內置了三種servlet容器:tomcat,jetty,undertow。

所以,你只需要一個java的運行環境就可以跑spring boot的項目了。spring boot的項目可以打成一個jar包,然後通過java -jar xxx.jar來運行。(spring boot項目的入口是一個main方法,運行該方法即可。 )

使監控變得簡單

spring boot提供了actuator包,可以使用它來對你的應用進行監控。它主要提供了以下功能:

構建

整合spark
SpringBoot構建大數據開發框架
分享之前我還是要推薦下我自己創建的大數據學習資料分享羣 957205962,這是全國最大的大數據學習交流的地方,2000人聚集,不管你是小白還是大牛,小編我都挺歡迎,今天的源碼已經上傳到羣文件,不定期分享乾貨,包括我自己整理的一份最新的適合2017年學習的前端資料和零基礎入門教程,歡迎初學和進階中的小夥伴。
Scala版本demo

object WordCount {

def main(args: Array[String]): Unit = {

/**

第一步:創建Spark的配置對象SparkConf,設置Spark程序的運行時的配置信息
例如說通過setMaster來設置程序要連接的Spark集羣的Master的URL
如果設置爲local,則代表Spark程序在本地運行,特別適合於配置條件的較差的人
*/
val conf = new SparkConf()
//設置應用程序的名稱,在程序運行的監控界面可以看到名稱
conf.setAppName("MyFirstSparkApplication")
//此時程序在本地運行,無需安裝Spark的任何集羣
conf.setMaster("local")
/**
/創建SparkContext對象,通過傳入SparkConf實例來定製Spark運行的具體參數和配置信息
*/
val sc = new SparkContext(conf)
/**
第三步:根據具體的數據來源(HDFS,HBase,Local FS(本地文件系統) ,DB,S3(雲上)等)通過SparkContext來創建RDD
RDD的創建基本有三種方式,根據外部的數據來源(例如HDFS),根據Scala集合,由其他的RDD操作產生
數據會被RDD劃分成爲一系列的Partitions,分配到每個Partition的數據屬於一個Task的處理範疇
*/
//文件的路徑,最小並行度(根據機器數量來決定)
val lines= sc.textFile("D://hadoop//spark-2.2.0-bin-hadoop2.7//README.md", 1)
//讀取本地文件,並設置Partition = 1 //類型推導得出lines爲RDD
/**
第四步:對初始的RDD進行Transformation級別的處理,例如map,filter等高階函數等的編程,來進行具體的數據計算
4.1:將每一行的字符串拆分成單個的單詞
4.2:在單詞拆分的基礎上對每個單詞的實例計數爲1,也就是word =>(word,1)
4.3:在每個單詞實例計數爲1基礎之上統計每個單詞在文件出現的總次數
*/
//對每一行的字符串進行單詞的拆分並把所有行的拆分結果通過flat合併成爲一個大的單詞集合
val words = lines.flatMap { line => line.split(" ") } //words同樣是RDD類型
val pairs = words.map { word => (word,1) }
//對相同的key,進行value的累加(包括Local和Reducer級別同時Reduce)
val wordCounts = pairs.reduceByKey(+)
wordCounts.foreach(wordNumberPair => println(wordNumberPair._1 + " : " + wordNumberPair._2))
//注意一定要將SparkContext的對象停止,因爲SparkContext運行時會創建很多的對象
sc.stop()
}
}
注意的地方
spark版本自帶scala包,需要使用對應的scala sdk版本編譯。
不要使用maven倉庫作爲下載pom文件依賴的java包,因爲spark對應的scala包版本有誤。
整合Elasticsearch
引入相關jar包

SpringBoot構建大數據開發框架
Scala版本demo

將數據寫入es,自動創建es索引

object ESDemo {

def main(args: Array[String]) {

val conf = new SparkConf().setAppName("ESDemo").setMaster("local")

//在spark中自動創建es中的索引

conf.set("es.index.auto.creaete","true")

val numbers = Map("one" -> 1, "two" -> 2, "three" -> 3)

val airports = Map("arrival" -> "Otopeni", "SFO" -> "San Fran")

sc.makeRDD(Seq(numbers,airports)).saveToEs("spark/docs")

}

}

讀取es中的數據,使用來org.elasticsearch.spark.sql讀取索引中的數據

object ESDemo1 {

def main(args: Array[String]) {

val conf = new SparkConf().setAppName("ESDemo").setMaster("local")

val sc = new SparkContext(conf)

//創建sqlContext

val sqlContext = new SQLContext(sc)

import sqlContext.implicits.

val options = Map("pushdown" -> "true", "es.nodes" -> "localhost", "es.port" -> "9200")

val spark14DF = sqlContext.read.format("org.elasticsearch.spark.sql").options(options).load("spark/docs")

spark14DF.select("one","two","three").collect().foreach(println())

//將數據註冊到臨時表

spark14DF.registerTempTable("docs")

val results = sqlContext.sql("SELECT one FROM docs")

results.map(t => "one:"+t(0)).collect().foreach(println)

sc.stop()

}

}

注意的地方

項目中引入的版本需要與安裝的easticsearch的版本一致,且需使用對應的elasticsearch-spark包。

整合Kafka
引入相關jar包

SpringBoot構建大數據開發框架
Kafka讀取數據寫入ES demo
def main(args: Array[String]): Unit = {

import org.apache.spark.SparkConf

val conf = new SparkConf().setMaster("local").setAppName("KafkaToESDemo")

//在spark中自動創建es中的索引

conf.set("es.index.auto.creaete","true")

val ssc = new StreamingContext(conf, Seconds(10))

var topics = Array("orders_four");//kafka topic名稱

var group = "" //定義groupID

val kafkaParam = Map( //申明kafka相關配置參數

"bootstrap.servers" -> "XXX.XXX.XX.XX:XXXXX", //kafka 集羣IP及端口

"key.deserializer" -> classOf[StringDeserializer],

"value.deserializer" -> classOf[StringDeserializer],

"group.id" -> group, //定義groupID

"auto.offset.reset" -> "earliest",//設置丟數據模式 有 earliest,latest, none

"enable.auto.commit" -> (false: java.lang.Boolean)

);

val offsetRanges = Array()

var stream = KafkaUtils.createDirectStreamString, String)//從kafka讀取數據 獲取數據流

stream.foreachRDD { rdd =>

val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges //獲取offset

stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges) //存儲offset

val wordsDataFrame = rdd.map(record=>record.value().split(","))

.map(temp=>Record(temp(0).toLong,temp(1),temp(2).trim().toInt,temp(3).trim().toInt,temp(4).trim().toInt,temp(5).trim().toInt,temp(6),temp(7),temp(8),temp(9),temp(10),temp(11).toDouble,temp(12).toDouble,temp(13),temp(14).toDouble,temp(15).toDouble,temp(16),temp(17),temp(18),temp(19),temp(20),temp(21),temp(22),temp(23).toInt,temp(24),temp(25).toInt,temp(26).toDouble,temp(27).toDouble,temp(28).toDouble,temp(29).toDouble,temp(30).toDouble,temp(31),temp(32),temp(33).toDouble,temp(34).toInt,temp(35).toDouble,temp(36).toDouble,temp(37).toDouble,temp(38),temp(39),temp(40).toInt,temp(41).toDouble,temp(42).toDouble,temp(43).toDouble,temp(44).toDouble,temp(45).toDouble,temp(46).toDouble,temp(47).toDouble,temp(48)))

.saveToEs("spark/kafkademodocs",

Map("es.mapping.id" -> "id","es.writeoperation" -> "upsert","es.update.retry.on.conflict" -> "5"))

}

ssc.start();

ssc.awaitTermination();

}

注意的地方

spark-streaming-kafka包需要與spark版本一致,也需要與scala sdk版本一致;

寫入Es的api方法說明

saveToEs對應DStream type needs to be a Map (either a Scala or a Java one), a JavaBean or a Scala case class.

saveJsonToEs 對應JSON字符串

saveToEsWithMeta 對應pair DStream

整合mybatis
引入相關jar包

使用mybatis-spring-boot包,使mybatis配置變的簡單。使用druid數據連接池,性能強大,並提供了sql監控,便於運維管理。

SpringBoot構建大數據開發框架
application.yml 配置信息:

datasource:

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql://tdsql-4b9a8yqj.gz.cdb.myqcloud.com:23/test?serverTimezone=Hongkong&characterEncoding=utf8&useUnicode=true&useSSL=false

username:

password:

type: com.alibaba.druid.pool.DruidDataSource

max-active: 20

initial-size: 1

min-idle: 3

max-wait: 60000

time-between-eviction-runs-millis: 60000

min-evictable-idle-time-millis: 300000

test-while-idle: true

test-on-borrow: false

test-on-return: false

poolPreparedStatements: true

maxOpenPreparedStatements: 20

validationQuery: select 'x'

註冊datasource

@Configurationbr/>@EnableTransactionManagement

public class DruidDataSourceConfig implements EnvironmentAware {

private static Logger logger = LoggerFactory.getLogger(DruidDataSourceConfig.class);

private RelaxedPropertyResolver propertyResolver;

public void setEnvironment(Environment env) {

this.propertyResolver = new RelaxedPropertyResolver(env, "spring.datasource.");

}

@Bean
public DataSource dataSource() {
logger.info("開始注入druid");
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(propertyResolver.getProperty("url"));
datasource.setDriverClassName(propertyResolver.getProperty("driver-class-name"));
datasource.setUsername(propertyResolver.getProperty("username"));
datasource.setPassword(propertyResolver.getProperty("password"));
datasource.setInitialSize(Integer.valueOf(propertyResolver.getProperty("initial-size")));
datasource.setMinIdle(Integer.valueOf(propertyResolver.getProperty("min-idle")));
datasource.setMaxWait(Long.valueOf(propertyResolver.getProperty("max-wait")));
datasource.setMaxActive(Integer.valueOf(propertyResolver.getProperty("max-active")));
datasource.setMinEvictableIdleTimeMillis(Long.valueOf(propertyResolver.getProperty("min-evictable-idle-time-millis")));
datasource.setValidationQuery(propertyResolver.getProperty("validationQuery"));
try {
datasource.setFilters("stat,wall");
} catch (SQLException e) {
e.printStackTrace();
}
logger.info("成功注入druid");
return datasource;
}
@Bean
public SqlSessionFactory sqlSessionFactoryBean() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource());
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mybatis/*.xml"));

return sqlSessionFactoryBean.getObject();

}

}

簡單的mapper

兼容兩種模式,註解和xml方式寫sql

@Mapper

public interface UserMapper {

public User findUserInfo();

public User findUserById(Integer id);

@Select("SELECT * FROM USER WHERE NAME = #{name}")
User findByName(@Param("name") String name);
@Insert("insert into user(name,age) value(#{name},#{age})")
int insert(@Param("name") String name,@Param("age") Integer age);
}

對應的xml

SpringBoot構建大數據開發框架
注意:mapper接口方法名稱,爲id,註解方式和xml中不能重名。

總結

獨立運行的Spring項目
Spring Boot可以以jar包的形式進行獨立的運行,使用:java -jar xx.jar 就可以成功的運行項目,或者在應用項目的主程序中運行main函數即可;

內嵌的Servlet容器

默認使用內置的tomcat服務器。

提供starter簡化Manen配置

spring boot提供各種starter,其實就是一些spring bao的集合,只不過spring boot幫我們整合起來了而已。

上圖只是其中的一部分,還有很多其他的。通過這些starter也可以看得出來,spring boot可以和其他主流的框架無縫集成,比如mybatis等。所以,不需要擔心你想用的技術spring boot不支持。

自動配置Spring,無xml文件

Spring Boot會根據我們項目中類路徑的jar包/類,爲jar包的類進行自動配置Bean,這樣一來就大大的簡化了我們的配置。當然,這只是Spring考慮到的大多數的使用場景,在一些特殊情況,我們還需要自定義自動配置(就在那唯一的配置文件裏,而且它不是xml文件!)。

應用監控

Spring Boot提供了基於http、ssh、telnet對運行時的項目進行監控。

後續擴展

Springboot開啓應用監控
Spring Boot Admin 用於監控基於 Spring Boot 的應用。官方文檔在這裏(v1.3.4):《Spring Boot Admin Reference Guide》。

Springboot集成任務調度Quartz

Springboot集成Elasticsearch
Spring Boot爲Elasticsearch提供基本的自動配置,Spring Data Elasticsearch提供在它之上的抽象,還有用於收集依賴的spring-boot-starter-data-elasticsearch'Starter'。

提供簡單的restful操作elasticsearch.

Springboot集成Neo4J
Neo4j是一個開源的NoSQL圖數據庫,它使用圖(graph)相關的概念來描述數據模型,把數據保存爲圖中的節點以及節點之間的關係。相比傳統rdbms(關係管理系統)的方式,Neo4j更適合大數據關係分析。Spring Boot爲使用Neo4j提供很多便利,包括spring-boot-starter-data-neo4j‘Starter’。

Springboot集成redis
Redis是一個緩存,消息中間件及具有豐富特性的鍵值存儲系統。Spring Boot爲Jedis客戶端library提供基本的自動配置,Spring Data Redis提供了在它之上的抽象,spring-boot-starter-redis'Starter'收集了需要的依賴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章