前面我们已经把大数据平台搭建完成了,接下来是怎么应用大数据这件威力巨大的武器了。因为作者目前在一家传统型制造企业,很多业务和数据都是基于传统关系型数据库展开的,数据源大部分都存在Oracle、Mysql、PostgreSQL等传统关系型数据库,所以如何跟大数据平台建立联系,或者说让大数据技术更接地气,是应用大数据技术最好的实践。本文从一个初学者的角度去实践Spark访问Oracle数据库的过程。
CREATE TABLE EMP
(
EMPNO NUMBER,
ENAME VARCHAR (10),
JOB VARCHAR (9),
MGR NUMBER,
SAL NUMBER,
COMM NUMBER,
DEPTNO NUMBER
);
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, 800, 50, 20);
INSERT INTO EMP VALUES
(7499, 'ALLEN', 'SALESMAN', 7698, 1600, 300, 30);
INSERT INTO EMP VALUES
(7521, 'WARD', 'SALESMAN', 7698, 1250, 500, 30);
INSERT INTO EMP VALUES
(7566, 'JONES', 'MANAGER', 7839, 2975, NULL, 20);
INSERT INTO EMP VALUES
(7654, 'MARTIN', 'SALESMAN', 7698, 1250, 1400, 30);
INSERT INTO EMP VALUES
(7698, 'BLAKE', 'MANAGER', 7839, 2850, NULL, 30);
INSERT INTO EMP VALUES
(7782, 'CLARK', 'MANAGER', 7839, 2450, NULL, 10);
INSERT INTO EMP VALUES
(7788, 'SCOTT', 'ANALYST', 7566, 3000, NULL, 20);
INSERT INTO EMP VALUES
(7839, 'KING', 'PRESIDENT', NULL, 5000, NULL, 10);
INSERT INTO EMP VALUES
(7844, 'TURNER', 'SALESMAN', 7698, 1500, 0, 30);
INSERT INTO EMP VALUES
(7876, 'ADAMS', 'CLERK', 7788, 1100, NULL, 20);
INSERT INTO EMP VALUES
(7900, 'JAMES', 'CLERK', 7698, 950, NULL, 30);
INSERT INTO EMP VALUES
(7902, 'FORD', 'ANALYST', 7566, 3000, NULL, 20);
INSERT INTO EMP VALUES
(7934, 'MILLER', 'CLERK', 7782, 1300, NULL, 10);
CREATE TABLE DEPT
(
DEPTNO NUMBER,
DNAME VARCHAR (14),
LOC VARCHAR (13)
);
INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');
COMMIT;
基于前面搭建好的大数据平台,调用启动集群脚本start-cluster.sh
,启动完成后登陆http://master:50070 和http://master:8080网页访问Hadoop和Spark,验证集群有没有启动成功。
3.1. 集群成功启动后,进入Shell,因为笔者采用的是python脚本,所以通过pyspark命令来实现数据库操作任务,在spark集群上启动pyspark命令如下:
./bin/pyspark --jars “/home/spark/jars/ojdbc6.jar” --master spark://master:7077,worker1:7077,worker2:7077 --num-executors 1 --driver-memory 1g --executor-memory 1g
启动成功的页面如下:
3.2. 启动成功后,需要跟Oracle建立连接,我们都知道要跟数据库连接常用的有ODBC、JDBC,我们这里采用的是JDBC,要通过JDBC连接Oracle数据库就需要下载Oracle提供的驱动程序,根据本地Java版本Oracle官网上有下载,作者调用的Oracle数据库版本是11g,本地安装的Java是1.8版本的,所下载的JDBC驱动程序是Oracle Database 11g Release 2 (11.2.0.4) JDBC Drive
通过SQL语句查询Oracle数据库版本和查询Java版本的方式如下:
下载完jdbc驱动后得到的是一个ojdbc6.jar
文件,为了方便管理,一定要把这个jar包放在${SPARK_HOME}/jars
目录下,这个目录是存放跟spark交互相关的jar包的。
3.3. 通过pyspark交互平台查询数据库表结构和表里面的数据。
empDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:oracle:thin:username/password@//hostname:portnumber/SID") \
.option("dbtable", "hr.emp") \
.option("user", "db_user_name") \
.option("password", "password") \
.option("driver", "oracle.jdbc.driver.OracleDriver") \
.load()
empDF.printSchema()
empDF.show()
query = "(select empno,ename,dname from emp, dept where emp.deptno = dept.deptno) emp"
empDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:oracle:thin:username/password@//hostname:portnumber/SID") \
.option("dbtable", query) \
.option("user", "db_user_name") \
.option("password", "password") \
.option("driver", "oracle.jdbc.driver.OracleDriver") \
.load()
empDF.printSchema()
empDF.show()