您的位置:首页 > 编程语言 > Java开发

在CDH5.4.5版本中使用Scala+sbt+Eclipse+Java遇到的问题总结

2017-03-02 15:05 477 查看
-系统: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala eclipse CDH5-4-5 spark
相关文章推荐