1. Spark部署
下载spark-2.2.0-bin-hadoop2.7.tgz
解压
$ tar -zxvf spark-2.2.0-bin-hadoop2.7.tgz
配置环境变量
$ vim ~/.bashrc
添加如下内容:
exportSPARK_HOME=/home/cloud/cloud/spark-2.2.0-bin-hadoop2.7
exportPATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
1.1 启动Spark集群
$ $SPARK_HOME/sbin/start-all.sh
2. 配置Spark SQL CLI
2.1 创建spark-env.sh
$ cp $SPARK_HOME/conf/spark-env.sh.template$SPARK_HOME/conf/spark-env.sh
$ vim $SPARK_HOME/conf/spark-env.sh
添加如下内容
export JAVA_HOME=/home/cloud/cloud/jdk8
export HADOOP_CONF_DIR=/home/cloud/cloud/hadoop-2.8.0
exportHIVE_CONF_DIR=/home/cloud/cloud/apache-hive-2.1.1-bin
export SCALA_HOME=/home/cloud/cloud/scala-2.12.3
export SPARK_WORK_MEMORY=1g
export MASTER=spark://master:7077
#export SPARK_MASTER_IP=master
#export SPARK_MASTER_PORT=7077
2.2 创建并配置hive-site.xml
在运行Spark SQLCLI中需要使用到HiveMetastore,故需要在Spark中添加其uris。具体方法是在$SPARK_HOME/conf目录下创建hive-site.xml文件,然后在该配置文件中,添加hive.metastore.uris属性,具体如下:
说明:hive.metastore.uris指定了连接的Hive数据源。
$ vim $SPARK_HOME/conf/hive-site.xml
添加如下内容:
<configuration>
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
<description>Thrift URI for the remote metastore. Used bymetastore client to connect to remote metastore.</description>
</property>
</configuration>
2.3 复制hdfs-site.xml
$ cp $HADOOP_HOME/etc/hadoop/hdfs-site.xml$SPARK_HOME/conf
2.4 创建slaves
$ cp $SPARK_HOME/slaves.template$SPARK_HOME/slaves
添加如下内容:
master
slave1
slave2
2.5 复制hive-hbase-handler-2.1.1.jar到$SPARK_HOME/jars/
$ cp $HIVE_HOME/lib/hive-hbase-handler-2.1.1.jar$SPARK_HOME/jars/
2.6 创建lib目录并拷贝相关jar包
$ mkdir $SPARK_HOME/lib
$ cp $HBASE_HOME/lib/guava-12.0.1.jar$SPARK_HOME/lib/
$ cp $HBASE_HOME/lib/hbase-common-1.2.6-tests.jar$SPARK_HOME/lib/
$ cp $HBASE_HOME/lib/hbase-client-1.2.6.jar$SPARK_HOME/lib/
$ cp $HBASE_HOME/lib/hbase-protocol-1.2.6.jar$SPARK_HOME/lib/
$ cp$HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $SPARK_HOME/lib/
$ cp $HBASE_HOME/lib/hbase-common-1.2.6.jar$SPARK_HOME/lib/
$ cp $HBASE_HOME/lib/hbase-server-1.2.6.jar$SPARK_HOME/lib/
$ cp$HIVE_HOME/lib/mysql-connector-java-5.1.41-bin.jar $SPARK_HOME/lib/
其中mysql-connector-java-5.1.41-bin.jar来自于https://dev.mysql.com/downloads/connector/j/下载的mysql-connector-java-5.1.41.tar.gz
$ cp $HIVE_HOME/lib/metrics-core-2.2.0.jar$SPARK_HOME/lib
2.7 修改spark-env.sh
$ vim $SPARK_HOME/conf/spark-env.sh
添加如下内容:
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/guava-12.0.1.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/hbase-client-1.2.6.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/hbase-common-1.2.6.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/hbase-common-1.2.6-tests.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/hbase-protocol-1.2.6.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/hbase-server-1.2.6.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/htrace-core-3.1.0-incubating.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/mysql-connector-java-5.1.41-bin.jar
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/ metrics-core-2.2.0.jar
2.8 启动Hive Metastore
在使用Spark SQLCLI之前需要启动HiveMetastore(如果数据存放在HDFS文件系统,还需要启动Hadoop的HDFS),使用如下命令可以使Hive Metastore启动后运行在后台,可以通过jobs查询:
$ nohup hive --service metastore >metastore.log 2>&1 &
2.9 启动Spark SQL CLI
$ $SPARK_HOME/bin/spark-sql --masterspark://master:7077 --executor-memory 1g
在集群监控页面http://master:8080/可以看到启动了SparkSQL应用程序:
3. 配置Spark Thrift Server
3.1 创建或修改hive-site.xml配置文件
若在Spark SQLCLI中已创建hive-site.xml,则添加新内容即可。
$ vim $SPARK_HOME/conf/hive-site.xml
添加如下内容:
<!--Thrift JDBC/ODBC server-->
<property>
<name>hive.server2.thrift.min.worker.threads</name>
<value>5</value>
</property>
<property>
<name>hive.server2.thrift.max.worker.threads</name>
<value>500</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10001</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>master</value>
</property>
说明:hive.server2.thrift.bind.host指定要启动thrift server的主机,hive.server2.thrift.port指定要打开的端口号。使用端口10001是为了避免与Hive自己的hive.server2.thrift.port—10000产生冲突。
3.2 启动Spark Thrift Server
$ $SPARK_HOME/sbin/start-thriftserver.sh --masterspark://master:7077 --executor-memory 1g
启动后使用$ jps可以看到SparkSubmit进程,如图
3.3 远程客户端使用Spark beeline访问hive
我的远程客户端为ubuntu,将spark解压到远程客户端即可使用beeline
客户端使用Sparkbeeline访问hive详见:第十、9.2节启动
4. 启动和退出spark-shell
启动命令如下
$ spark-shell
退出命令如下:
$ :quit
4.1 上传一个文件到HDFS,对该文件进行WordCount
上传文件至HDFS根目录
$ hdfs dfs -put$HADOOP_HOME/etc/hadoop/core-site.xml /
启动scala,输入如下命令对文件core-site.xml进行词频统计
scala> valrdd=sc.textFile("hdfs://master:9000/core-site.xml")
scala> rdd.cache()
scala> valwordcount=rdd.flatMap(_.split(" ")).map(x=>(x,1)).reduceByKey(_+_)
scala> wordcount.take(10)
scala> valwordsort=wordcount.map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
scala> >wordsort.take(10)
执行结果如下图:
以上命令的一行实现如下:
scala>sc.textFile("hdfs://master:9000/core-site.xml").flatMap(_.split("")).map(x=>(x,1)).reduceByKey(_+_).map(x=>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1)).take(10)
执行过程如下图
5. spark-submit的使用
5.1 工具语法及参数
从Spark1.0.0开始,Spark提供了一个易用的应用程序部署工具bin/spark-submit,可以完成Spark应用程序在local、Standalone、YARN、Mesos上的快捷部署。该工具语法及参数说明如下:
Usage: spark-submit [options] <app jar |python file> [app options]
Options:
--masterMASTER_URL spark://host:port,mesos://host:port, yarn, or local.
--deploy-mode DEPLOY_MODE driver运行之处,client运行在本机,cluster运行在集群
--classCLASS_NAME 应用程序包的要运行的class
--nameNAME 应用程序名称
--jarsJARS 用逗号隔开的driver本地jar包列表以及executor类路径
--py-files PY_FILES 用逗号隔开的放置在Python应用程序
PYTHONPATH上的.zip, .egg, .py文件列表
--filesFILES 用逗号隔开的要放置在每个executor工作目录的文件列表
--properties-fileFILE 设置应用程序属性的文件放置位置,默认是conf/spark-defaults.conf
--driver-memory MEM driver内存大小,默认512M
--driver-java-options driver的java选项
--driver-library-path driver的库路径Extralibrary path entries to pass to the driver
--driver-class-path driver的类路径,用--jars 添加的jar包会自动包含在类路径里
--executor-memory MEM executor内存大小,默认1G
Sparkstandalone with cluster deploy mode only:
--driver-cores NUM driver使用内核数,默认为1
--supervise 如果设置了该参数,driver失败是会重启
Sparkstandalone and Mesos only:
--total-executor-cores NUM executor使用的总核数
YARN-only:
--executor-cores NUM 每个executor使用的内核数,默认为1
--queueQUEUE_NAME 提交应用程序给哪个YARN的队列,默认是default队列
--num-executorsNUM 启动的executor数量,默认是2个
--archives ARCHIVES 被每个executor提取到工作目录的档案列表,用逗号隔开
5.2 实例
该脚本为Spark自带例子,在该例子中个计算了圆周率π的值,以下为执行脚本:
spark-submit --master spark://master:7077 --classorg.apache.spark.examples.SparkPi --executor-memory 512m $SPARK_HOME/examples/jars/spark-examples_2.11-2.1.1.jar200
参数说明(详细可以参考上面的参数说明):
a) --master Master所在地址,可以有Mesos、Spark、YARN和Local四种,在这里为SparkStandalone集群,地址为spark://hadoop1:7077
b) --class应用程序调用的类名,这里为org.apache.spark.examples.SparkPi
c) --executor-memory 每个executor所分配的内存大小,这里为512M
d) 执行jar包 这里是../lib/spark-examples-1.1.0-hadoop2.2.0.jar
e) 分片数目 这里数目为200
执行结果如下图:
6. 遇到的问题及解决办法
6.1 在Spark SQL CLI中执行SQL命令出现大量日志,如下图
解决办法:
$ cd $SPARK_HOME/conf/
$ cp log4j.properties.template log4j.properties
$ vim log4j.properties
log4j.rootCategory=INFO, console中的INFO改为WARN,保存退出即可。
6.2 Spark SQL CLI和Spark Thrift Server全部启动后,使用Spark SQL CLI执行SQL出现如下错误
17/08/14 06:40:03 WARN TaskSchedulerImpl: Initialjob has not accepted any resources; check your cluster UI to ensure thatworkers are registered and have sufficient resources
如图:
使用stop-thriftserver.sh命令或者在http://master:8080/结束掉Spark Thrift Server后再使用Spark SQL CLI执行show databases;没问题,执行SQL查询报错。
推测:集群中有两台计算机内存只有1G。先启动SparkThrift Server:$SPARK_HOME/sbin/start-thriftserver.sh--master spark://master:7077 --executor-memory 1g,已经占据1g内存;再启动SparkSQL CLI:$SPARK_HOME/bin/spark-sql--master spark://master:7077 --executor-memory 1g时,内存不足。但是先启动Spark SQL CLI,再启动Spark Thrift Server却可以。
6.3 在spark-sql中执行sql查询,出错org.apache.hadoop.hive.hbase.HBaseSerDe not found
错误原因:缺少hive-hbase-handler-2.1.1.jar
解决办法:
$ cp $HIVE_HOME/lib/hive-hbase-handler-2.1.1.jar$SPARK_HOME/jars/
同理,出现***.***.***notfound一般为jar包缺失或jar包中的.class缺失
6.4 在spark-sql中执行sql查询出现错误
17/09/21 02:08:35 ERROR SparkSQLDriver: Failed in[select * from pilotinfo]
org.apache.hadoop.hbase.client.RetriesExhaustedException:Failed after attempts=36, exceptions:
Thu Sep 21 02:08:35 GMT 2017, null,java.net.SocketTimeoutException: callTimeout=60000, callDuration=68693: row'bigdata,,00000000000000' on table 'hbase:meta' atregion=hbase:meta,,1.1588230740, hostname=slave2,16020,1505956754657, seqNum=0
******
Caused by: java.net.SocketTimeoutException:callTimeout=60000, callDuration=68693: row 'bigdata,,00000000000000' on table'hbase:meta' at region=hbase:meta,,1.1588230740,hostname=slave2,16020,1505956754657, seqNum=0
******
Caused by: java.lang.ClassNotFoundException:com.yammer.metrics.core.Gauge
如图:
错误原因:缺少metrics-core-2.2.0.jar
解决办法:
$ cp $HIVE_HOME/lib/metrics-core-2.2.0.jar$SPARK_HOME/lib
$ vim $SPARK_HOME/conf/spark-env.sh
exportSPARK_CLASSPATH=$SPARK_CLASSPATH:$SPARK_HOME/lib/ metrics-core-2.2.0.jar