- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在从 Cloud Functions 写入 BigTable 时遇到问题。
机器的内存消耗增加,因此我怀疑某处存在内存泄漏。
BigTable 设置:
cbt createtable test
cbt createfamily test data
最少代码:
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "google_auth.json"
import datetime
import random
import sys
import os
import string
from google.cloud import bigtable
from google.api_core.retry import Retry
def insert_row(project_id, instance, table, row_key, column_family_id, data):
client_bigtable = bigtable.Client(project=project_id, admin=True)
# Generate an instance so that we can put our features into BigTable
instance = client_bigtable.instance(instance)
table = instance.table(table)
# We need to keep a list of table changes into a list, then perform a mutation to update all changes.
rows = []
# Create a timestamp, this is required to set a cell
time = datetime.datetime.utcnow()
for key, value in data.items():
row = table.row(row_key)
# If we cannot convert to string, and this happens with unicode values, we need to encode the string
# into unicode first
row.set_cell(
column_family_id=column_family_id.encode(),
column=key.encode(),
value=str(value).encode("unicode-escape"),
timestamp=time
)
rows.append(row)
table_mutation = table.mutate_rows(rows, retry=Retry(deadline=1200))
# If the code is not 0, then there is an issue
if any([True if i.code != 0 else False for i in table_mutation]):
logging.error(f"Function Name: {insert_row.__qualname__}, Function Locals: {locals()}")
raise RuntimeError("BigTable table mutation error")`
data = {
''.join(random.choices(string.ascii_uppercase + string.digits, k=15)):''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) for _ in range(100)
}
while True:
insert_row(
project_id="user-tracking-228117",
instance="analytics",
table="test",
row_key=f"{random.randint(0, sys.maxsize)}_{datetime.datetime.utcnow().strftime('%Y_%m_%d_%H_%M_%S_%f')}",
column_family_id="data",
data=data
)
内存消耗:
> 34755 ubuntu 20 0 1118552 128968 21952 S 2.3 0.4 0:04.99 python3.6
> 34755 ubuntu 20 0 1118552 129844 21952 S 2.0 0.4 0:05.05 python3.6
> 34755 ubuntu 20 0 1118552 129968 21952 S 1.0 0.4 0:05.08 python3.6
> 34755 ubuntu 20 0 1118552 130780 21952 S 1.6 0.4 0:05.13 python3.6
> 34755 ubuntu 20 0 1119116 132212 21952 S 9.2 0.4 0:05.41 python3.6
> 34755 ubuntu 20 0 1119116 134008 21952 S 4.3 0.4 0:05.54 python3.6
> 34755 ubuntu 20 0 1119116 134944 21952 S 2.6 0.4 0:05.62 python3.6
> 34755 ubuntu 20 0 1119116 137924 21952 S 6.6 0.4 0:05.82 python3.6
> 34755 ubuntu 20 0 1119116 138536 21952 S 1.7 0.4 0:05.87 python3.6
> 34755 ubuntu 20 0 1119116 139988 21952 S 3.0 0.4 0:05.96 python3.6
> 34755 ubuntu 20 0 1119096 141768 21952 S 11.2 0.4 0:06.30 python3.6
> 34755 ubuntu 20 0 1119096 144140 21952 S 4.6 0.4 0:06.44 python3.6
> 34755 ubuntu 20 0 1119096 145140 21952 S 2.6 0.4 0:06.52 python3.6
> 34755 ubuntu 20 0 1119096 148648 21952 S 7.6 0.5 0:06.75 python3.6
> 34755 ubuntu 20 0 1119096 148920 21952 S 0.7 0.5 0:06.77 python3.6
> 34755 ubuntu 20 0 1119096 149828 21952 S 2.3 0.5 0:06.84 python3.6
> 34755 ubuntu 20 0 1119608 152796 21952 S 12.2 0.5 0:07.21 python3.6
> 34755 ubuntu 20 0 1119608 154692 21952 S 4.6 0.5 0:07.35 python3.6
> 34755 ubuntu 20 0 1119608 155448 21952 S 1.6 0.5 0:07.40 python3.6
> 34755 ubuntu 20 0 1119608 156656 21952 S 2.6 0.5 0:07.48 python3.6
> 34755 ubuntu 20 0 1119608 157724 21952 S 2.6 0.5 0:07.56 python3.6
> 34755 ubuntu 20 0 1119608 160796 21952 S 6.9 0.5 0:07.77 python3.6
> 34755 ubuntu 20 0 1119608 161616 21952 S 1.7 0.5 0:07.82 python3.6
> 34755 ubuntu 20 0 1185468 163896 21952 S 12.8 0.5 0:08.21 python3.6
> 34755 ubuntu 20 0 1185476 167612 21952 S 7.6 0.5 0:08.44 python3.6
> 34755 ubuntu 20 0 1185476 170552 21952 S 6.6 0.5 0:08.64 python3.6
> 34755 ubuntu 20 0 1185804 173848 21952 S 13.5 0.5 0:09.05 python3.6
> 34755 ubuntu 20 0 1185804 173848 21952 S 0.3 0.5 0:09.06 python3.6
> 34755 ubuntu 20 0 1185804 176724 21952 S 6.6 0.5 0:09.26 python3.6
> 34755 ubuntu 20 0 1185804 180588 21952 S 8.5 0.6 0:09.52 python3.6
> 34755 ubuntu 20 0 1185804 181524 21952 S 2.3 0.6 0:09.59 python3.6
> 34755 ubuntu 20 0 1186116 183228 21952 S 12.5 0.6 0:09.97 python3.6
> 34755 ubuntu 20 0 1186116 183228 21952 S 0.7 0.6 0:09.99 python3.6
> 34755 ubuntu 20 0 1186116 183276 21952 S 0.3 0.6 0:10.00 python3.6
> 34755 ubuntu 20 0 1186116 183296 21952 S 0.3 0.6 0:10.01 python3.6
> 34755 ubuntu 20 0 1186116 183332 21952 S 0.3 0.6 0:10.02 python3.6
> 34755 ubuntu 20 0 1186116 183436 21952 S 0.7 0.6 0:10.04 python3.6
> 34755 ubuntu 20 0 1186116 183516 21952 S 0.7 0.6 0:10.06 python3.6
> 34755 ubuntu 20 0 1186116 183616 21952 S 0.3 0.6 0:10.07 python3.6
> 34755 ubuntu 20 0 1186116 183656 21952 S 0.3 0.6 0:10.08 python3.6
> 34755 ubuntu 20 0 1186116 183656 21952 S 0.3 0.6 0:10.09 python3.6
> 34755 ubuntu 20 0 1186116 183680 21952 S 0.3 0.6 0:10.10 python3.6
> 34755 ubuntu 20 0 1186116 183708 21952 S 0.3 0.6 0:10.11 python3.6
> 34755 ubuntu 20 0 1186116 183728 21952 S 0.3 0.6 0:10.12 python3.6
内存:128968 ==> 183728
运行一段时间后,我遇到了错误:
---------------------------------------------------------------------------
_Rendezvous Traceback (most recent call last)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/google/api_core/grpc_helpers.py in next(self)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/grpc/_channel.py in __next__(self)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/grpc/_channel.py in _next(self)
_Rendezvous: <_Rendezvous of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "Getting metadata from plugin failed with error: [('system library', 'fopen', 'Too many open files'), ('BIO routines', 'BIO_new_file', 'system lib'), ('x509 certificate routines', 'X509_load_cert_crl_file', 'system lib')]"
debug_error_string = "{"created":"@1548443075.831642536","description":"Getting metadata from plugin failed with error: [('system library', 'fopen', 'Too many open files'), ('BIO routines', 'BIO_new_file', 'system lib'), ('x509 certificate routines', 'X509_load_cert_crl_file', 'system lib')]","file":"src/core/lib/security/credentials/plugin/plugin_credentials.cc","file_line":82,"grpc_status":14}"
>
The above exception was the direct cause of the following exception:
ServiceUnavailable Traceback (most recent call last)
<ipython-input-3-9f1f73192607> in <module>
12 row_key=f"{random.randint(0, sys.maxsize)}_{datetime.datetime.utcnow().strftime('%Y_%m_%d_%H_%M_%S_%f')}",
13 column_family_id="data",
---> 14 data=data
15 )
16
<ipython-input-1-e79f91f922f9> in insert_row(project_id, instance, table, row_key, column_family_id, data)
34 )
35 rows.append(row)
---> 36 table_mutation = table.mutate_rows(rows, retry=Retry(deadline=1200))
37
38 # If the code is not 0, then there is an issue
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/google/cloud/bigtable/table.py in mutate_rows(self, rows, retry)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/google/cloud/bigtable/table.py in __call__(self, retry)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/google/api_core/retry.py in retry_wrapped_func(*args, **kwargs)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/google/api_core/retry.py in retry_target(target, predicate, sleep_generator, deadline, on_error)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/google/cloud/bigtable/table.py in _do_mutate_retryable_rows(self)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/google/api_core/grpc_helpers.py in next(self)
~/python3_virtualenv/python3_env/lib/python3.6/site-packages/six.py in raise_from(value, from_value)
ServiceUnavailable: 503 Getting metadata from plugin failed with error: [('system library', 'fopen', 'Too many open files'), ('BIO routines', 'BIO_new_file', 'system lib'), ('x509 certificate routines', 'X509_load_cert_crl_file', 'system lib')]
我认为问题出在 gRPC 客户端。
Cloud Functions 的问题之一是所有对象都不是持久的,因此每个写入请求都会打开客户端,但由于 gRPC 客户端未释放,内存消耗仍在该实例下使用。但是,由于gRPC客户端没有关闭,那么有没有办法强制关闭BigTable下使用的gRPC客户端呢?
最佳答案
您应该能够使用以下代码关闭客户端。它是在拉取请求 https://github.com/googleapis/google-cloud-python/pull/6630 中引入的.
client.table_data_client.transport.channel.close()
关于python - BigTable 和 gRPC - 内存泄漏,如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54371554/
为什么 BigTable 被构造为“family:qualifier”的两级层次结构?具体来说,为什么要强制执行此操作而不是仅使用列,并且例如建议用户将其限定符命名为“vertical:column”
Google 现在允许您使用 BigTable(在 Google Cloud Platform 中托管为名为“Cloud Bigtable”的产品)开发应用程序。但是,我找不到太多关于如何为其设计模式
Google Cloud Bigtable 看起来很棒,但是我对备份和冗余有一些疑问。 是否有备份数据以防止人为错误的任何选项? 集群当前在单个区域中运行 - 是否有任何方法可以缓解区域不可用的情况?
我们有一些用例,希望在 Google Bigtable 中长期存储大量数据: 产品开发期间 用于性能调整 用于演示 我们需要存储数据,但我们并不真正需要它始终“在线”。当前的成本瓶颈似乎是节点的成本,
我想衡量 Cloud Bigtable 在获取具有特定前缀的键的许多行计数方面的性能。 假设一个模式的行键在末尾带有 unix 时间戳,例如,event_id#unix_timestamp。 如果我需
根据Cloud Bigtable performance docs我应该有一定的数据量来保证最高的吞吐量。 在“性能较慢的原因”下它说: The workload isn't appropriate
BigTable 是否支持类似于 INCR 的原子增量操作?在 Redis 中? BT的Golang库中有这个函数-https://godoc.org/cloud.google.com/go/bigt
我们正在试用 BigTable 并进行容量规划。我们认为一个节点可以满足我们实现初期的需求,以后我们会根据需要添加更多节点。我唯一的问题是,我们是否需要多个节点才能提供高可用性? (我对什么是“节点”
我们已经设置了具有 5 个节点的 Bigtable 集群,GCP 控制台指出它应该支持 50K QPS @ 6ms 的读取和写入。 我们正在尝试加载一个大型数据集(约 8 亿条记录),其中约 50 个
我有一个只有一个列族的表,该列的 TTL 为 24 小时,但我需要在截止日期前删除一些数据。 为了实现这个目标,我伪造了插入日期。例如:如果我需要在插入后 1 小时删除一行,我将插入日期设置为 23
我有一个只有一个列族的表,该列的 TTL 为 24 小时,但我需要在截止日期前删除一些数据。 为了实现这个目标,我伪造了插入日期。例如:如果我需要在插入后 1 小时删除一行,我将插入日期设置为 23
我正在尝试使用以下 YAML 配置文件部署 Bigtable 实例: resources: - name: foo-bigtable-instance type: bigtableadmin.v2
有人可以提供一个真实的例子来说明如何在 Bigtable 中构建数据吗?请从搜索引擎、社交网络或任何其他熟悉的角度讨论,清楚而务实地说明行 -> 列族 -> 列组合如何优于传统的规范化关系方法。 最佳
我创建了一个 Google Bigtable 集群。我正在尝试连接以下 this tutorial我试图下载他们的 cli 项目并构建它,但是当我尝试执行任何命令时它都会失败。我还尝试构建更简单的连接
避免热点的 Bigtable 行键方案? 一家公司需要您在 Google Bigtable 中创建一个架构,以允许对过去 2 年的记录进行历史分析。收到的每条记录每 15 分钟发送一次,其中包含设备的
我们目前正在调查使用多个列族对我们的 bigtable 查询性能的影响。我们发现将列拆分为多个列族并不会提高性能。有没有人有过类似的经历? 关于我们的基准设置的更多细节。此时,我们生产表中的每一行都包
假设有一行包含列族和其中的列。该列族有一个 gc 策略,并且该列中的所有值都刚刚过期。 那么,该行会发生什么情况?该行会被垃圾收集器删除吗?或者,它仍然存在并且可以访问吗? 我检查了文档,但只发现 h
假设有一行包含列族和其中的列。该列族有一个 gc 策略,并且该列中的所有值都刚刚过期。 那么,该行会发生什么情况?该行会被垃圾收集器删除吗?或者,它仍然存在并且可以访问吗? 我检查了文档,但只发现 h
来自 CBT 的文档 // READING OP HERE timestamp := bigtable.Now() mut := bigtable.NewMutation() mut.Set(colu
来自bigtable的论文。 bigtable我读到了这个: Each METADATA row stores approximately 1KB of data in memory. With a
我是一名优秀的程序员,十分优秀!