前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于scala语言的Spark环境搭建

基于scala语言的Spark环境搭建

原创
作者头像
liddytang
修改2023-09-27 10:36:18
3890
修改2023-09-27 10:36:18
举报
文章被收录于专栏:屌丝程序媛

安装IntelliJ IDEA 、jdk、scala、Hadoop等环境

jdk版本:1.8.0_241

scala版本:2.13.1

hadoop版本:2.7.6

IntelliJ IDEA版本:2019.3.4(community Edition)

scala准备

  1. 下载JDK1.8 https://www.oracle.com/java/technologies/downloads/#java8 并安装、配置环境变量(JAVA_HOME),建议使用1.8;
  2. 下载scala-sdk https://www.scala-lang.org/download/all.html 并解压到某个路径(如:~/tools/scala-2.12.6),为方便使用还可以设置一下SCALA_HOME,在终端输入~/tools/scala-2.12.6/bin/scala(未设置SCALA_HOME)或scala(前提设置了SCALA_HOME)可以验证scala的版本或进行交互实验(scala官网推荐的图书《Programming in Scala, 3rd ed》中的实例均为在此模式下运行,故学习scala阶段到这一步就够了)
  3. 下载IntelliJ https://www.jetbrains.com/idea/ IDEA(Community"版即为免费版本)并安装,安装后安装Scala插件(plugin),如下图所示;

安装maven

maven安装路径

使用IDEA作为开发环境(默认已安装),该软件中自带maven,无需自己下载,将IDEA中的maven路径添加到环境变量即可

IDEA中的maven路径: {IDEA根路径}/Contents/plugins/maven/lib/maven3/bin

例如我的默认maven安装目录: /Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/maven/lib/maven3/bin/

在 ~/.bash_profile配置

MAVEN_HOME=/Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/maven/lib/maven3/

PATH=$MAVEN_HOME/bin:$PATH

maven的settings.xml配置

这里稍微贴下 setting.xml,setting.xml具体的配置还要根据个体的研发环境来定。

输入如下命令:mvn help:system,在用户目录下出现.m2文件夹,其中 settings.xml是我个人的 maven安装目录下conf(/Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/maven/lib/maven3/conf/)中拷贝过来的,如下所示:

  • settings.xml修改

在settings.xml中并修改本地仓库路径,本地仓库路径与实际使用的repository目录一致,例如 我的IDEA默认使用${user.home}/.m2/repository (见上图),故 settings.xml中localReposity为用户创建的目录${user.home}/.m2/repository;

proxies、servers、mirrors的配置

  • a.proxies结点中添加如下配置
代码语言:javascript
复制
<proxy>
      <id>dev</id>
      <active>true</active>
      <protocol>http</protocol>
      <username></username>
      <password></password>
      <host>127.0.0.1</host>
      <port>12639</port>
      <nonProxyHosts></nonProxyHosts>
    </proxy>
  • b.mirrors结点中添加如下配置:
代码语言:javascript
复制
<mirror>
      <id>oa_releases</id>
      <mirrorOf>oa_releases</mirrorOf>
      <name>oa_releases</name>
      <url>http://maven.oa.com/nexus/content/groups/public/</url>
    </mirror>
  • c.profiles结点中添加如下配置:
代码语言:javascript
复制
<profile>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>oa_releases</id>
          <name>internal repository</name>
          <url>http://maven.oa.com/nexus/content/groups/public/</url>
          <releases>
              <enabled>true</enabled> 
          </releases>
          <snapshots>
              <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>

配置好settings.xml后修改Intellij IDEA的maven配置,repository & settings.xml的目录需要与 IDEA Preference->Build...->Maven的配置目录一致,如下图:

maven 仓库

添加镜像仓库,更新setting.xml中的servers配置

maven 仓库适用于存储第三方依赖的地方,对应于pom.xml <dependency>标签

maven编译时,首先查找本地仓库(${user.home}/.m2/repository),若本地仓库没有对应的依赖库,会从外部的远程仓库下载,同时缓存在本地仓库中;

为了提高下载速度,会在两个resposity之间配置镜像仓库,在maven配置文件(setting.xml)里配置了<mirrors><mirror>..........</mirror></mirrors>,即定义了两个Repository之间的镜像关系。

测试Test

  • Create New Project
  • 选择项目类型为“Scala”
  • 默认没有Scala SDK,通过以下方式添加:Create->Browse…
  • 找到SCALA_HOME
  • 完成配置如下:
  • 为方便开发,将项目转换为maven项目以解决繁琐的依赖包问题,项目名右键–>Add Framework Support…
  • 项目会自动引入pom.xml,变为scala maven project,并在src下创建source root(可以在package上右键更改)
  • source root(该项目中为main.java)上右键–>New–>Scala Class
  • 选择类型为Object,用以创建main函数
  • 编写测试代码
  • 在代码空白处或项目名处右键–>Run 'ScalaTest’测试代码
  • 虽然引入了pom.xml,默认却不会自动import依赖包,出现提示选择“Auto-Import”
  • 测试结果如下:

注意先创建scala project再转换为maven project的方式,因为package name会包含main;创建的时候先选择maven或java project,通过“Add Framework Support…”再引入Scala SDK或maven的方式比较好,最终效果和图中给出的差不多,但是目录结构会有差异。

SCALA_HOME、JAVA_HOME在mac下设置方式

在~/.bash_profile中添加如下指令:

代码语言:javascript
复制
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home
export SCALA_HOME=/Users/<你的名字>/tools/scala-2.12.6
export PATH=$JAVA_HOME/bin:$SCALA_HOME/bin:$PATH

Hadoop集群(伪分布模式)安装

依赖项检查

jdk(hadoop与java版本兼容性参考https://cwiki.apache.org/confluence/display/hadoop/HadoopJavaVersions)、ssh;

执行ssh localhost若提示:

代码语言:javascript
复制
localhost: ssh: connect to host localhost port 22: Connection refused

则需要:

  • a. 检查是否安装了openssh,若没有则建议通过brew install openssh安装(需要先安装brew,安装brew前还需要先安装xcode,安装方法见https://brew.sh/,官网的方法若超时,可以先在浏览器中打开curl链接并复制到本地保存(如~/Desktop/install),然后修改安装命令为:
代码语言:javascript
复制
/usr/bin/ruby -e "$(cat ~/Desktop/install)"

启动方式:

代码语言:javascript
复制
sudo /usr/sbin/sshd

若启动失败并提示:

代码语言:javascript
复制
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

则,执行以下操作后重新启动:

代码语言:javascript
复制
sudo cp ~/.ssh/id_rsa /etc/ssh/ssh_host_rsa_key
sudo cp ~/.ssh/id_rsa.pub /etc/ssh/ssh_host_rsa_key.pub

启动后通过ps -ef | grep ssh检查ssh服务是否存在

  • b. 检查是否存在以下文件,且authorized_keys 中包含id_rsa.pub中的内容
代码语言:javascript
复制
~/.ssh/id_rsa.pub
~/.ssh/id_rsa
~/.ssh/authorized_keys 

若没有id_rsa.*文件,则执行以下操作:

代码语言:javascript
复制
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

修改/etc/hosts文件(可选)

添加本机ip到localhost的映射(sudo vim /etc/hosts),如下所示

代码语言:javascript
复制
10.72.xx.xx    localhost

这一步是为了可以使用形如:hdfs://10.72.xx.xx:9000/file/path的格式访问hdfs,否则只能使用localhost。

hadoop-2.7.6安装

下载hadoop-2.7.6安装包,解压到~/tools/hadoop-2.7.6;

修改hadoop配置

  • a.etc/hadoop/core-site.xml中添加如下配置:<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration>
  • etc/hadoop/hdfs-site.xml中添加如下配置:
代码语言:javascript
复制
<configuration>
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
</configuration>

以上为hdfs相关配置,若要使用yarn,还需进行以下配置

  • 拷贝etc/hadoop/mapred-site.xml.template到etc/hadoop/mapred-site.xml并添加如下配置:
代码语言:javascript
复制
<configuration>
	<property>
		<name>mapreduce.framework.name</name>
		<value>yarn</value>
	</property>
</configuration>
  • etc/hadoop/yarn-site.xml中添加如下配置:
代码语言:javascript
复制
<configuration>
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
</configuration>

注:默认存储路径为/tmp/hadoop-/,可以通过配置 “dfs.namenode.name.dir”、 “dfs.datanode.data.dir” 显式指定,参考文档https://hadoop.apache.org/docs/r2.7.6/hadoop-project-dist/hadoop-common/ClusterSetup.html#Configuring_the_Hadoop_Daemons

启动服务

格式化namenode

代码语言:javascript
复制
./bin/hdfs namenode -format

启动HDFS

代码语言:javascript
复制
./sbin/start-dfs.sh

若要启用历史任务服务,执行以下命令:

代码语言:javascript
复制
./sbin/mr-jobhistory-daemon.sh start historyserver

若要使用yarn,执行以下命令

代码语言:javascript
复制
./sbin/start-yarn.sh

启动后通过jps命令查看启动的服务,应包含:DataNode、NameNode、SecondaryNameNode(若启动了yarn,还包括:NodeManager、ResourceManager;若启动了历史服务,还包括:JobHistoryServer);

通过以下网址查看服务状态

a.历史任务:http://localhost:19888/

b.集群状态:http://localhost:8088/

c.NameNode状态:http://localhost:50070/

测试

通过以下命令测试hdfs是否可用:

代码语言:javascript
复制
./bin/hadoop fs -ls /
 ./bin/hadoop fs -ls hdfs://localhost:9000/
 ./bin/hadoop fs -ls hdfs://10.72.xxx.xxx:9000/
 ./bin/hdfs dfs -ls /
 ./bin/hdfs dfs -ls hdfs://localhost:9000/
 ./bin/hdfs dfs -ls hdfs://10.72.xxx.xxx:9000/

若服务可用,需要创建以下目录:

hdfs://localhost:9000/user/<username>

停止服务

代码语言:javascript
复制
./sbin/stop-dfs.sh    
 ./sbin/stop-yarn.sh    
 ./sbin/mr-jobhistory-daemon.sh stop historyserver    

注:若配置了yarn,则官网(https://hadoop.apache.org/docs/r2.7.6/hadoop-project-dist/hadoop-common/SingleCluster.html#Execution)中下面的例子是无法成功执行的;若只配置了hdfs,是没有问题的:

代码语言:javascript
复制
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar grep input output 'dfs[a-z.]+'

Spark集群(standalone模式)安装

若使用spark对本地文件进行测试学习,可以不用安装上面的hadoop环境,若要结合hdfs使用spark,则可以参考上面的步骤搭建hadoop。

安装

下载安装包https://spark.apache.org/downloads.html 并解压(如:~/tools/spark-2.3.1-bin-hadoop2.7);

启动服务

  • 启动master
代码语言:javascript
复制
./sbin/start-master.sh
  • 启动slaves:可先登陆 http://localhost:8080/ ,获取“Spark URL”
代码语言:javascript
复制
./sbin/start-slave.sh <spark://xxxx-xxx:7077>

开发测试程序

下面开发一个超级简单的rdd任务,逻辑(统计hdfs文件中包含单词form的行及行数,并将结果保存到hdfs)参考官网:https://spark.apache.org/docs/latest/quick-start.html#basics

  • 使用上面准备好的Scala环境,创建一个scala maven project:mvn-rdd-test
  • 编写代码
代码语言:javascript
复制
package com.tencent.omg
import org.apache.spark.{SparkConf,SparkContext}
object MvnRddTest {
	def main(args: Array[String]): Unit = {
		val dataPath = "hdfs://localhost:9000/usr/test/LICENSE.txt"
		val resultPath = "hdfs://localhost:9000/usr/test/result"
		val sc = new SparkContext(new SparkConf().setAppName("Mvn-Rdd-Test"))
		try{
			val accm = sc.longAccumulator("LineAccumulator")
			val rdd = sc.textFile(dataPath,2)
			val sparkDs = rdd.filter(
				line => if(line.contains("form")){
					accm.add(1)
					true
				} else false
			)
			sparkDs.saveAsTextFile(resultPath)
			println(s"Lines that contains 'form' number is: ${accm.value}")
		}catch {
			case e:Exception => e.printStackTrace()
		}finally {
			sc.stop()
		}
	}
}

注:运行该示例需要上传一份文件到(二)的hdfs中,例中的LICENSE.txt来自hadoop安装包。

  • 打含依赖项的jar包 pom.xml配置:
代码语言:javascript
复制
<groupId>com.tg.omg</groupId>
<artifactId>mvn-rdd-test</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <!-- spark core -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-core_2.11</artifactId>
        <version>2.3.1</version>
    </dependency>

    <!-- hdfs tool -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.7.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-assembly</artifactId>
        <version>0.8.0-SNAPSHOT</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <!-- build java -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.5.5</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.tencent.omg.MvnRddTest</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <!-- build scala -->
        <plugin>
            <groupId>org.scala-tools</groupId>
            <artifactId>maven-scala-plugin</artifactId>
            <version>2.15.2</version>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>testCompile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

双击Maven Projects–>mvn-rdd-test–>Lifecycle–>package即可完成打包,“mvn-rdd-test-1.0-SNAPSHOT-jar-with-dependencies.jar”即为包含依赖项的包。

注:pom中引入的这两个build插件是必须的,分别用于build java和scala。

  • 测试
代码语言:javascript
复制
./bin/spark-submit --master spark://xxxx-xxx:7077 --class com.tencent.omg.MvnRddTest ~/Document/IdeaProjects/mvn-rdd-test/target/mvn-rdd-test-1.0-SNAPSHOT-jar-with-dependencies.jar

可以到hdfs上查看运行结果,终端会打印计数器的值。

注意:使用maven打包,不要使用Build Artifacts方式打包。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装IntelliJ IDEA 、jdk、scala、Hadoop等环境
  • scala准备
  • 安装maven
    • maven安装路径
      • maven的settings.xml配置
        • proxies、servers、mirrors的配置
          • maven 仓库
          • 测试Test
            • SCALA_HOME、JAVA_HOME在mac下设置方式
            • Hadoop集群(伪分布模式)安装
              • 依赖项检查
                • 修改/etc/hosts文件(可选)
                  • hadoop-2.7.6安装
                    • 修改hadoop配置
                  • 启动服务
                    • 格式化namenode
                    • 启动HDFS
                    • 若要启用历史任务服务,执行以下命令:
                    • 若要使用yarn,执行以下命令
                    • 通过以下网址查看服务状态
                    • 测试
                    • 停止服务
                • Spark集群(standalone模式)安装
                  • 安装
                    • 启动服务
                      • 开发测试程序
                      相关产品与服务
                      容器镜像服务
                      容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档