SparkSQL01

来源:互联网 发布:阜宁新闻网络发言人 编辑:程序博客网 时间:2024/04/27 11:34

数据量处理的比较大的,GC占用的时间比较长的,内存不够Container被干掉了等等UI界面有详细信息。
日志定时清除功能的。
HistoryServer源码,tab页面的拼接起来的。

Spark on Yarn的模式的,为什么作业的参数是
running containers:3
cpu vcores:3
memory:5120
生产上的一个core对应几个vcore的。
界面上显示的参数是哪里出来的。不要以为跑完了就行了,跑完作业离我们的要求太远了的。用spark-shell –master yarn-client没有任何的参数设置的,就是采用Spark默认的参数进行跑作业的。spark默认的–num-executors为2,spark-shell –help可以查看的。
spark on yarn cluster有多少个进程的。分别是干什么事情的。

SparkSQL:SQL是一种标准的额,用于数据统计分析,结构化查询语言。
查询的数据量是有限制的。
云化:把关系型数据的处理使用大数据来进行处理的
原来的关系型数据库的分析技巧和维度是没有变的
云化就是将RDBMS===>Hadoop
保留原有的SQL是什么样的,
Hive中开发大量的UDF函数,UDF来支持原有的RDBMS内置的一些函数的。
SQL的表达是不是比RDD,MapReduce要强一些的。
RDD:scala python java==》RDD
Hadoop:MapReduce

关系型数据库的数据存放在文件中的,文件中的数据肯定是有限制的
Mysql支持哪些存储引擎的,InnoDB,
Bigdata:大数据应该存储到HDFS上来的,可以进行横向扩展的。分析层面 分布式计算框架的MapReduce+hive+spark的。

SQL简单易用的,第一步是定义一张表的,表名的,列名的。把数据load进来的,进行统计分析了。
select * from xxxx where condition

RDD来进行统计分析操作的话,

Hive的执行引擎有MapReduce/Tez/Spark
SQL===>底层的作业
Hive中的MetaStore的底层的东西:
Hive中的MetaStore的整个表中的UML图,
数据地图:类似一个地图的,从地图中可以看出集群中的所有的数据存储量的。哪个业务占用了多少的存储空间的,Hadoop fs -du -s -h动态展示出来的。
最近的存储量上升了多少的。很多的SQL on Hadoop的框架都是公用MetaStore的,

Hive是使用MapReduce运行的。
Impala:交互式查询比较慢的问题的。语法都是一些SQL的
Impala是有自己的守护进程的,Impala的安装一定要跟数据节点DataNode安装在一起的。Impala也是与Hive共享一套MetaStore的元数据信息的
Impala推荐的文件存储格式是parquet

很多业务数据的格式是文本类型的,要想使Impala的效果更好的话,必须要进行将文本类型的格式转化为parquet的格式的。
parquet的文件,格式的转换的,利用SparkSQL的话是非常简单的,
Impala非常消耗内存的。
Presto:国内开源的不作为备选项的 。
Shark:SparkSQL的前身,将SQL语句转化成RDD的,DataBricks
Drill:交互式SQL的查询的,drill.apache.org
大数据平台公司:
HDP CDH cloudera DataBricks hortonwork
MapR
Schema-free sql query engine for hadoop ,nosql and cloud storage

Drill’s datastore -aware optimizer 数据存储的感知优化
借助于Drill的思想做的spark版本的:
dfs.root.”“文件系统中workSpace工作空间的。
Drill由MapR出品的。
Phoenix:HBase的sql查询的,hive关联HBase进行查询的话是不建议的,在HBase之上用sql来解决的额。
主叫被叫的功能需求查询都是用Phoenix架构在HBase之上的,话费订单的rowKey设计,移动的话单查询基本是在2-3秒的。客户端发送一个sql请求到Phoenix中,然后去HBase中查询即可的。Phoenix也是支持spark的。测试Phoenix支持spark的,allow spark to load phoenix tables as RDDs or DataFrames,and enables persisting RDDs of Tuples back to Phoenix
上官网的:
https://github.com/apache/phoenix中找到phoenix-spark的模块说明的详细用法的。

create table t1(id bigint not null primary key,col1 varchar);
upsert into t1(id,col1) values(1,”test_row_1”);
upsert into t1(id,col1) values(2,”test_row_2”);

Load as a DataFrame using DataSource API
import org.apache.spark.SparkContext;
import org.apache.spark.sql.SQLContext;
import org.apache.phoenix.spark._
val sc=new SparkContext(“local”,”phoenix-test”)
val sqlContext=new SQLContext(sc);
val df=sqlContext.load(“org.apache.phoenix.spark”,Map(“table”->”t1”,”zkUrl”->”phoenix-server:2181”))

df=sqlContext.read.format(“org.apache.phoenix.spark”,Map(“table”->”t1”,”zkUrl”->”phoenix-server:2181”)).load()

Spark与Phoenix对接的。
Phoenix是基于Zookeeper的。

df.filter(df(“col1”)==”test_row_1” && df(“id”)==1L).select(df(“id”)).show

Load as DataFrame directly using a Configuration object
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.phoenix.spark._
val configuration=new Configuration()
//can set Phoenix-specific settings,requires ‘hbase.zookeeper.quorum’
val sc=new SparkContext(“local”,”phoenix-test”)
val sqlContext=new SQLContext(sc)
//Load the column “id” and “col1” from table as DataFrame

val df=sqlContext.phoenixTableAsDataFrame(“t1”,Array(“id”,”col1”),conf=configuration)

//没有phoenixTableAsDataFrame的方法的,隐式转换进来的。让一个人变成超人的。
df.show

Load as an RDD ,using a Zookeeper URL
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.phoenix.spark._

val sc=new SparkContext(“local”,”phoenix-test”)
val rdd:RDD[Map[String,AnyRef]]=sc.phoenixTableAsRDD(“t1”,Seq(“id”,”col1”),zkUrl=Some(“phoenix-server:2181”))

create table output_test_table (id bigint not null primary key,col1 varchar,col2 integer);
import org.apache.spark.SparkContext
import org.apache.phoenix.spark._
val sc=new SparkContext(“local”,”phoenix-test”)
val dataset=List((1L,”1”,1),(2L,”2”,2),(3L,”3”,3))
sc.parallelize(dataSet).saveToPhoenix(“output_test_table”,Seq(“id”,”col1”,”col2”),zkUrl=Some(“phoenix-server:2181”))
Phoenix对于Spark的支持的。https://github.com/apache/phoenix的官网阅读的
电话+时间 hash反码

SparkSQL is Apache Spark’s module for working with structured data
不严谨的方式:not-so-secret truth:is not about sql
about more than sql,支持hive,parquet,json额的,支持好多的外部数据源的操作的。
SparkSQL集成Integrated
Seamlessly mix SQL queries with Spark programs
SparkSQL lets you query structured data inside Spark programs
SparkSQL uniform Data Access统一的数据访问的
connect to any data source the same way类似的方式连接到外部数据源的。跨数据源的额across these sources

HiveIntegeration:Run sql or HiveQL queries on existing warehouses
共用了MetaStore的元数据的。操作Hive中的UDF函数,SerDes序列化反序列化的。

Standard Connectivity标准的数据连接的,Connect through JDBC or ODBC
a Server mode provides industry standard JDBC and ODBC connectivity for business intellTigence tools
使用SparkSQL可以启动ThriftServer模式的,后面的BI系统就可以根据JDBC的方式来进行访问的。涉及到一个问题就是ThriftServer如何进行一些优化的,BITools的工具可以借助于JDBC/ODBC的方式来进行访问SparkSQL中的数据表的。

性能和扩展性是非常不错的。

SparkSQL提供更多的信息schema,有schema就知道了数据类型和列名了,有了列名就可以进行压缩的。SparkSQL uses this extra information to perform extra optimizations

when computing a result the same execution engine is uses即就是Catalyst的。

SQLContext是不支持hive的
HiveContext是支持hive的,是SQLContext的子类的。
整个Spark的一个入口点是SparkSession的。

val spark=SparkSession.builder().appName(“SparkSqlBasic”).config(“spark.some.config.option”,”some-value”).getOrCreate()
config是相当于–conf传进来的参数的。Builder模式的。

源码包中有一个SparkSQLExample类的。是我们学习过程非常有帮助性的例子的。官方提供的最好的信息的的。
import spark.implicits._

runBasicDataFrameExample(spark)
runDatasetCreationExample(spark)
runInferSchemaExample(spark)
runProgrammaticSchemaExample(spark)

SparkSQL跟Hive进行一个对比的:
首先要使用Hive里面的东西必须要将hive-site.xml文件进行拷贝到$SPAREK_HOME/conf中的。

整合Hive的使用的:
HIVEHOME/conf/hivesite.xmlSPARK_HOME/conf下面的。

./spark-shell –master local[2]

使用spark的时候,什么时候是要启动HDFS的服务的,
failed on connection exception:java.net.connectionException:Connnection
Caused by:org.datanucleus.store.rdbms.connectionpoolDatastoreDriverNotFoundException
refused链接不到HDFS上的,
hive的数据是存放在HDFS上的,要添加依赖的jar包的。
hive的元数据MetaStore是存放在Mysql中的。

./spark-shell –master local[2] –jars ~/software/mysql-connector-java-5.1.27-bin.jar

spark.sql(“show tables”).show
spark.sql(“select * from emp e join dept d on e.deptno=d.deptno”).show()
create table dept(deptno int,dname string,loc string)
row format delimited fields terminated by ‘\t’;
load data local inpath ‘/home/hadoop/data/dept.txt’ into table dept;
hadoop fs -ls /user/hive/warehouse
hdfs上有一份数据的,没有删除的。加载本地的数据重复了。

./spark-sql –master local[2] –jars ~/software/mysql-connector-java-5.1.27-bin.jar

cat $SPARK_HOME/conf/hive-site.xml
hive.cli.print.current.db=true

spark-sql与hive是完全通用的。
spark-sql(default)>select * from emp e join dept d on e.deptno=d.deptno
刚才的那个表是在hive中创建的,但是在spark-sql当中仍然是有作用的。

SparkSQL中的一个cache操作的。
Caching Data in Memory
SparkSQL can cache tables using an in-memory columnar format by calling spark.catalog.cacheTable(“tableName”)
dataFrame.cache()

测试Cache的用法:
去4040页面上的Storage上进行查看的。
spark-sql(default)>cache table emp;
S parkRDD中的cache是lazy的,SparkRDD中的RDD是要进行action操作才有的效果的。
SparkSQL中的cache是eager的,
spark-sql(default)>cache table dept;
spark-sql(default)>uncache table dept;
spark-sql(default)>uncache table emp;

Spark如何整合Hive进行使用的:
hive-site.xml hdfs mysql.jar

./spark-shell –master local[2] –jars ~/software/mysql-connector-java-5.1.27-bin.jar
scala>spark.table(“emp”).show
table的方式进行读取hive中的数据的。

since hive has a large number of dependencies these dependencies are not included in the default Spark distribution,If hive dependencies can be found on the classpath,Spark will load them automatically
只需要table的方式就可以读取hive中的数据的。由于hive有大量的依赖的额,而我们的编译的Spark包是没有hive依赖的。只需要配置了HIVE_HOME的路径的,编译的Spark包中是不需要hive的包的。

Note that these hive dependencies must also be present on all of the worker nodes,as they will need access to the hive serialization and deserialization libraries SerDes in order to access data stored in hive.

跑在yarn上,已经指定了yarn的conf目录了,自己就可以找的到的。
Users who do not have an existing hive deployment can still enable Hive support
生产上没有hive的,是没有关系的。SparkSQL与Hive的,真正需要的就是hive-site.xml的配置文件的MetaStore的数据信息的。
when not configured by the hive-site.xml the context automatically creates metastore_db in the current directory and creates a directory configured by spark.sql.warehouse.dir,which defaults to the directory spark-warehouse in the current directory that the Spark application is started

Spark2.x中的
val spark=SparkSession.builder().appName(“SparkHive”).config(“spark.sql.warehouse.dir”,warehouseLocation).enableHiveSupport().getOrCreate()

HIVE AST:hive的抽象语法树的,hive的sql是可以支持的。
Spark Program:编程
未解析的逻辑查询计划:写了一个sql语句的,字段有没有的,表名有没有的,sql写的对不对的。都是去Schema Catalog中进行获取查询的。
逻辑查询计划:
优化的逻辑查询计划,
物理查询计划,
Cost Model
Relation Execution Operators:
Native RDDs
Streaming Nodes;
./spark-sql –master local[2] –jars ~/software/mysql-connector-java-5.1.27-bin.jar

spark-sql(default)>create table aa(key string,value string);
spark-sql(default)>explain extended select a.key*(4+5),b.value from aa a join aa b on a.key=b.key and a.key>10;

Parsed Logical Plan
UnresolvedRelation ‘aa’
Project投影字段的

Analyzed Logical Plan
Optimized Logical Plan
Physical plan
将InnerJoin转换成为SortMergeJoin sort Exchange hashpartition
Join的性能好坏的。
表面是看不出来哪个是SortMergeJoin的,broadCastJoin
一个join转换成底层是什么join的方式只有看执行计划了。。
普通的sql字符串,到了Schema Catalog的时候,就应该知道从哪个表中哪个数据库中去取数据了。
取出来的信息进行优化一下, pushdown filter。
物理执行计划的时候,mapJoin,broadcastJoin,sortMergeJoin等等的优化的。
执行计划的SparkSQL跟hive是一模一样的。

执行计划一定要自己进行测试的。否则的话写一个sql是没有意义的。

超图GIS
ArcGis
百度地图 矢量图

原创粉丝点击