昨天的问题
(扩展)留一个问题?DeadLock.java ---> 产生一个死锁
(*) 如果java产生了死锁,怎么找到死锁?---> 诊断工具:Thread Dump(文本) ---> 包含了JVM所有Java线程的状态
Windonw: Ctrl+Break 键(fn+B)
Linux命令: kill -3 pid
Java stack information for the threads listed above:
===================================================
"Thread-1":
at ThreadB.run(DeadLock.java:68)
- waiting to lock <0xa0a46258> (a java.lang.Object)
- locked <0xa0a46260> (a java.lang.Object)
"Thread-0":
at ThreadA.run(DeadLock.java:41)
- waiting to lock <0xa0a46260> (a java.lang.Object)
- locked <0xa0a46258> (a java.lang.Object)
Found 1 deadlock.
(1) hadoop: 数据仓库Hive ---> 支持JDBC方式
(2) spark: 支持JDBC
2、什么是JDBC? 标准的API接口
主要的类和接口:
(1)类:DriverManager 管理数据库驱动(jar包)
(2)接口:Connection 数据库的链接
Statement SQL的运行环境
ResultSet select的结果
3、开发JDBC程序
(1)Java程序
(2)开发一个Spark的JDBC程序
(*) 执行开发JDBC
(*) Spark提供API: JdbcRDD.scala ---> 执行select
Scala语言:看成Java升级版
大数据的处理过程:


(扩展)留一个问题?DeadLock.java ---> 产生一个死锁
(*) 如果java产生了死锁,怎么找到死锁?---> 诊断工具:Thread Dump(文本) ---> 包含了JVM所有Java线程的状态
Windonw: Ctrl+Break 键(fn+B)
Linux命令: kill -3 pid
Java stack information for the threads listed above:
===================================================
"Thread-1":
at ThreadB.run(DeadLock.java:68)
- waiting to lock <0xa0a46258> (a java.lang.Object)
- locked <0xa0a46260> (a java.lang.Object)
"Thread-0":
at ThreadA.run(DeadLock.java:41)
- waiting to lock <0xa0a46260> (a java.lang.Object)
- locked <0xa0a46258> (a java.lang.Object)
Found 1 deadlock.
一、JDBC基础
1、学习大数据,需要JDBC?---> 参考课程讲义:Hadoop和Spark(1) hadoop: 数据仓库Hive ---> 支持JDBC方式
(2) spark: 支持JDBC
2、什么是JDBC? 标准的API接口
主要的类和接口:
(1)类:DriverManager 管理数据库驱动(jar包)
(2)接口:Connection 数据库的链接
Statement SQL的运行环境
ResultSet select的结果
3、开发JDBC程序
(1)Java程序
(2)开发一个Spark的JDBC程序
(*) 执行开发JDBC
(*) Spark提供API: JdbcRDD.scala ---> 执行select
Scala语言:看成Java升级版
大数据的处理过程:
数据(txt文件) ---> Spark任务中 ------> JDBC的方式,保存到Oracle数据库
二、 Scala语言
package oracle
import java.sql.{Connection, DriverManager, PreparedStatement}
import org.apache.spark.{SparkConf, SparkContext}
object DemoOracle {
//定义主方法
def main(args: Array[String]): Unit = {
//创建一个SparkContext对象
//setMaster("local") 在本地运行Spark任务
val conf = new SparkConf().setAppName("My Oracle Demo 1").setMaster("local")
val sc = new SparkContext(conf)
//读入数据 ---> RDD集合 ---> 有分区组成 ---> 通过迭代器
//使用RDD的算子----> 方法
val rdd1 = sc.textFile("d:\\temp\\student.txt").map(line =>{
//对读入的每一行进行操作 1,Tom,23 ---> 集合
//分词
val words = line.split(",") //words 看成一个数组
//返回这行 的结果 ---> 元组
(words(0),words(1),words(2))
})
//输出
//println(rdd1.collect().toBuffer)
//将结果存入Oracle
rdd1.foreachPartition(saveToOracle)
sc.stop()
}
//定义一个方法将数据存入Oracle: insert
//参数:分区中的迭代器
def saveToOracle(it:Iterator[(String,String,String)]) ={
//JDBC程序
var conn:Connection = null
var pst:PreparedStatement = null
try{
//得到Connection
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.88.101:1521/orcl.example.com","scott","tiger")
//创建运行环境
pst = conn.prepareStatement("insert into student values(?,?,?)")
//通过循环将每个分区中迭代器中的数据插入到Oracle
//data: [1,Tom,23]
it.foreach(data =>{
pst.setInt(1,data._1.toInt)
pst.setString(2,data._2)
pst.setInt(3,data._3.toInt)
pst.executeUpdate()
})
}catch{
case e1:Exception => println("Some Error Happened." +e1.getMessage)
}finally {
//释放资源
if(pst != null) pst.close()
if(conn != null) conn.close()
}
}
}
package oracle
import java.sql.DriverManager
import org.apache.spark.rdd.JdbcRDD
import org.apache.spark.{SparkConf, SparkContext}
object DemoOracle1 {
//定义变量代表数据库的链接
//可以把函数付给变量
var connection = () =>{
DriverManager.getConnection("jdbc:oracle:thin:@192.168.88.101:1521/orcl.example.com","scott","tiger")
}
def main(args: Array[String]): Unit = {
//创建一个SparkContext对象
//setMaster("local") 在本地运行Spark任务
val conf = new SparkConf().setAppName("My Oracle Demo 1").setMaster("local")
val sc = new SparkContext(conf)
//执行查询: select * from emp where deptno=? and sal > ?
/*
参数说明:
sc : org.apache.spark.SparkContext, SparkContext对象
getConnection : scala.Function0[java.sql.Connection], 数据库的链接
sql : scala.Predef.String, SQL语句
lowerBound : scala.Long, 下边界:SQL语句的第一个参数
upperBound : scala.Long, 上边界:SQL语句的第二个参数
numPartitions : scala.Int, 结果RDD的分区数
mapRow : scala.Function1[java.sql.ResultSet, T] 查询的结果
*/
val oracleRdd = new JdbcRDD(sc,connection,"select * from emp where deptno=? and sal>?",10,2000,1,r=>{
//通过匿名函数处理
var ename = r.getString("ename")
var sal = r.getInt("sal")
//返回结果
(ename,sal)
})
//执行任务
val result = oracleRdd.collect()
println(result.toBuffer)
//停止
sc.stop()
}
}
三、为什么需要知道JDBC?
- 因为:Hive
- 构建在Hadoop上的数据仓库平台,为数据仓库管理提供了许多功能
- 起源自facebook由Jeff Hammerbacher领导的团队
- 2008年facebook把hive项目贡献给Apache
- 定义了一种类SQL语言HiveQL。可以看成是仍SQL到Map-Reduce的映射器
- 提供Hive shell、JDBC/ODBC、Thrift客户端等接
四、为什么需要Java动态代理对象
备注: 在linux下,执行hadoop命令是: #hdsfs dfs-put a.avi /move , 中间的hdfs dfs 是hadoop的命令前缀