# 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,原因未知 ``` ![](tup/oozie.png) # 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 小数类型 ### 列编码 每一个列都可以在列类型的基础上创建一个编码 ![编码类型](tup/encoding.png) #### 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), ); ``` 范围分区分有界和无界分区 ![范围分区](tup/range.png) Hash 分区 ![Hash 分区](tup/has.png) hash分区增大写的吞吐量,range分区避免了tablet持续增长 将两者结合起来用最好了。 ![multi](tup/multi.png) 多个hash 维度的分区 相当于多个维度(索引),类似向量线性代数 ![multihash](tup/multihash.png) ## 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)