Spark编译与部署

编译spark-1.6.1

使用maven编译

编译spark时需要先将maven(maven需要3.3以上)的内存加大,执行命令
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

然后执行编译命令(编译继承hadoop和hive的版本)
mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.0 -Phive -Phive-thriftserver -DskipTests clean package

此处只是将spark源码进行编译,并没有打包成可部署的tar包,类似可部署tar解压之后的结果,但包含源码和别的jar包。为了部署方便还是要将spark编译为tar包,执行命令
./make-distribution.sh --tgz -Phadoop-2.6 -Phive -Phive-thriftserver -Pyarn -DskipTests -Dhadoop.version=2.6.0
执行此条命令时可能需要等待一段时间才会显示编译的过程,不要心急,慢慢等会

编译时如果不指定scala的版本,默认是2.10。如果需要改变scala的版本,执行如下命令:
./dev/change-scala-version.sh 2.11
然后再执行编译命令。

部署spark on yarn

spark on yarn部署比较简单
在spark-env.sh中配置HADOOP_CONF_DIR和YARN_CONF_DIR,HADOOP_CONF_DIR用来连接HDFS,YARN_CONF_DIR用来连接ResourceManager。

1
2
HADOOP_CONF_DIR=/home/hadoop/hadoop/etc/hadoop
YARN_CONF_DIR=/home/hadoop/hadoop/etc/hadoop

部署好之后运行个例子检测下

1
./bin/spark-submit --class\ org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 4g --executor-memory 2g --executor-cores 1 lib/spark-examples-1.6.1-hadoop2.6.0.jar 100

可以使用--jars参数添加依赖的jar包

spark sql with hive

  • 将hive-site.xml scp 到hadoop03的spark/conf中 (hive client可以和spark client不在一台机器上)
  • 将lib/mysql-connector-java-5.1.38-bin.jar scp hadoop03的spark/lib

运行spark-shell检验是否部署成功
bin/spark-shell --driver-class-path lib/mysql-connector-java-5.1.38-bin.jar
打开spark-shell执行一些hive命令进行测试。
也可执行spark-sql
bin/spark-sql --master yarn --driver-class-path lib/mysql-connector-java-5.1.38-bin.jar

用spark sql操作hive时,必须构建一个HiveContext对象,其继承自SQLContext。

1
2
3
4
5
6
7
8
9
10
// sc is an existing SparkContext.
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
// SQLContext
// val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// val df = sqlContext.sql("SELECT * FROM table")
sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")
sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")
// Queries are expressed in HiveQL
sqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

启动history server

  • 在hdfs上创建存放spark log的目录
    hadoop fs -mkdir /spark_hislog
  • spark-env.sh中添加SPARK_DAEMON_MEMORY、SPARK_DAEMON_JAVA_OPTS、SPARK_PUBLIC_DNS、SPARK_HISTORY_OPTS
1
2
3
#SPARK_DAEMON_MEMORY=2g # 这个貌似没有起作用,随后再测
#SPARK_PUBLIC_DNS=xx.xx.xx.xx # 可能是ip地址
PARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://localhost:8020/spark_hislog"
  • spark-default.conf 中添加如下配置
1
2
3
4
5
6
7
8
9
# 开启日志记录
spark.eventLog.enabled true
# 日志存储地址
# spark.eventLog.dir应该与spark.history.fs.logDirectory目录一样
# spark.history.fs.logDirectory:spark history server页面只展示该指定路径下的信息
# spark.eventLog.dir:application在运行过程中所有的信息均记录在该属性指定的路径下
spark.eventLog.dir hdfs://localhost:8020/spark_hislog
# 是否进行压缩
spark.eventLog.compress true
  • 启动history server sbin/start-history-server.sh
  • 访问xx.xx.xx.xx:18080

备注

在编译和部署的过程中我并没有安装scala,scala何时需要安装是必须的还是什么?暂时还不清楚,但之前在工作中貌似遇到spark on yarn时,spark client需要安装scala,但现在还没有遇到。

您的肯定,是我装逼的最大的动力!