在创建kafka topic的时候可以添加很多配置,如下表格
介绍HBase的Java API,参考:HBase读写的几种方式(一)java篇
可以参考Cloudera官方例子,通过引入官方提供的flink-hbase来实现
1 | <dependency> |
要求flink最低版本1.9.0,hbase最低版本2.1.0-cdh6.3.0,然后就可以使用HBaseSinkFunction来写Hbase
1 | https://docs.cloudera.com/csa/1.2.0/datastream-connectors/topics/csa-hbase-configuration.html |
除了使用hive hook来记录hive上用户的操作之外,还可以使用hive metastore listener来进行记录,参考:
1 | https://towardsdatascience.com/apache-hive-hooks-and-metastore-listeners-a-tale-of-your-metadata-903b751ee99f |
hive metastore的接口有3种,分别是
gradle和maven类似,是一个构建工具
1.mac安装gradle
1 | brew install gradle |
或者下载gradle的二进制安装包
1 | https://gradle.org/releases/ |
然后在~/.bash_profile中配置
1 | # gradle |
2.查看是否安装成功
1 | gradle -v |
使用gradle后,老版本的IDEA 2017.1 对gradle的支持较弱,建议升级到新版本 2021.1
如果需要添加 gradle.properties 配置文件,请放在 $GRADLE_HOME 目录
1 | ➜ /Users/lintong/software/gradle-7.3.2 $ ls | grep gradle.properties |
配置文件内容
1 | /Users/lintong/software/gradle-7.3.2 $ cat gradle.properties |
使用gradle的时候如果遇到依赖冲突,可以添加如下配置,添加后再编译就能使得有冲突的时候自动失败
1 | configurations.all { |
Scylla兼容cassandra API,所以可以使用spark读写cassandra的方法来进行读写
1 | cqlsh:my_db> SHOW VERSION |
参考:https://github.com/datastax/spark-cassandra-connector
dataset API写scyllaDB
1 | ds2.write |
RDD API写scyllaDB
1 | import com.datastax.oss.driver.api.core.ConsistencyLevel |
注意字段的数量和顺序需要和ScyllaDB表的顺序一致,可以使用下面方式select字段
1 | val columns = Seq[String]( |
不过官方推荐使用DataFrame API,而不是RDD API
If you have the option we recommend using
在使用低版本的DataGrip的时候,还没有hive的data source,需要自行添加数据源
1.下载hive driver,如果你使用的EMR的大数据集群的话,下载地址
1 | https://docs.aws.amazon.com/emr/latest/ReleaseGuide/HiveJDBCDriver.html |
参考kafka官方文档,版本1.0.x
1 | http://kafka.apache.org/10/documentation.html#consumerapi |
依赖,选择 Cloudera Rel 中的 1.0.1-kafka-3.1.0
1 | <dependency> |
Kafka的消费者有2套API,一个是新版的Java API,在 org.apache.kafka.clients 包中
1 | http://kafka.apache.org/10/documentation.html#newconsumerconfigs |
一个是旧版的Scala API,在 kafka.consumer 包中
1 | http://kafka.apache.org/10/documentation.html#oldconsumerconfigs |
其中new consumer api中文含义参考
1 | https://tonglin0325.github.io/xml/kafka/1.0.1-kafka-3.1.0/new-consumer-api.xml |
kafka consumer参数调优:kafka consumer 参数调优
Kafka消费者不是线程安全的。所有的网络I/O都发生在进行调用的应用程序的线程中。用户有责任确保多线程访问是正确同步的。
在Thrift,Protobuf和avro序列化框架中,不约而同使用了zigzag编码来对数字进行编码,从而达到减少数据传输量的目的。
zigzag算法的核心主要是去除二进制数字中的前导0,因为在绝大多数情况下,我们使用到的整数,往往是比较小的。
在avro编码中,对于字符串Martin,长度为6,而6的二进制为0000 0110,其中首位置的0为符号位,在zigzag编码中,正数的符号位会移动到末尾,其它位往前移动一位,所以会变成0000 1100,即0c,再后面的字节是字符串UTF-8编码后的结果
在protobuf编码中,对于字符串的Martin,刚开始的字节表示其id和数据类型,下一个字节表示其长度,后面的字节是字符串UTF-8编码后的结果
参考:《数据密集型应用系统设计》的 Schema evolution in Avro, Protocol Buffers and Thrift
该文章对比了常用的一些存储底层所使用的数据结构。
MySQL,MongoDB的索引使用的就是B+树
B+树在多读少写(相对而言)的情境下比较有优势。
B+树的主要优点:
B+树的缺点:
RocksDB,HBase,Cassandra,Kudu底层使用的是LSM树
LSM树的优点:
LSM树的缺点:
参考:LSM树由来、设计思想以及应用到HBase的索引 和 数据密集型应用系统设计第3章
Redis底层使用的是SkipTable
B+树是多叉树结构,每个结点都是一个16k的数据页,能存放较多索引信息,所以扇出很高。三层左右就可以存储2kw左右的数据(知道结论就行,想知道原因可以看之前的文章)。也就是说查询一次数据,如果这些数据页都在磁盘里,那么最多需要查询三次磁盘IO。
跳表是链表结构,一条数据一个结点,如果最底层要存放2kw数据,且每次查询都要能达到二分查找的效果,2kw大概在2的24次方左右,所以,跳表大概高度在24层左右。最坏情况下,这24层数据会分散在不同的数据页里,也即是查一次数据会经历24次磁盘IO。
因此存放同样量级的数据,B+树的高度比跳表的要少,如果放在mysql数据库上来说,就是磁盘IO次数更少,因此B+树查询更快。
而针对写操作,B+树需要拆分合并索引数据页,跳表则独立插入,并根据随机函数确定层数,没有旋转和维持平衡的开销,因此跳表的写入性能会比B+树要好。
redis支持多种数据结构,里面有个有序集合,也叫ZSET。内部实现就是跳表。那为什么要用跳表而不用B+树等结构呢?
大家知道,redis 是纯纯的内存数据库。
进行读写数据都是操作内存,跟磁盘没啥关系,因此也不存在磁盘IO了,所以层高就不再是跳表的劣势了。
并且前面也提到B+树是有一系列合并拆分操作的,换成红黑树或者其他AVL树的话也是各种旋转,目的也是为了保持树的平衡。
而跳表插入数据时,只需要随机一下,就知道自己要不要往上加索引,根本不用考虑前后结点的感受,也就少了旋转平衡的开销。
因此,redis选了跳表,而不是B+树。