裝了一個多星期的hive on spark 遇到了許多坑。還是寫一篇隨筆,免得以后自己忘記了。同事也給我一樣苦逼的人參考。
先說明一下,這里說的Hive on Spark是Hive跑在Spark上,用的是Spark執行引擎,而不是MapReduce,和Hive on Tez的道理一樣。
先看官網的資源Hive on Spark: Getting Started
要想在Hive中使用Spark執行引擎,第一步當前就是環境設置,我們需要在Hive啟動的時候加載spark-assembly-1.5.0-hadoop2.6.0.jar,最簡單的方法是把spark-assembly-1.5.0-hadoop2.6.0.jar包直接拷貝 到$HIVE_HOME/lib目錄下。我采用的方法是在hive-site里面添加spark.home。具體給出官方的建議,這個不算坑,基本都能做好。
好了到這里開始講我遇到的坑
第一個坑:直接使用spark pre-build版本,下來后按照上面配置弄結果報錯
java.lang.NoSuchFieldError: SPARK_RPC_CLIENT_CONNECT_TIMEOUT
at org.apache.hive.spark.client.rpc.RpcConfiguration.<clinit>(RpcConfiguration.java:46)
報了rpc錯誤,這個坑要好查點,發現是因為需要自己編譯spark因為預編譯的帶了hive的支持也就是-Phive,這個參數是spark-sql對hive的支持用的,結果用在hive on spark就不行。沒事,我們開始編譯吧。接下來苦逼日子來了。
第二
個坑:版本不對,剛開始以為hive 能使用 spark的任何版本,結果發現錯了,hive對spark版本有着嚴格要求,具體對應版本你可以下載hive源碼里面,搜索他pom.xml文件里面的spark版本,如果版本不對,啟動hive后會報錯。具體錯誤如下:
Failed to execute spark task, with exception 'org.apache.hadoop.hive.ql.metadata.HiveException(Failed to create spark client.)' FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.spark.SparkTask
第三個坑:spark的編譯,在這里我使用的是hive穩定版本2.01,查看他的pom.xml需要的spark版本是1.5.0.接着講訴我遇到坑爹的事情,直接讓我快一個星期時間白費。在編譯的時候使用了hive 官網提供的命令,悲催的事情發生了,使用的命令是:
.
/make-distribution
.sh --name
"hadoop2-without-hive"
--tgz
"-Pyarn,hadoop-provided,hadoop-2.6"
然后將 lib/spark-assembly-1.5.0-hadoop2.6.0.jar 這個包拷到你現在的spark/lib 下另外一個相同的注意備份
但是當啟動spark集群的時候報錯了,錯誤如下
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
這個時候坑爹了,網上找來找去都沒找到這個問題解決方案,上面錯誤原因就是說slf4j這個包找不到,你妹,完全按照官網來的,官網是怎么測試的呀,悲催了。接下來就是苦惱我一周的安裝過程。
在網上找呀找,稍微看到一個靠譜的說法是編譯的時候沒有講hadoop的jar包導進來,但是給出解決辦法是在spark-env.sh里面添加
export SPARK_DIST_CLASSPATH=$(hadoop classpath)
好了添加了這個,spark master可以起來了,但是slaves仍然是上面錯誤,又開始找資料了。每天都在痛苦的閱讀英文文檔,差點抑郁了。而且國內google這不給力,用vpn時斷時續,差點砸電腦。最后快絕望的時候回到spark官網,仔細閱讀他提供的編譯命令,死馬當活馬醫吧。按照官網提供的編譯命令再次編譯spark.官網地址:http://spark.apache.org/docs/1.5.0/building-spark.html。他默認1.5.0使用是scala2.10進行編譯,但是我安裝的scala是2.11所以使用了以下命令。
./dev/change-scala-version.sh 2.11
mvn -Pyarn -Phadoop-2.4 -Dscala-2.11 -DskipTests clean package
這次編譯的spark-assembly-1.5.0-hadoop2.6.0.jar 包有140mb左右比上次的多了40mb,感覺有點靠譜了,將這個包移過去,ok了!太開心了,一切都跑起來了。淚奔了,hive官網害人呀。
第四個坑,這個坑也算一個不大不小的坑,因為我偶然想裝一下hue,在裝hue遇到的錯誤,現在記錄一下。
首先坑是hadoop的坑,如果在hadoop core-site.xml下面沒有配置
<property>
<name>hadoop.proxyuser.hdfs.hosts</name>
<value>*</value>
<description>Defines the Unix user, hdfs, that will run the HttpFS server as
a proxyuser.</description>
</property>
<property>
<name>hadoop.proxyuser.hdfs.groups</name>
<value>*</value>
<description>Replaces hdfs with the Unix user that will start the HttpFS server.
</description>
</property>
httpfs-site.xml
<property>
<name>hadoop.proxyuser.hue.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hue.groups</name>
<value>*</value>
</property>
hdfs-site.xml
<property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property>
這三個配置沒配好的你講沒有權限訪問hadoop,但是這個都是小事情,網上教程多,不怎么算坑。
接下來hive配置才是一個不大不小的坑,因為網上基本沒有什么資料,對應版本是hive是2.0.1
網上基本的版本都教了怎么連接,但是用網上連接方法hive.log老是顯示 old version ? 我一直以為我hive版本過高了,但是換成1.2.1這個版本一樣錯誤。
於是又開始看google,看的又快奔潰了。開始網上有人叫把hive.server2.authentication這個屬性改為NOSASL,但是改來改去沒啥卵用,好了我就不賣關子了,
hue要連接hive其實還需要修改兩個屬性
第一個屬性是hive.server2.authentication 這個要是NOSASl
第二個屬性是hive.server2.enable.doAs 一定要是flase 不然就會報 old version?
看到可視化界面的時候還是有點成就感的。
第五個坑,裝好了那么多東西,肯定想跑跑試試,於是覺得對nginx 日志進行分析,這時候對網上hive 分析 nginx進行了搜索,搜了一大堆,但是按他們的正則建表都不可以用,又開始淚奔了。
不停百度,資料結果全是千篇一律,好像大家抄的都是一篇。結果還是找呀找,終於找到原因了
原來正則必須不是一根斜杠,原來java必須是兩根\\把我建表sql展示一下,不然還是太空了。其中不需要out那一行,直接用input就行
create table logs(ipaddress STRING,identity STRING,`user` STRING,time STRING,request STRING,status STRING,size STRING,host STRING,referer STRING,rbody STRING,agent STRING,forwarded STRING,uaddr STRING,ustatus STRING,urtime STRING,rtime STRING)ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ('input.regex' =
'([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}) (-) (-) (\\[.*\\]) (\\"[^\\"]*\\") (\\d{3}) (\\d{1,}) (\\"[^\\"]*\\") (\\"[^\\"]*\") (-|[^\\s]*) (\\"[^\\"]*\\") (\\"[^\\"]*\\") ([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}:[0-9]{1,5}) (\\d{3}) ([\\d]{1,}\\.[\\d]{1,}) ([\\d]{1,}\\.[\\d]{1,})')
接下來可以跑了,扔了一個sql,你妹又報錯了
return code 3 from org.apache.hadoop.hive.ql.exec.spark.SparkTask
這個坑不算大,因為通過查找hive,spark日志發現原來spark找不到org.apache.hadoop.hive.contrib.serde2.RegexSerDe
這個網上解決方法就多了,就是加上hive.aux.jars.path 這個屬性里面你這個jar包地址如果是本地的記住前面要加file://哦不然找不到
好了這是安裝hive on spark 遇到的一些坑,希望我的資料能對需要的人有些幫助吧。個人總結:遇到不會的別看網上的文章了,全是千篇一律,還是看官網的資料跟官網論壇,比看那些安裝篇強上太多。