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应用程序:

spark thrift 怎么启动 spark thriftserver部署_Spark SQL

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进程,如图

spark thrift 怎么启动 spark thriftserver部署_SPARK_02

3.3 远程客户端使用Spark beeline访问hive

我的远程客户端为ubuntu,将spark解压到远程客户端即可使用beeline

spark thrift 怎么启动 spark thriftserver部署_SPARK_03

客户端使用Sparkbeeline访问hive详见:第十、9.2节启动

4. 启动和退出spark-shell

启动命令如下

$ spark-shell

spark thrift 怎么启动 spark thriftserver部署_spark thrift 怎么启动_04

退出命令如下:

$ :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)

执行结果如下图:

spark thrift 怎么启动 spark thriftserver部署_spark thrift 怎么启动_05

以上命令的一行实现如下:

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)

执行过程如下图

spark thrift 怎么启动 spark thriftserver部署_Spark Thrift Server_06

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

执行结果如下图:

spark thrift 怎么启动 spark thriftserver部署_jar_07

6. 遇到的问题及解决办法

6.1 在Spark SQL CLI中执行SQL命令出现大量日志,如下图

spark thrift 怎么启动 spark thriftserver部署_Spark Thrift Server_08

解决办法:

$ cd $SPARK_HOME/conf/

$ cp log4j.properties.template log4j.properties

$ vim log4j.properties

log4j.rootCategory=INFO, console中的INFO改为WARN,保存退出即可。

spark thrift 怎么启动 spark thriftserver部署_Spark Thrift Server_09

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

如图:

spark thrift 怎么启动 spark thriftserver部署_spark thrift 怎么启动_10

使用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

 

spark thrift 怎么启动 spark thriftserver部署_SPARK_11

错误原因:缺少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

如图:

spark thrift 怎么启动 spark thriftserver部署_spark thrift 怎么启动_12

错误原因:缺少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