大数据应用1:Spark分析处理Oracle大表

0、制造测试数据

https://blog.csdn.net/lizhangyong1989/article/details/45013509

 

生产一千万条测试数据总共四个字段,每次插入一百万的数据耗时110秒左右

create table TestTable as

select rownum as id,

to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,

trunc(dbms_random.value(0, 100)) as random_id,

dbms_random.string('x', 20) random_string

from dual

connect by level <= 1000000;

因为不能一次性插入一千万,所以分十次,一千万数据量插入约为1200秒即20分钟

insert into TestTable

(ID, INC_DATETIME, RANDOM_ID, RANDOM_STRING)

select rownum as id,

to_char(sysdate + rownum / 24 / 3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,

trunc(dbms_random.value(0, 100)) as random_id,

dbms_random.string('x', 20) random_string

from dual

connect by level <= 1000000;

 

1、在Oracle数据库表TestTable进行排序然后在写入到Oracle数据库中记录耗费时间

insert into TESTTABLE_SORTED

select * from TESTTABLE t order by t.random_id desc;

commit;

 

2、用sqoop将Oracle表TestTable数据抽取到hdfs或者hive并记录耗费时间

执行命令:sqoop import --hive-import --connect jdbc:oracle:thin:@bi-db:1521:ora11g --username spark --password spark --table TestTable --hive-database default --hive-table TestTable -m 4

 

报错:ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.RuntimeException: Could not load db driver class: oracle.jdbc.OracleDriver

解决:下载Oracle的jdbc驱动odbc6.jarhttp://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html

并放到/opt/cloudera/parcels/CDH-5.10.0-1.cdh5.10.0.p0.41/lib/sqoop/lib

 

继续执行报错:ERROR tool.ImportTool: Imported Failed: There is no column found in the target table TestTable. Please ensure that your table name is correct

解决:将表名改成大写,sqoop import --hive-import --connect jdbc:oracle:thin:@bi-db:1521:ora11g --username spark --password spark --table TESTTABLE --hive-database default --hive-table TESTTABLE -m 4

 

继续执行报错:ERROR tool.ImportTool: Error during import: No primary key could be found for table TESTTABLE. Please specify one with --split-by or perform a sequential import with '-m 1'.

解决:根据错误提示我们可以知道这是因为Oracle表中的数据没有设置主键,两个办法,一是Oracle表中设置主键,然后再执行这个导入语句,二是将-m参数设置为1或者使用--split-by,后面跟上表的最后一列名字,从而能够对数据进行分行,这两种解决方法,推荐使用方法2,因为方法1只用一个map,效率太低,相比较而言,方法2可以自己设置map个数,效率会高一些。

最终执行命令为:sqoop import --hive-import --connect jdbc:oracle:thin:@bi-db:1521:ora11g --username spark --password spark --table TESTTABLE --hive-database default --hive-table TESTTABLE -m 4 --split-by ID

 

继续执行报错:WARN security.UserGroupInformation: PriviledgedActionException as:root (auth:SIMPLE) cause:org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x

解决办法:hadoop fs -ls /user

su - hdfs

 

继续执行报错:INFO mapreduce.Job: Task Id : attempt_1533565707706_0020_m_000001_0, Status : FAILED

Error: TESTTABLE : Unsupported major.minor version 52.0

解决办法:安装配置jdk的版本为1.7,cdh默认使用的jdk版本为1.7

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

 

继续执行报错:18/08/08 15:22:24 ERROR tool.ImportTool: Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://bi-hdm:8020/user/hdfs/TESTTABLE already exists

解决办法:删除hdfs上的文件/user/hdfs/TESTTABLE

hadoop fs -rm -R /user/hdfs/TESTTABLE

再次导入成功!

 

3、利用Spark内存计算来处理hive的数据并将数据写入到hdfs或hive并记录耗费时间

使用spark-shell操作hive

本机启动(默认使用1.6)

spark-shell --master local[4]

启用2.1的spark

spark2-shell --master local[4]

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

sqlContext.sql("use default")

sqlContext.sql("show tables").show

sqlContext.sql("select * from testtable order by RANDOM_ID desc").write.saveAsTable("testtable_sorted")

sqlContext.sql("select count(*) from testtable").show

 

Spark多种运行模式

https://www.jianshu.com/p/65a3476757a5

Standalone集群master

spark2-shell --master spark://bi-hdm:7077

 

使用spark-submit来提交,充分利用hadoop集群(待测试)

spark-submit \

--class org.apache.spark.examples.SparkPi \

--master yarn-cluster \

--executor-memory 2G \

--num-executors 3 \

test.jar \

4

 

删除hive表

drop table testtable_sorted;

drop table testtable;

 

4、随着表TestTable数据量增加对比上面两种方式所耗费的时间

spark+hive 1000w

开始时间 结束时间 花费时间

sqoop 16:46:18 16:47:18 60s

spark 16:47:59 16:49:53 54s(spark1.6执行时间)

 

oracle 1000w

开始时间 结束时间 花费时间

sort&insert 56s

 

spark+hive 2000w

开始时间 结束时间 花费时间

sqoop 18:18:14 18:19:48 94s

spark 18:37:11 18:39:59 168s->67s(前面这个时间是使用spark1.6执行,spark2.0以后性能有很大的提升)

 

oracle 2000w

开始时间 结束时间 花费时间

sort&insert 132s

展开阅读全文

没有更多推荐了,返回首页