# sparkt
**Repository Path**: sean9468_admin/sparkt
## Basic Information
- **Project Name**: sparkt
- **Description**: spark学习
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2019-09-22
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Spark
## 运行错误
> Could not locate executable null\bin\winutils.exe in
the Hadoop binaries
将hadoop-common-2.2.0-bin.master压缩设置HADOOP_HOME目录
或者
System.setProperty("hadoop.home.dir", "D:\\hadoop-common-2.2.0-bin-master")
## 打包运行
```xml
org.apache.maven.plugins
maven-assembly-plugin
3.0.0
WordCount
jar-with-dependencies
make-assembly
package
single
```
## 集群文件分发xsync
https://gitee.com/sean9468_admin/codes/qvwgiesmy79tnx321ljrb30
## 集群执行命令xcall
https://gitee.com/sean9468_admin/codes/cq8x96ajh4pyrgetlsbn259
## Spark 集群
修改spark/conf/slave 文件添加作为worker的节点
修改spark/conf/spark-env.sh
添加
```text
SPARK_MASTER_HOST=master
SPARK_MASTER_PORT=7077
export JAVA_HOME=/opt/java8
```
提交任务
```text
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://master:7077 \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
```
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://master:7077 \
--executor-memory 1G\
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.1.1.jar \
1000
# 服务器集群搭建
## 所需文件
1. centos7 mini 系统
2. jdk 集群脚本准备
3. CDH manager 和CDH文件下载
4. 安装文档
## 步骤
1. 操作系统ip、主机名、防火墙、ntp、seliux配置、hosts、内核参数配置 集群脚本、免密登录,本地yum库
>1.所有机器:执行ssh-keygen 生成秘钥
使用ssh-copy-id设置master可以免密登录其他的子服务器
2.ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.100
在master上 cd ~/.ssh/ ,ls -a 查看 authorized_keys
cat authorized_keys,可以看到设置的slave key
3.使用 cat id_rsa.pub >> authorized_keys
将master 的免密添加进 authorized_keys
4.scp ~/.ssh/authorized_keys root@slave1:/root/.ssh/
将authorized_keys放到所有的服务器的.ssh目录下,可以实现 节点和master的免
修改主机名:
vim /etc/sysconfig/network
2. jdk安装 mysql 填写cm的数据库 下载java 驱动到/usr/share/java
3. yum install server client 修改client/server 的配置
4. 启动server
### 安装JDK
ln -s /opt/jdk/ /usr/lib/jvm/java-8-openjdk/
### 防火墙
systemctl stop firewalld
systemctl disable firewalld
### ntp
调整时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
vim /etc/ntp.conf
xcall systemctl start ntpd
xcall systemctl enable ntpd
### selinux 配置
getenforce Enforcing
vi /etc/selinux/config
```text
SELINUX=permissive
```
### 设置hosts文件
/etc/hosts中 并分发到各节点上xsync /etc/hosts
```text
192.168.2.10 cdh1
192.168.2.11 cdh2
192.168.2.12 cdh3
192.168.2.13 cdh4
192.168.2.14 cdh5
```
### 文件打开数
vi /etc/security/limits.conf
```text
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
```
### 关闭大叶内存
```text
#cat << EOF >> /etc/rc.d/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled
EOF
```
### 搭建本地YUM源
```text
yum install -y httpd
```
启动服务器
systemctl start vsftpd
创建/var/ftp/pub/cm/5.12.1/RPMS/x86_64/目录
```text
cloudera-manager-agent-5.12.1-1.cm5121.p0.6.el7.x86_64.rpm
cloudera-manager-daemons-5.12.1-1.cm5121.p0.6.el7.x86_64.rpm
cloudera-manager-server-5.12.1-1.cm5121.p0.6.el7.x86_64.rpm
cloudera-manager-server-db-2-5.12.1-1.cm5121.p0.6.el7.x86_64.rpm
enterprise-debuginfo-5.12.1-1.cm5121.p0.6.el7.x86_64.rpm
```
创建/var/ftp/pub/parcels/5.12.1/
```text
CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel
CDH-5.12.1-1.cdh5.12.1.p0.3-el7.parcel.sha1
manifest.json
```
制作元数据
yum -y install createrepo
createrepo /var/ftp/pub/
生成/var/ftp/pub/repodata/repomd.xml文件
每个节点上分发cm.repo文件
客户端执行
```text
#yum clean all
#yum makecache
```
### 数据安装
```text
安装命令
yum -y install mariadb mariadb-server
安装完成MariaDB,首先启动MariaDB
systemctl start mariadb
设置开机启动
systemctl enable mariadb
```
### CDM部署
#yum install -y cloudera-manager-server
修改 /etc/init.d/cloudera-scm-server
export JAVA_HOME=/opt/jdk
# /etc/init.d/cloudera-scm-server restart
# /etc/init.d/cloudera-scm-server status
注意查看/var/log/clouder-scm-server的日志
### mysql 驱动安装
```text
mkdir -p /usr/share/java && cd /usr/share/java
cp mysql-connector-java-5.1.44-bin.jar /usr/share/java
mv mysql-connector-java-5.1.44-bin.jar mysql-connector-java.jar
chmod +x mysql-connector-java.jar
```
第五、部署cdm-agent
1、agent安装
#xcall yum -y install cloudera-manager-daemons cloudera-manager-agent
2、修改客户端配置文件config.ini
#xcall cp /etc/cloudera-scm-agent/config.ini /etc/cloudera-scm-agent/config.inibak
#xcall sed -i '/server_host/s/localhost/cdh01.localdomain/' /etc/cloudera-scm-agent/config.ini
3、启动客户端
# xcall /etc/init.d/cloudera-scm-agent restart
# xcall /etc/init.d/cloudera-scm-agent status
### 安装httpd nginx
1、安装软件: yum -y install httpd
2、启动服务:systemctl start httpd
3、设置开机启动: systemctl enable httpd
8、创建httpd-vhosts.conf: vim /etc/httpd/conf.d/httpd-vhosts.conf
9、在httpd-vhosts.conf添加如下内容:
DocumentRoot /var/www/html
ServerName www.test.com
ServerAlias test.com
10、重启http服务:systemctl restart httpd
填写parcel的地址
然后下载 分配
再安装服务。
版本问题很重要
```text
Cloudera 建议将 /proc/sys/vm/swappiness 设置为最大值 10。当前设置为 30。使用 sysctl 命令在运行时更改该设置并编辑 /etc/sysctl.conf,以在重启后保存该设置。您可以继续进行安装,但 Cloudera Manager 可能会报告您的主机由于交换而运行状况不良。以下主机将受到影响:
已启用透明大页面压缩,可能会导致重大性能问题。请运行“echo never > /sys/kernel/mm/transparent_hugepage/defrag”和“echo never > /sys/kernel/mm/transparent_hugepage/enabled”以禁用此设置,然后将同一命令添加到 /etc/rc.local 等初始化脚本中,以便在系统重启时予以设置。以下主机将受到影响:
```
https://www.cnblogs.com/DBA-Ivan/p/7898235.html
```text
xcall chown -R hdfs:hdfs /var/lib/hadoop-hdfs
xcall chown -R httpfs.httpfs /var/lib/hadoop-httpfs
xcall chown -R kms.kms /var/lib/hadoop-kms
xcall chown -R mapred:mapred /var/lib/hadoop-mapreduce
xcall chown -R yarn:yarn /var/lib/hadoop-yarn
xcall chmod -R 755 /var/lib/hadoop-*
```
```sql
create database metastore default character set latin1;
grant all privileges on metastore.* to 'hive'@'%' identified by 'hive_password';
create database amon default character set utf8;
grant all privileges on amon.* to 'amon'@'%' identified by 'amon_password';
create database rman default character set utf8;
grant all privileges on rman.* to 'rman'@'%' identified by 'rman_password';
create database nas default character set utf8;
grant all privileges on nas.* to 'nas'@'%' identified by 'nas_password';
create database nms default character set utf8;
grant all privileges on nms.* to 'nms'@'%' identified by 'nms_password';
create database oozie default character set utf8;
grant all privileges on oozie.* to 'oozie'@'%' identified by 'oozie_password';
create database hue default character set utf8;
grant all privileges on hue.* to 'hue'@'%' identified by 'hue_password';
flush privileges;
```
kafka
https://archive.cloudera.com/kafka/parcels/3.0/
kudu 版本
```text
启动oozie失败
stderr日志:1)/var/lib/oozie/tomcat-deployment目录不存在时创建目录并修改属主
2)Can't load server.xml from /var/lib/oozie/tomcat-deployment/conf/server.xml,在/usr/lib64/cmf/service/oozie/oozie.sh中加sleep,原因未知
```

# Kudu
> 从apache 官网上学习到的摘要
## Apache kudu schema design
为了从kudu 获取组好的性能和操作的稳定性,建模设计是要很关键的。
从一个高的层次看,在创建kudu 表的时候有三个方面的内容:列设计,主键设计和分区设计。
只有分区设计是一个新的概念对于传统非分布式数据库。最后一个章节讨论在存在的表上修改模式,还有一个模式设计的限制。
## The Perfect Schema
好的设计要达到一下内容
1. 数据读写通过tablet server被平均的分发。
2. 数据平均,可预料到的增长依然稳定。
3. scan在满足一个查询条件的时候,扫描最少的数据。主键设计很关键。
## 列设计
kudu 表的列必须明确属性,不是主键的列可以为空
支持以下类型
- boolean
- 8-bit signed integer
- 16-bit signed integer
- 32-bit signed integer
- 64-bit signed integer
- unixtime_micros (64-bit microseconds since the Unix epoch)
- single-precision (32-bit) IEEE-754 floating-point number
- double-precision (64-bit) IEEE-754 floating-point number
- decimal (see Decimal Type for details)
- UTF-8 encoded string (up to 64KB uncompressed)
- binary (up to 64KB uncompressed)
kudu 没有像hbase提供version timestamp 。如有需要必须自己添加。
### Decimal Type 小数类型
### 列编码
每一个列都可以在列类型的基础上创建一个编码

#### plain Encoding
固定长度
#### BitShuffle Encoding
二进制数据压缩的过滤器利用lz4压缩算法。
#### Run Length Encoding
只存储值和count 来压缩。
作为主键存储的数据,如有有连续重复的值是非常高效的。
#### Dictionary Encoding
类似java map。对于低cardinality基数的类是非常有效的。
如果配置了低基数,但是唯一值太高,kudu会转换为plain encoding。
> 高基数:列中有很多唯一值,如主键
> 低基数:与之相反,如性别列(只有男、女)
#### Column Compression
支持LZ4, Snappy, or zlib压缩格式。默认BitShuffle encoding是LZ4压缩算法。
默认其他的不压缩。如果降低存储空间比scan更重要就考虑压缩。
LZ4高效
ZLIB最小的数据空间
#### Primary Key Design
每个表必须有主键,唯一限制,非空,不能为Boolean,float,double
不提供自动增长,应用必须全量插入。
不支持范围删除。
不能更新主键,除非删除之后再insert
#### 回填insert
主键是时间序列,最新的热数据检查主键需要再内容中。
如果加载历史数据,就做回填。每一行击中冷的数据,不放在内容中,会
引起更多的HDD硬盘查询。insert 会有延迟。
为了避免
1. 主键要压缩。
2. SSD
3. 改变主键结构,回填击中连续的主键。
### 分区
kudu 的分区单元为tablets , 依靠tablet server
一行总是分配到一个tablet。分配的方法在创建表的时候。
对于写多,分区到很多的servers 。对于scan多,落到同一个tablet效率最高。
不提供默认的分区策略,越多的tablets越好。
提供了两种分区类型
- 范围分区
- hash分区
#### 范围分区
范围分区用全序分区key来分区rows。没一个分区被分配到一个连续的段。
key必须被包含在主key 列的子集中。
#### 范围分区管理
动态添加移除分区。移除分区会删除内容。新增分区不能与原有分区重叠的部分。
动态管理对时间序列的数据特别有用。可以删除旧分区
#### Hash分区
用hash 值分行到很多的buckets的一个。
对于随机分发写有效。
#### 复合分区
多个hash分区可以与可选的范围分区结合。
限制:多个hash 分区不能用同样的列。
#### 分区例子
```sql
CREATE TABLE metrics (
host STRING NOT NULL,
metric STRING NOT NULL,
time INT64 NOT NULL,
value DOUBLE NOT NULL,
PRIMARY KEY (host, metric, time),
);
```
范围分区分有界和无界分区

Hash 分区

hash分区增大写的吞吐量,range分区避免了tablet持续增长
将两者结合起来用最好了。

多个hash 维度的分区
相当于多个维度(索引),类似向量线性代数

## Schema 修改
表重命名
重命名主键列
重命名、添加、删除非主键列
增加删除分区。
结合限制总结为:特殊:主键列不能修改,每个列不能更改类型
分区不能更改类型。
## 限制
- 不要超过300个列。
- 单个cell不超过64kb
- 一行不超过几百kb
- UTF-8
- 不能更新主键列
- 创建表之后不能修改主键
- 不能修改分区的类型hash 或者range。但是可以增加和删除。
- 不许列的类型修改
- 分区不能被分割和merge。
# Kudu: Storage for Fast Analytics on Fast Data
## 摘要
- 结构化数据
- 低延迟随机读写
- 水平分区和副本
> In order to keep your data safe and available at all times, Kudu uses the Raft consensus algorithm to replicate all operations for a given tablet. Raft, like Paxos, ensures that every write is persisted by at least two nodes before responding to the client request, ensuring that no data is ever lost due to a machine failure.
## 介绍
列采用确定的数据类型有两个原因
1. 类型列式编码
2. SQL元数据对于其他商业智能BI和数据分析工具
## 写操作
提供JAVA,C++ PYTHON
insert update delete
## 读操作
唯一操作命令:scan
两种过滤条件:
- 列与固定值的比较
- 主键范围
写明返回哪些列
## 其他API
除了数据API ,还有关于hadoop 生态组件,数据映射的api。
## 一致性模型
默认:snapshot consistency.
## 时间戳
内部使用时间戳实现一致性空值,这个时间戳不能被用户更改。
与Cassandra和HBase 不同。
## 架构
### 集群角色
Master 元数据维护 提高失败容忍可以副本支持快速失败。
Tablet Servers 数据维护
### 分区
推荐每个machine 10-100个tablet
分区类型:hash 和范围
hash分区包含 哪些列和buckets的数量。
```sql
DISTRIBUTE BY
HASH(hostname, ts) INTO 16 BUCKETS.
```
### 副本
创建表的时候指定replication factor 典型的是3或者5
依赖可用性SLA/
用Raft consensus 算法复制副本。
除此之外增删改查的操作业务用Raft协议保证一致。
如果客户端请求过时,leader不会应答。
Raft 算法 500millisecond 心跳 1500millisecond 选举超时
### 集成
没有提供shell ,只有通过impala才可以操作。
### 存储格式
#### Comparison with Parquet
Across the set of queries, Kudu
performed on average 31% faster than Parquet. W
#### Comparison with Phoenix(Hbase)