Java与SparkStreaming的Socket通信,结果保存至mysql
来源:互联网 发布:软件开发技术培训 编辑:程序博客网 时间:2024/05/19 23:13
Java与SparkStreaming Socket通信
还是做毕业设计,到这里出现了与预想中的问题:Java与SparkStreaming,这两者之间互相通信。 Spark的官方文档里面有说用[nc -lk 9999][6] 这样的例子来实现Streaming的数据获取。之前一直是分开来做的,今天两个整合的时候,预想到的问题出现了。
整理下整个毕设后端的思路:
1 在Spring里面配置了一个bean,然后提交到taskExecutor :
2 bean 里面就实现Socket 跟SparkStreaming 通信:
[Spring的配置官方的文档][6]里面有说, 我的配置如下:
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5"></property> <property name="maxPoolSize" value="10"></property> <property name="queueCapacity" value="25"></property> </bean> <bean id="socketServer" class="com.yhj.beens.inner.ServerThread"> <constructor-arg ref="taskExecutor"></constructor-arg> </bean>
bean的实现原来以为跟之前的Socket一样:
output = new DataOutputStream(this.socket.getOutputStream());
输出:
输出: output.writeUTF(s);
Streaming接收:
val ssc = new StreamingContext(conf, Seconds(10)) val lines = ssc.socketTextStream("192.168.5.101", 10020) //40 val words = lines.flatMap(_.split(" "))
如果用这种方式获取的流会在Spark 里面处理不好弄,我这里测的是处理完数据库里没什么也没有(我的处理结果保存在数据库),要是把上面代码中split中的[分隔符][6]去掉就会把输入的字符串逐个分解开(我很郁闷,我很不懂这里,要是有同学知道为什么可以留言我们一起讨论)。
SparkAPI 写了 socketTextStream 方法接收Socket的格式。这里 我看见网上有 说这种方式也通过SQL 从数据库里面获取数据,我没成功。
我这正确的方法:
Socket流:
String s = "帮同事买的比实体店便宜送货很快安装也很迅速第二天就来装了同事很满意\r\n"; // 回车换行 /*writer = new OutputStreamWriter(socket.getOutputStream());*/ writer.write(s); writer.flush();//这里其实我一直排斥用这个,一直没用后来加了就好了。 缓冲区啊~ 缓冲区 Thread.sleep(5000);
Streaming接收的地方不变。
- 一定要有回车换行
数据库连接池部分:
object scalaConnectPool { val log = Logger.getLogger(scalaConnectPool.this.getClass) var ds: BasicDataSource = null def getDataSource = { if (ds == null) { ds = new BasicDataSource() ds.setUsername("root") ds.setPassword("123456") ds.setUrl("jdbc:mysql://127.0.0.1:3306/db_shop?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=true") ds.setDriverClassName("com.mysql.jdbc.Driver") ds.setInitialSize(20) ds.setMaxActive(100) ds.setMinIdle(50) ds.setMaxIdle(100) ds.setMaxWait(1000) ds.setMinEvictableIdleTimeMillis(5 * 60 * 1000) ds.setTimeBetweenEvictionRunsMillis(10 * 60 * 1000) ds.setTestOnBorrow(true) } ds } def getConnection: Connection = { var connect: Connection = null try { if (ds != null) { connect = ds.getConnection } else { connect = getDataSource.getConnection } }catch { case t: Throwable => t.printStackTrace() // TODO: handle error } connect } def shutDownDataSource: Unit = if (ds != null) { ds.close() } def closeConnection(rs: ResultSet, ps: PreparedStatement, connect: Connection): Unit = { if (rs != null) { rs.close } if (ps != null) { ps.close } if (connect != null) { connect.close } }}
写入数据库:
pairs_1.foreachRDD(rdd => { rdd.foreachPartition(partitionOfRecords => { val connect = scalaConnectPool.getConnection connect.setAutoCommit(false) val stmt = connect.createStatement() partitionOfRecords.foreach(record => { stmt.addBatch("insert into tb_cominfo (comdate,comdetail,comjudge) values (now(),'" + record._1 + "','" + record._2 + "')") }) stmt.executeBatch() connect.commit() }) })
结果:
到此为止原理都通了。
有的代码是以前看别人的博客的, 时间太长我不记得了。
0 0
- Java与SparkStreaming的Socket通信,结果保存至mysql
- JAVA SOCKET与TUXEDO通信的问题
- android与pc的socket通信JAVA
- Java与C之间的socket通信
- flex与JAVA的SOCKET通信
- Java与C之间的socket通信
- Java与C之间的socket通信
- C Socket与Java Socket之间的通信
- java的socket通信
- Java的Socket通信
- java socket与 flex 通信
- java与VC通信-socket
- Flex Socket与java通信
- flex socket与Java通信
- Java socket与iOS socket通信问题
- java下的socket通信与C/C++下的socket通信
- sparkstreaming保存的kafka数据offset
- java 与 c/c++的socket通信问题
- EMC、Pure和NetApp推新品,NAS闪存场景在哪里
- 四边形不等式优化_石子合并问题_C++
- linux入门:进程间通信之匿名管道
- PAT甲级1022. Digital Library (30)
- 一些短代码
- Java与SparkStreaming的Socket通信,结果保存至mysql
- 2017.2.27
- 该站点安全证书的吊销信息不可用,是否继续?
- 数据库设计(下)
- 数据结构备忘一
- 如何让vim编辑器永久显示行号
- 跟小博老师一起学Servlet ——Servlet之过滤器实现和应用
- 使用Java完成byte数组与十六进制字符串相互转换
- 未完成-PAT甲级练习1066. Root of AVL Tree (25)