视频 https://ke.qq.com/course/238513
未解决的问题:
在执行 ./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Dhadoop.version=2.6.0-cdh5.7.0 -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn
会遇到zinc找不到的问题, 将make-distribution.sh文件的
VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ 2>/dev/null | grep -v "INFO" | tail -n 1)
改为
VERSION=$("$MVN" help:evaluate -Dexpression=project.version $@ | grep -v "INFO" | tail -n 1)
之后再执行会打印出部分日志, 这时候可以发现原因是在指定目录下找不到zinc
#########################
当时未解决找不到zinc的问题,但是一个月后相同环境再次执行./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Dhadoop.version=2.6.0-cdh5.7.0 -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn, 发现其会自动下载zinc, 不知道原因
另一个错误
Failed to execute goal on project spark-yarn_2.11
搜了一下原因都说是仓库中没找到对应的库, 但是我已经配置了cloudera的仓库.
重新执行了一遍编译命令, 自己就过去了
centos7:
hadoop用户加sudo权限 http://blog.csdn.net/flydedog/article/details/78878630
配置hostname http://blog.csdn.net/flyDeDog/article/details/78883547
安装部分可能遇到的依赖 zlib-devel openssl-devel gcc
目录结构:
app 存放安装软件, 如hadoop
software: 存放软件包, 比如hadoop.tar.gz
data: 存放数据
lib: 存放自己的jar包或其他包
source: 存放源码
maven_repo 存放maven的依赖
spark安装
jdk
[hadoop@hadoop001 software]$ wget http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.tar.gz
[hadoop@hadoop001 software]$ tar -zxf jdk-8u144-linux-x64.tar.gz -C ~/app/
配置环境变量
export JAVA_HOME=/home/hadoop/app/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
验证:
source ~/.bashrc
java -version
maven
[hadoop@hadoop001 software]$ wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz
[hadoop@hadoop001 software]$ tar -zxf apache-maven-3.5.2-bin.tar.gz -C ~/app/
配置环境变量
export MAVEN_HOME=/home/hadoop/app/apache-maven-3.5.2
export PATH=$MAVEN_HOME/bin:$PATH
验证:
source ~/.bashrc
mvn -v
配置
vi /home/hadoop/app/apache-maven-3.5.2/conf/settings.xml (将默认的依赖存放目录 Default: ${user.home}/.m2/repository 改为以下位置)
<localRepository>/home/hadoop/maven_repo</localRepository>
scala
wget https://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz
[hadoop@hadoop001 software]$ tar -zxf scala-2.11.8_linux.tgz -C ~/app/
配置环境变量
export SCALA_HOME=/home/hadoop/app/scala-2.11.8
export PATH=$SCALA_HOME/bin:$PATH
验证:
source ~/.bashrc
scala
git:
# 据说编译的时候会用到
spark:
2.2.0: [hadoop@hadoop001 source]$ wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.2.0/spark-2.2.0.tgz
# 设置maven的内存 -- 下面的 make-distribution.sh 编译脚本中有设置
# export MAVEN_OPTS="-Xmx2g -XX:ReservedCodeCacheSize=512m"
#增加仓库
vi pom.xml
# 在<repositories>中增加第二个仓库
<repository>
<id>cloudera</id>
<name>cloudera repository</name>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
# 编译 -- 目标文件在$SPARK_HOME
./dev/make-distribution.sh --name 2.6.0-cdh5.7.0 --tgz -Dhadoop.version=2.6.0-cdh5.7.0 -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn
# 将生成的包解压到app
tar -zxf spark-2.2.0-bin-2.6.0-cdh5.7.0.tgz -C ~/app/
# spark安装包目录结构
bin 客户端相关脚本
conf 配置文件
data 测试数据
examples 测试用例
jars 存放jar包
sbin 服务端脚本
yran yarn相关的jar
spark最小安装(单机测试版)
1. 下载二进制包(spark官网或者自己编译的)
2. 解压(这就算是安装完成了)
3. bin/spark-shell 可以进入命令行工具
4. bin/run-example SparkPi 是一个测试
spark编程环境搭建(基于idea)
1. 创建maven项目
在IDE中: File-->new-->project-->Maven, 可以使用骨架 org.scala-tools.archetypes:scala-archetype-simple
maven项目命名规范:
groupid: 项目地址反写 + 项目名称, com.apache.spark
artifactid: 项目名称 + 组件名称, spack-SQL
记得要允许maven自动导入: IDE会提示: maven project need to be imported
修改pom.xml:
scala.version: 你用的scala的version
spark-core: 可以去maven仓库中搜索spark, 链接点进去之后类似这样
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.0</version>
<scope>provided</scope>
</dependency>
可以吧上面的dependency中的version用变量替代, 因为其他地方也可能用这个版本, 以后改起来方便
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>{spark.version}</version>
<scope>provided</scope>
</dependency>
<properties>
<spark.version>2.2.0</spark.version> <!-- 指定spark版本变量 -->
</properties>
放到pom.xml的dependencies中, <scope>provided</scope>是自己加的, 因为打包的时候没必要吧spark也打进去
maven-shade-plugin: maven插件, 能够把依赖包都打进jar包里面
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- <mainClass>com.dajiangtai.MyDriver</mainClass> -->
</transformer>
</transformers>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
只打包scala项目:
注释掉的话, 就可以打包别的目录的项目了
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
如果需要的话, 可以在settings文件中配置ali的私服
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
2. 编写代码
在代码目录中, 创建Scala Class的文件, Kind标签选择object(这样才有main方法)
package com.flydedog.test
import org.apache.spark.{SparkConf, SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
// 参数检查
if (args.length < 2) { // 可以从guthub的spark的examples中找
System.err.println("Usage: WordCount <input> <output>")
System.exit(1)
}
// 获取参数
val input = args(0)
val output = args(1)
// 创建SparkContext
val conf = new SparkConf().setAppName("WordCount")
val sc = new SparkContext(conf)
// 读取数据
val lines = sc.textFile(input)
// 进行计算
val resultRdd = lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_)
// lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_).collect().foreach(println)
// 保存结果
resultRdd.saveAsTextFile(output)
sc.stop()
}
}
这是一个wordCount的示例, 但是在IDE中跑的话比较困难, 因为参数传入总是不正确, 所以将它打包到spark程序的环境测试
~/testspark/words.txt 是一个文件, 里面随便写几个单词, 用空格分隔就好
注意: 编译环境的scala版本和测试环境的scala版本要一致
1. mvn clean package, 并将包上传至~/testspark/
2. bin/spark-submit --class com.flydedog.test.WordCount ~/testspark/test-spark-0.1-SNAPSHOT.jar ~/testspark/words.txt ~/testspark/result
结果会输出到~/testspark/result
注: 在编写代码的时候, 工程目录结果为 E:\testspark\testspark\src\main\scala\com\flydedog\test, 如果想在E:\testspark\testspark\src\main\下再建立一个java的项目, 那么新建java文件夹后, 需要把这个文件夹 右键-make directory as-sources root