之前疫情在家,參加了阿裡雲的在家雲實踐,白嫖了半年的雲伺服器,感覺體驗還不錯。最近推出有 阿裡雲活動 ,1vCPU,2G記憶體的主機一年隻要94,忍不住又沖了一波,用來裝個完整的大資料環境。大緻順序如下:
- 安裝
Java
-
Hadoop 3.1.3
-
Anaconda3
-
Scala 2.11.12
-
Spark 2.4.0
-
sbt 0.13.11
-
Kafka 0.10.2.0
主要參考林子雨老師的部落格,剩下的
HBase,Hive
啥的,以後有時間再慢慢配置。這裡記錄一下安裝過程中出現的問題。
1、 檢視Hadoop版本報錯
在
Java
環境變量已經配置完成後,安裝
Hadoop 3.1.3
,檢視版本時報錯。
./bin/hadoop version ERROR: JAVA_HOME is not set and could not be found.
檢查環境變量:
java -version java version "1.8.0_162" Java(TM) SE Runtime Environment (build 1.8.0_162-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode) echo $JAVA_HOME /usr/lib/jvm/jdk1.8.0_162
都是正常的,但是
Hadoop
還是無法找到
Java
。查了一下還需要在
../hadoop/etc/hadoop/hadoop-env.sh
中聲明
Java
的路徑。
cd /usr/local/hadoop/etc/ vim hadoop-env.sh
在裡面加上
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_162
,再次運作檢視版本的指令就成功了。
./bin/hadoop version Hadoop 3.1.3 Source code repository https://gitbox.apache.org/repos/asf/hadoop.git -r ba631c436b806728f8ec2f54ab1e289526c90579 Compiled by ztang on 2019-09-12T02:47Z Compiled with protoc 2.5.0 From source with checksum ec785077c385118ac91aadde5ec9799 This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common-3.1.3.jar
2、 啟動Scala shell報錯
安裝完Scala,一啟動就報錯,淦!!!!!!!!!
./bin/scala Welcome to Scala 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_162). Type in expressions for evaluation. Or try :help. [ERROR] Failed to construct terminal; falling back to unsupported java.lang.NumberFormatException: For input string: "0x100" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.valueOf(Integer.java:766) at jline.internal.InfoCmp.parseInfoCmp(InfoCmp.java:59) at jline.UnixTerminal.parseInfoCmp(UnixTerminal.java:242) at jline.UnixTerminal.<init>(UnixTerminal.java:65) at jline.UnixTerminal.<init>(UnixTerminal.java:50) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at java.lang.Class.newInstance(Class.java:442) at jline.TerminalFactory.getFlavor(TerminalFactory.java:211) at jline.TerminalFactory.create(TerminalFactory.java:102) at jline.TerminalFactory.get(TerminalFactory.java:186) at jline.TerminalFactory.get(TerminalFactory.java:192) at jline.console.ConsoleReader.<init>(ConsoleReader.java:243) at jline.console.ConsoleReader.<init>(ConsoleReader.java:235) at jline.console.ConsoleReader.<init>(ConsoleReader.java:223) at scala.tools.nsc.interpreter.jline.JLineConsoleReader.<init>(JLineReader.scala:64) at scala.tools.nsc.interpreter.jline.InteractiveReader.<init>(JLineReader.scala:33) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at scala.tools.nsc.interpreter.ILoop$$anonfun$scala$tools$nsc$interpreter$ILoop$$instantiater$1$1.apply(ILoop.scala:858) at scala.tools.nsc.interpreter.ILoop$$anonfun$scala$tools$nsc$interpreter$ILoop$$instantiater$1$1.apply(ILoop.scala:855) at scala.tools.nsc.interpreter.ILoop.scala$tools$nsc$interpreter$ILoop$$mkReader$1(ILoop.scala:862) at scala.tools.nsc.interpreter.ILoop$$anonfun$22$$anonfun$apply$10.apply(ILoop.scala:873) at scala.tools.nsc.interpreter.ILoop$$anonfun$22$$anonfun$apply$10.apply(ILoop.scala:873) at scala.util.Try$.apply(Try.scala:192) at scala.tools.nsc.interpreter.ILoop$$anonfun$22.apply(ILoop.scala:873) at scala.tools.nsc.interpreter.ILoop$$anonfun$22.apply(ILoop.scala:873) at scala.collection.immutable.Stream.map(Stream.scala:418) at scala.tools.nsc.interpreter.ILoop.chooseReader(ILoop.scala:873) at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$newReader$1$1.apply(ILoop.scala:893) at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.newReader$1(ILoop.scala:893) at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.scala$tools$nsc$interpreter$ILoop$$anonfun$$preLoop$1(ILoop.scala:897) at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1$$anonfun$startup$1$1.apply(ILoop.scala:964) at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:990) at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:891) at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:891) at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97) at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:891) at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:74) at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87) at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98) at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103) at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) scala>
但是好像不影響使用。修改
.profile
可以解決這個問題。
cd vim .profile # 添加export TERM=xterm-color source .profile
這樣就解決了。但是不知道是為什麼解決的,看了幾個部落格,都是這樣那樣再這樣,就OK了。前幾天剛安裝了一遍
Scala 2.11.12
,那時候還好好的,這會兒就出問題了。
3、 配置PYSPARK
pyspark的互動式環境本身不需要配置,執行以下指令就可以打開pyspark:
cd /usr/local/spark ./bin/pyspark
使用的
Python
版本是系統的預設
Python
版本,也就是你在終端中輸入python打開的那一個(之前已經安裝好了
Anaconda3
,此時用的就是
Anaconda3
自帶的
Python
版本)。但是你在這個
Python
中卻無法導入pyspark相關的包。
>>> from pyspark.sql import Row Traceback (most recent call last): File "<stdin>", line 1, in <module> ModuleNotFoundError: No module named 'pyspark'
需要配置環境變量,在
~/.bashrc
中添加以下的幾行:
export HADOOP_HOME=/usr/local/hadoop export SPARK_HOME=/usr/local/spark export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.7-src.zip:$PYTHONPATH export PYSPARK_PYTHON=python export PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$PATH
記得source一下讓環境變量生效。這時候再去導入相關的包就不會報錯了。上面那些其實也順便配置了
Hadoop
和
Spark
的環境變量,理論上來說,如果你就隻想用預設的
Python
版本跑pyspark,那隻要加上PYTHONPATH的那一行就行了。
4、 SBT換源
一開始用的是華為的源,而且似乎源也沒給全,會報包下載下傳失敗的錯誤。想了一下我是在阿裡雲的伺服器上,用阿裡雲的源大概快點?并沒有
vim ~/.sbt/repositories
[repositories] aliyun-maven-repo:
https://maven.aliyun.com/repository/public
aliyun-nexus:
https://maven.aliyun.com/nexus/content/groups/public/
typesafe:
https://repo.typesafe.com/typesafe/ivy-releases/,
[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/
artifact
.[ext], bootOnly maven-central sonatype-oss-releases sonatype-oss-snapshots ivy-sbt-plugin:
https://dl.bintray.com/sbt/sbt-plugin-releases/,
[organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/
artifact
.[ext]
換了sbt的版本,改用sbt1.3.8,參考
sbt無痛入門指南換源,速度快了很多。
5、 Maven換源
參考
将Maven源改為國内阿裡雲倉庫。
6、 阿裡雲伺服器安裝HBase
這個有點坑,一開始完全想不到問題出在這裡。打開HBase Shell,運作所有指令都會報錯。
ERROR: KeeperErrorCode = NoNode for /hbase/master
說是找不到master,啟動HBase之後執行jps是有HMaster的。最後檢查了很久,發現HDFS中沒有hbase檔案夾,這時候才想起來配置
hbase-site.xml
的時候有個地方疏忽了。
<configuration> <property> <name>hbase.rootdir</name> <value>hdfs://xxx.xxx.xxx.xxx:9000/hbase</value> 此處要填寫你的阿裡雲内網IP </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.unsafe.stream.capability.enforce</name> <value>false</value> </property> </configuration>
雲伺服器ECS位址:阿裡雲·雲小站