对不起,很长的帖子!
我有一个包含~30个表(InnoDB引擎)的数据库.这些表中只有两个,即"事务"和"移位"非常大(第一个有150万行,移位有23k行).现在一切正常,我没有当前数据库大小的问题.
但是,我们将有一个类似的数据库(相同的数据类型,设计,...),但更大,例如,"交易"表将有大约10亿条记录(每天约2,300万笔交易),我们正在考虑如何我们应该在MySQL中处理这么大量的数据?(这是读写密集型).我阅读了很多相关帖子,看看Mysql(更具体地说是InnoDB引擎)是否可以与数十亿条记录表现良好,但我仍然有一些问题.我读过的一些相关帖子如下:
到目前为止我已经理解为提高非常大的表的性能:
innodb_buffer_pool_size(例如,高达80%的RAM).此外,我在percona博客中找到了一些其他MySQL性能调整设置这是我的问题/困惑:
关于分区,我怀疑是否应该使用它.一方面,许多人建议在桌子非常大时提高性能.另一方面,我读过许多帖子,说它不会提高查询性能,也不会使查询运行得更快(例如,这里和这里).另外,我在MySQL参考手册中读到InnoDB外键和MySQL分区不兼容(我们有外键).
关于指标,现在他们表现良好,但据我了解,对于非常大的表的索引是更严格(如凯文·比德尔在他的回答中提到在这里).此外,索引加速读取,同时减慢写入(插入/更新).那么,对于我们将拥有这个大型数据库的新类似项目,我们应该首先插入/加载所有数据然后创建索引吗?(加快插入速度)
如果我们不能对我们的大表("事务"表)使用分区,那么提高性能的另一种选择是什么?(除了MySQl变量设置之外innodb_buffer_pool_size).我们应该使用Mysql集群吗?(我们也有很多连接)
这是show create table我们最大的名为"transaction"的表的声明:
CREATE TABLE `transaction` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`terminal_transaction_id` int(11) NOT NULL,
`fuel_terminal_id` int(11) NOT NULL,
`fuel_terminal_serial` int(11) NOT NULL,
`xboard_id` int(11) NOT NULL,
`gas_station_id` int(11) NOT NULL,
`operator_id` text NOT NULL,
`shift_id` int(11) NOT …Run Code Online (Sandbox Code Playgroud) 在阅读了这篇伟大的Nettuts +文章的提示之后,我想出了一个表模式,它可以将高度易变的数据与其他表进行大量读取分离,同时降低整个数据库模式中所需的表数,但是我我不确定这是不是一个好主意,因为它不符合规范化的规则,我想听听你的意见,这里是一般性的想法:
我有四种类型的模拟用户的类表继承结构,在主"用户"表我常用的数据存储到所有用户(id,username,password,数flags,...)与一些一起TIMESTAMP字段(date_created,date_updated,date_activated,date_lastLogin,. ..).
引用上面提到的Nettuts +文章中的#16提示:
示例2:表中有"last_login"字段.每次用户登录网站时它都会更新.但是表上的每次更新都会导致刷新该表的查询缓存.您可以将该字段放入另一个表中,以将用户表的更新保持在最低限度.
现在它变得更加棘手,我需要跟踪一些用户统计信息
在我完全规范化的数据库中,这增加了大约8到10个额外的表,这不是很多但是如果可以的话我想保持简单,所以我想出了以下" events"表:
|------|----------------|----------------|---------------------|-----------|
| ID | TABLE | EVENT | DATE | IP |
|------|----------------|----------------|---------------------|-----------|
| 1 | user | login | 2010-04-19 00:30:00 | 127.0.0.1 |
|------|----------------|----------------|---------------------|-----------|
| 1 | …Run Code Online (Sandbox Code Playgroud) 我有一个存储在S3中的weka模型,大小约为400MB.现在,我有一些记录,我想在其中运行模型并执行预测.
为了进行预测,我试过的是,
在驱动程序上下载并加载模型作为静态对象,将其广播给所有执行程序.对预测RDD执行映射操作.---->不工作,如在Weka中执行预测,需要修改模型对象,并且广播需要只读副本.
在驱动程序上下载并加载模型作为静态对象,并在每个映射操作中将其发送到执行程序.----->工作(效率不高,如在每个地图操作中,我传递400MB对象)
在驱动程序上下载模型并将其加载到每个执行程序上并将其缓存在那里.(不知道该怎么做)
有人知道如何在每个执行程序上加载模型一次并将其缓存,以便其他记录我不再加载它?
我试图DataFrame用Parquet格式保存到HDFS,使用DataFrameWriter三列值进行分区,如下所示:
dataFrame.write.mode(SaveMode.Overwrite).partitionBy("eventdate", "hour", "processtime").parquet(path)
Run Code Online (Sandbox Code Playgroud)
正如提到的这个问题,partitionBy将在删除分区的全部现有层次path,并在分区取而代之dataFrame.由于特定日期的新增量数据将定期出现,我想要的是仅替换层次结构中dataFrame具有数据的那些分区,而保持其他分区不变.
要做到这一点,似乎我需要使用其完整路径单独保存每个分区,如下所示:
singlePartition.write.mode(SaveMode.Overwrite).parquet(path + "/eventdate=2017-01-01/hour=0/processtime=1234567890")
Run Code Online (Sandbox Code Playgroud)
但是我无法理解将数据组织到单分区中DataFrame的最佳方法,以便我可以使用它们的完整路径将它们写出来.一个想法是这样的:
dataFrame.repartition("eventdate", "hour", "processtime").foreachPartition ...
Run Code Online (Sandbox Code Playgroud)
但foreachPartition操作上Iterator[Row]是不理想的写出来镶木格式.
我还考虑使用a select...distinct eventdate, hour, processtime获取分区列表,然后按每个分区过滤原始数据帧并将结果保存到完整的分区路径.但是,每个分区的独特查询加过滤器似乎效率不高,因为它会进行大量的过滤/写入操作.
我希望有一种更简洁的方法来保留dataFrame没有数据的现有分区?
谢谢阅读.
Spark版本:2.1
我正在对包含时态数据的非常大的表进行分区,并考虑我应该创建分区的粒度.Postgres 分区文档声称"大量分区可能会大大增加查询计划时间",并建议将分区与"最多可能有一百个"分区一起使用.
假设我的表持有十年的数据,如果我按周分区,我最终会有超过500个分区.在我对此进行排除之前,我想更好地了解分区数量对查询计划时间的影响.有没有人对此进行过基准测试,或者是否有人对内部的工作方式有所了解?
有下一个分区表:
CREATE TABLE "ERMB_LOG_TEST_BF"."OUT_SMS"(
"TRX_ID" NUMBER(19,0) NOT NULL ENABLE,
"CREATE_TS" TIMESTAMP (3) DEFAULT systimestamp NOT NULL ENABLE,
/* other fields... */
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE(BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "ERMB_LOG_TEST_BF"
PARTITION BY RANGE ("TRX_ID") INTERVAL (281474976710656)
(PARTITION "SYS_P1358" VALUES LESS THAN (59109745109237760) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 8388608 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT …Run Code Online (Sandbox Code Playgroud) sql oracle partitioning prepared-statement sql-execution-plan
众所周知,Spark中的分区器对任何"广泛"操作都会产生巨大的性能影响,因此通常会在操作中进行自定义.我正在尝试以下代码:
val rdd1 =
sc.parallelize(1 to 50).keyBy(_ % 10)
.partitionBy(new HashPartitioner(10))
val rdd2 =
sc.parallelize(200 to 230).keyBy(_ % 13)
val cogrouped = rdd1.cogroup(rdd2)
println("cogrouped: " + cogrouped.partitioner)
val unioned = rdd1.union(rdd2)
println("union: " + unioned.partitioner)
Run Code Online (Sandbox Code Playgroud)
我看到默认情况下cogroup()总是会生成带有自定义分区程序的RDD,但union()不会,它将始终恢复为默认值.这是违反直觉的,因为我们通常假设PairRDD应该使用其第一个元素作为分区键.有没有办法"强制"Spark合并2个PairRDD以使用相同的分区键?
我需要使用Spark SQL从Hive表加载数据HiveContext并加载到HDFS中.默认情况下,DataFramefrom SQL输出有2个分区.为了获得更多的并行性,我需要更多的SQL分区.HiveContext中没有重载方法来获取分区数参数.
RDD的重新分区导致改组并导致更多的处理时间.
>
val result = sqlContext.sql("select * from bt_st_ent")
Run Code Online (Sandbox Code Playgroud)
有日志输出:
Starting task 0.0 in stage 131.0 (TID 297, aster1.com, partition 0,NODE_LOCAL, 2203 bytes)
Starting task 1.0 in stage 131.0 (TID 298, aster1.com, partition 1,NODE_LOCAL, 2204 bytes)
Run Code Online (Sandbox Code Playgroud)
我想知道有没有办法增加SQL输出的分区大小.
(注:通过以下通过的答案更新.)
对于PostgreSQL 8.1(或更高版本)分区表,UPDATE如果UPDATE暗示对定义分区隔离的约束字段进行更改,如何定义将记录从一个分区"移动"到另一个分区的触发器和过程?
例如,我将表记录分区为活动和非活动记录,如下所示:
create table RECORDS (RECORD varchar(64) not null, ACTIVE boolean default true);
create table ACTIVE_RECORDS ( check (ACTIVE) ) inherits RECORDS;
create table INACTIVE_RECORDS ( check (not ACTIVE) ) inherits RECORDS;
Run Code Online (Sandbox Code Playgroud)
该INSERT触发器和功能工作做好,新的活动记录放在一个表中获取,而在另一个新的非活动记录.我想UPDATE在ACTIVE字段中将记录从一个后代表"移动"到另一个表,但是遇到一个错误,表明这可能是不可能的.
触发规范和错误消息:
pg=> CREATE OR REPLACE FUNCTION record_update()
RETURNS TRIGGER AS $$
BEGIN
IF (NEW.active = OLD.active) THEN
RETURN NEW;
ELSIF (NEW.active) THEN
INSERT INTO active_records VALUES (NEW.*);
DELETE FROM inactive_records WHERE record = NEW.record;
ELSE
INSERT INTO …Run Code Online (Sandbox Code Playgroud) partitioning ×10
apache-spark ×4
database ×2
mysql ×2
performance ×2
postgresql ×2
sql ×2
hive ×1
indexing ×1
oracle ×1
parquet ×1
relational ×1
scala ×1
triggers ×1
weka ×1