在CDH5.4.5版本中使用Scala+sbt+Eclipse+Java遇到的問題總結

-系統:windows 7 64位
-CDH版本:5.4.5
-JDK版本:1.8.0_111
-Scala版本:2.10.4
-Eclipse版本:Scala IDE for eclipse-neon
-sbt版本:0.13.13

Eclipse編寫Scala代碼,sbt打包,Spark執行

安裝Eclipse後新建工程,寫入兩個學生的信息到CDH集羣的HBase中,建一個ScalaWriteToHbase.scala,代碼如下

object ScalaWriteToHbase {

  def main(args: Array[String]): Unit = {
    val ConfSpark = new SparkConf()
    ConfSpark.setAppName("ScalaWriteToHbase")
    ConfSpark.setMaster("spark://matrix-hadoop-1:7077")
    val sc = new SparkContext(ConfSpark)
    val tablename = "student"
    sc.hadoopConfiguration.set(TableOutputFormat.OUTPUT_TABLE, tablename)
    sc.hadoopConfiguration.set("hbase.zookeeper.quorum","matrix-hadoop-6,matrix-hadoop-7,matrix-hadoop-8")  
    sc.hadoopConfiguration.set("hbase.zookeeper.property.clientPort", "2181")  

    val job = new Job(sc.hadoopConfiguration)
    job.setOutputKeyClass(classOf[ImmutableBytesWritable])
    job.setOutputValueClass(classOf[Result])
    job.setOutputFormatClass(classOf[TableOutputFormat[ImmutableBytesWritable]])

    val indataRDD = sc.makeRDD(Array("1,px,M,29", "2,lc,F,20"))
    val rdd = indataRDD.map(_.split(',')).map { arr =>
      {
        val put = new Put(Bytes.toBytes(arr(0))) 
        put.add(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes(arr(1)))
        put.add(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes(arr(2)))
        put.add(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes(arr(3)))
        (new ImmutableBytesWritable, put)
      }
    }
    rdd.saveAsNewAPIHadoopDataset(job.getConfiguration())
    sc.stop
  }
} 

將scala代碼複製到D盤的tmp目錄中,新建build.sbt文件,打開該文件添加以下內容:

name := "WriteToHBase"
version := "1.0"
scalaVersion := "2.10.4"   

//CDH5.4.5不支持scala2.11.X及以上版本以及不支持java1.7以上版本

libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.10" % "1.3.0-cdh5.4.5",
  "org.apache.hbase" % "hbase-client"    % "1.0.0-cdh5.4.5",
  "org.apache.hbase" % "hbase-common"    % "1.0.0-cdh5.4.5",
  "org.apache.hbase" % "hbase-server"    % "1.0.0-cdh5.4.5"
)

resolvers ++= Seq( 
  "cloudera" at "https://repository.cloudera.com/artifactory/cloudera-repos/"

) 

externalResolvers ++= Seq(
  "cloudera" at "https://repository.cloudera.com/artifactory/cloudera-repos/",
  "Central Repository" at "http://central.maven.org/maven2/"
)

設置resolvers目的類似於maven中的repositories,添加外部依賴庫。externalResolvers是遠程外部依賴庫。

cmd到windows中的D盤tmp目錄下,敲擊命令:
sbt package
將代碼利用sbt打包成一個jar文件,jar文件位於一個~/target/…中,將打包好的jar包複製到集羣的某個主機中進行任務發佈。
進入到spark安裝路徑根目錄\bin中,執行下列命令:

./spark-submit --class "ScalaWriteToHbase" /tmp/writetohbase_2.10-1.0.jar 

成功。

需要注意的問題:

  • spark和scala版本需要對應,在本例中,CDH中的spark版本爲1.3.0,所以不能使用spark2.0版本的類庫,Scala也不能使用2.11.X及以上版本,否則在集羣中無法發佈任務,打開Eclipse,如下操作:

Window->Scala->Installations->Add

改成使用scala 2.10.4

  • 由於Scala IDE for Eclipse-neon只能運行jdk1.8以上版本,否則無法打開該軟件,而用sbt將.scala文件打包成jar包複製到集羣中運行會出現任務執行失敗。
    最終解決辦法是在Eclipse中安裝並默認使用jdk1.7.0_67版本的jdk,sbt也要使用jdk1.7版本進行編譯。

Window->Java->Installed JREs->Add

改成默認使用jdk1.7.0_67進行編譯

修改sbt的配置文件,進入sbt安裝路徑根目錄\bin中,打開sbt-launch.jar 文件,在SBT_HOME下面添加如下一行

set JAVA_HOME=D:\Program Files\Java\jdk1.7.0_67

最終顯示部分內容如下:

@REM SBT launcher script
@REM 
@REM Environment:
@REM JAVA_HOME - location of a JDK home dir (mandatory)
@REM SBT_OPTS  - JVM options (optional)
@REM Configuration:
@REM sbtconfig.txt found in the SBT_HOME.

@REM   ZOMG! We need delayed expansion to build up CFG_OPTS later 
@setlocal enabledelayedexpansion

@echo off
set SBT_HOME=%~dp0
----------

set JAVA_HOME=D:\Program Files\Java\jdk1.7.0_67

----------
rem FIRST we load the config file of extra options.
set FN=%SBT_HOME%\..\conf\sbtconfig.txt
set CFG_OPTS=
FOR /F "tokens=* eol=# usebackq delims=" %%i IN ("%FN%") DO (
  set DO_NOT_REUSE_ME=%%i
  rem ZOMG (Part #2) WE use !! here to delay the expansion of
  rem CFG_OPTS, otherwise it remains "" for this loop.
  set CFG_OPTS=!CFG_OPTS! !DO_NOT_REUSE_ME!
)

rem poor man's jenv (which is not available on Windows)
IF DEFINED JAVA_HOMES (
  IF EXIST .java-version FOR /F %%A IN (.java-version) DO (
    SET JAVA_HOME=%JAVA_HOMES%\%%A
    SET JDK_HOME=%JAVA_HOMES%\%%A
  )
)
rem must set PATH or wrong javac is used for java projects
IF DEFINED JAVA_HOME SET PATH=%JAVA_HOME%\bin;%PATH%
...

這樣sbt就默認使用jdk1.7.0_67版本編譯了

  • sbt遠程下載的jar包默認放在C盤中,需要修改下載位置。進入sbt安裝根目錄\conf,打開sbtconfig.txt文件,修改內容如下:
# Set the java args to high

-Xmx512M
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=128m

# Set the extra SBT options

-Dsbt.log.format=true
#依賴包的下載位置
-Dsbt.ivy.home=D:\toolkit\ivy   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章