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