为了做一个基于hive的大数据采集平台,最近踩了不少的坑。
首先是想采用开源的项目代码搭建hadoop+hive+spark+hbase+sqoop平台的,hadoop采用2.7.7,spark用spark-2.3.0-bin-hadoop2.7,hbase用hbase-2.1.0,sqoop比较坑爹,只有1.4.7版本和1.99版本。了解过的人都不会用1.99版本,所以优先选择sqoop-1.4.7.bin-hadoop-2.6.0,。hive先用过apache-hive-3.1.1-bin,后降级到apache-hive-2.3.5-bin还是不行。
以上任何一个模块单独使用都没有问题。但是引入sqoop以后就坑爹了。首先sqoop多年不见更新,最新的sqoop-1.4.7只能基于hadoop-2.6.0,导致整个框架版本选项失败,实际应用中出现了好多坑,先后降级hive还是搞不定。最后把hive改成hive-1.1.0,结果hadoop版本又过高,实例化错误。坑太多了,就不一一列举了。
这个版本最后sqoop是没有成功的,但是通过spark读取oracle数据写入hive或者hbase还是可以成功的。
后期了解到cdh的版本集成比较好,网上的视频课程也采用cdh5.7,因此决定改用cdh5.7重新搭建环境。
从cdh官网看到,cdh早就知道sqoop有坑,所以一直到最新的(2019年6月18日发布更新)cdh5.16还是采用hadoop2.6+hive1.1+hbase1.2+sqoop1.4.6。
cdh5.7的环境安装过程没有出现什么意外,依次安装了java1.8,hadoop2.6,hive1.1,hbase1.2,sqoop1.4.6.
安装完成以后执行sqoop命令,出现了两个坑。
第一个坑,json包没有,导致报错。知道了是缺少json-java.jar包,但是到处都下载不到jar包,花了半个小时终于在下面 的链接里面找到了靠谱的下载方法。
附上链接地址:https://www.cnblogs.com/byfboke/p/10000578.html
报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONObject
at org.apache.sqoop.util.SqoopJsonUtil.getJsonStringforMap(SqoopJsonUtil.java:43)
at org.apache.sqoop.SqoopOptions.writeProperties(SqoopOptions.java:785)
at org.apache.sqoop.metastore.hsqldb.HsqldbJobStorage.createInternal(HsqldbJobStorage.java:399)
......
原因:sqoop缺少java-json.jar包.
解决:
这是因为sqoop缺少java-json.jar包.
下载java-json.jar包:
http://www.java2s.com/Code/Jar/j/Downloadjavajsonjar.htm
把java-json.jar添加到../sqoop/lib目录:
cp java-json.jar /sqoop/lib
第二个坑,htc环境变量配置:
报错:
19/06/27 11:04:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 19/06/27 11:04:24 INFO Configuration.deprecation: mapred.jar is deprecated. Instead, use mapreduce.job.jar Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hive/hcatalog/mapreduce/HCatOutputFormat at org.apache.sqoop.mapreduce.DataDrivenImportJob.getOutputFormatClass(DataDrivenImportJob.java:199) at org.apache.sqoop.mapreduce.ImportJobBase.configureOutputFormat(ImportJobBase.java:94) at org.apache.sqoop.mapreduce.ImportJobBase.runImport(ImportJobBase.java:259) at org.apache.sqoop.manager.SqlManager.importTable(SqlManager.java:692) at org.apache.sqoop.manager.OracleManager.importTable(OracleManager.java:444) at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:497) at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:605) at org.apache.sqoop.Sqoop.run(Sqoop.java:143) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227) at org.apache.sqoop.Sqoop.main(Sqoop.java:236) Caused by: java.lang.ClassNotFoundException: org.apache.hive.hcatalog.mapreduce.HCatOutputFormat at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 13 more
处理方法:baidu一下很容知道是包引用问题,但是解决方案没有找到靠谱的。几经周转,在stackoverflow上找到一个看上去很靠谱的方法,链接如下。经过尝试,确实很靠谱。
就是在.bash_profile文件里面新增一个环节变量,把hcatalog配置进去。
我的配置如下:
export HCAT_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0/hcatalog
https://stackoverflow.com/questions/37219921/exception-in-thread-main-java-lang-noclassdeffounderror-org-apache-hive-hcata
解决了以上两个问题,终于到了见证奇迹的时刻。
前前后后,断断续续高了两个月了,终于看到一次成功的了。