linux下安装spark

第一步去:spark.apache.org官网去选择适合自己的版本下载安装包


linux下安装spark_第1张图片

第二步:解压tgz文件,配置SPARK_HOME到环境变量中

tar zxvf  文件名.tgz 

vi  /etc/profile


第三步: 进入spark安装位置, 然后进入spark中的 bin 文件夹

运行: ./bin/spark-shell   运行scala


linux下安装spark_第2张图片

在启动后的结果页面上可以看到spark的webUI的控制台地址,可以在浏览器中访问的。

在yarn上运行spark

必须确保在spark中指定hadoop的集群配置文件所在的目录,如下英文所述


linux下安装spark_第3张图片

编辑$SPARK_HOME/conf/spark-env.sh文件

加入内容为:

HADOOP_CONF_DIR=/usr/hadoop/hadoop-2.6.0-cdh5.7.0/etc/hadoop

To launch a Spark application in cluster mode:(用cluster模式执行一个jar程序)

$ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] [app options]

例子:

For example:

${SPARK_HOME}/bin/spark-submit --class org.apache.spark.examples.SparkPi \

    --master yarn \

    --deploy-mode cluster \

    --driver-memory 4g \

    --executor-memory 2g \

    --executor-cores 1 \

    --queue thequeue \

    examples/jars/spark-examples*.jar \

    10

以客户端client的模式在yarn上启动spark:

$ ./bin/spark-shell --master yarn --deploy-mode client

退出spark-shell

【注意】在Spark使用结束时,务必使用 :quit 退出。否则下次再启动,将导致端口被占用的错误。


用java语言编写测试样例

首先确保自己的jdk版本在1.8及其以上,并且调整项目的编译版本为1.8,因为1.8以下的版本不支持lambda 表达式

idea的工具中,file--》project-structure--》Language Level

linux下安装spark_第4张图片
1


linux下安装spark_第5张图片
2

这样spark样例的写法就可以正确解析了:如下


linux下安装spark_第6张图片

打包我们的本地程序上传到装有spark服务的服务器中:


linux下安装spark_第7张图片

打包的时候就会发现,maven也要配置1.8的jdk才能打包成功:


linux下安装spark_第8张图片
配置maven的编译版本1.8

执行自己编写的jar包

spark-submit --class "com.sc.spark.SparkApp" --master local[4] /usr/spark/spark-2.1.1-bin-hadoop2.6/examples/jars/bigdata-1.1.1-jar-with-dependencies.jar

在yarn上执行自己的jar

spark-submit --class com.sc.sparksql.RDD2DataFrame --master yarn --deploy-mode client /usr/spark-2.1.1-bin-hadoop2.6/examples/jars/bigdata-1.1.1-jar-with-dependencies.jar

spark-defaults.conf配置文件

配置spark的日志生成到hdfs上去

spark.eventLog.enabled=true

spark.eventLog.compress=true

#保存在本地#

spark.eventLog.dir=file:///usr/local/hadoop-2.7.6/logs/userlogs

#spark.history.fs.logDirectory=file:///usr/local/hadoop-2.7.6/logs/userlogs

#保存在hdfs上

spark.eventLog.dir=hdfs://spark-master:9000/tmp/logs/root/logs

spark.history.fs.logDirectory=hdfs://spark-master:9000/tmp/logs/root/logs


yarn-site.xml

 

yarn.log-aggregation-enable

true

 

 

 

yarn.log.server.url

http://spark-master:19888/jobhistory/logs/

 

 

 

yarn.log-aggregation.retain-seconds

86400

 

启动

1.首先启动 hadoop的jobhistory

[root@spark-master hadoop-2.7.6]# 

sbin/mr-jobhistory-daemon.sh   start   historyserver

2.启动spark的history-server

[root@spark-master spark-2.3.0]# 

sbin/start-history-server.sh


spark-shell加载文件

从spark-shell所在机器目录读取文件:
scala> val acclog = sc.textFile("file:///usr/hadoop/testdata/access-kf0911.log")


从spark-shell所以来的hdfs上读取文件:

scala> val acclog = sc.textFile("/usr/hadoop/testdata/access-kf0911.log")

获取acclog的第一行数据:


查看数据结构化信息:

linux下安装spark_第9张图片

解析嵌套的json文件


linux下安装spark_第10张图片

如果想要全部展示省略的部分就在show方法里传入一个参数为false,例如:df.show(false)

加载外部数据源:

加载Parquet格式数据:

spark.read.format("parquet").load("file///usr/textdata/test.parquet");//加载本地文件

spark.read.format("parquet").load("hdfs://usr/textdata/test.parquet");//加载hdfs上的文件


DataFrame和RDD的区别

DataFrame(等同于关系性数据库的表格结构)=RDD+Schema(表的名字、字段、类型等)

DataFrame在底层是用Catalyst来优化的,并且比RDD多了Schema信息。

DataFrame可以处理的数据类型有:text,json,Parquet,外部数据源等。    

我们操作数据不论用SQl方式还是用API的方式来处理,最后都转化成Catalyst optimized优化执行引擎来处理,效率都是一样的。

Schema特点

Schema信息分为两种包含方式,一种是隐式,一种是显式的包含。

显式的一般由json、Parquet格式的数据文件本来就有Schema信息。text数据就没有schema信息,必须指定Schema信息。指定Schema信息的步骤分为以下三个步骤

第一步:Create an RDD of Rows from the original RDD;

第二步:Create the schema represented by a StructType matching the structure of Rows in the RDD created in Step 

第三步:Apply the schema to the RDD of Rows via createDataFrame method provided by SparkSession.


linux下安装spark_第11张图片
为txt格式的数据指定schema信息

如何把我们计算后的数据存储起来?


linux下安装spark_第12张图片

df.select("name").write.format("parquet").mode("overwrite").save("hdfs:/路径");//存放到hdfs中

df.select("name").write.format("parquet").mode("overwrite").save("file:///路径");//存放到服务器本地

如何处理json数据

json数据是一种非常易读的数据格式,而且是一行一行的存储,并且它已经具备了schema信息了。

如果你想把json的数据进行抽离,通常我们用explode方法来操作

如果你想对内嵌的json数据进行访问,你可以用“.”的方式来访问


linux下安装spark_第13张图片
linux下安装spark_第14张图片
如果想访问数据里的数据,需要使用角标,索引从0开始
linux下安装spark_第15张图片

对嵌套性的数据处理


linux下安装spark_第16张图片
linux下安装spark_第17张图片

spark sql的覆盖率

spark2.0以上版本,已经完全支持sql 2003的sql特性、可以执行99%的TPC-DS测试查询、子查询也可以支持、支持向量化(每次可以读取1024行,降低读取次数,提升查询速度)

spark sql支持的外部数据源

1)关系型数据库的数据,需要导入jdbc jars

2)Parquet、Phoenix、csv、avro、etc

有一个spark支持所有的数据源的网站

https://spark-packages.org

常见问题

使用spark-submit命令执行自己的jar包时,报了如下错误,我一看原来是我的spark-defaults.conf文件中的给spark配置的日志存放路径给hadopps的用户路径冲突了,本来是想复用现成的userlogs目录来使用,结果人家不让,所以我就改了另外的目录。

linux下安装spark_第18张图片

常见问题2:


linux下安装spark_第19张图片

local 本地单线程在写spark程序的时候,许多人会遇到以下这个报错,包括我自己也遇到过,当时郁闷了很久

报错说在配置中必须设置一个master URL.但是我明明在提交应用的时候设置了–master呀,为什么说我没有,于是非常惊讶,怀疑是不是计算机自己疯掉了。

其实这是初学者很容易犯的错误,原因在于没有真正理解spark分布式或伪分布式的运行原理。出错的小伙伴往往把创建spark实例,或者sc.textFile读取数据等放在了main函数的外面。像下面这样写是错误的:

在伪分布式中,一个spark 应用对应了一个main函数,放在一个driver里,driver里有一个对应的实例(spark context).driver 负责向各个节点分发资源以及数据。那么如果你把创建实例放在了main函数的外面,driver就没法分发了。所以如果这样写在local模式下是可以成功的,在分布式就会报错。(好吧,解释地有点直白和不专业)

所以正确的写法应该是这样:

def main(args: Array[String]) {

  val sparkConf = new SparkConf().setAppName("XXXX")

  val sc = new SparkContext(sparkConf)

}

问题3:

org.apache.spark.sql.Row对象中取值,如果使用get方法,索引是从0开始的


linux下安装spark_第20张图片

spark 的运行写入mysql库程序时,需要先把依赖的mysql的jdbc的驱动加入刀$SPARK_HOME/jars中。

如果害怕任务吃掉内存,导致服务崩溃,最好配置驱动内存和运行内存

spark-submit --class com.lppz.ReadToPvProvcity --master yarn --driver-memory 4g --executor-memory 2g --executor-cores 1 /home/hadoop/waimai/selfjars/execData-1.1-SNAPSHOT.jar ${DATE_DH}

你可能感兴趣的:(linux下安装spark)