在使用Openstack Swift客户端库时,我遇到了Python生成器的问题.
手头的问题是我试图从特定的URL(大约7MB)中检索大量数据,将字符串分成较小的位,然后发回一个生成器类,每次迭代都保存一个字符串的块.在测试套件中,这只是一个字符串,它被发送到swift客户端的monkeypatched类进行处理.
monkeypatched类中的代码如下所示:
def monkeypatch_class(name, bases, namespace):
'''Guido's monkeypatch metaclass.'''
assert len(bases) == 1, "Exactly one base class required"
base = bases[0]
for name, value in namespace.iteritems():
if name != "__metaclass__":
setattr(base, name, value)
return base
Run Code Online (Sandbox Code Playgroud)
在测试套件中:
from swiftclient import client
import StringIO
import utils
class Connection(client.Connection):
__metaclass__ = monkeypatch_class
def get_object(self, path, obj, resp_chunk_size=None, ...):
contents = None
headers = {}
# retrieve content from path and store it in 'contents'
...
if resp_chunk_size is not None:
# …Run Code Online (Sandbox Code Playgroud) 我想用OpenStack Swift或Amazon S3的相同界面实现云存储服务.换句话说,我的云存储服务应公开上述服务的相同API,但具有自定义实现.这样,客户端就能够在不改变其实现的情况下与我的服务进行互操作.
我不知道是否有比从文件开始手动实现这样的接口比较简单的方法:http://docs.openstack.org/api/openstack-object-storage/1.0/content/ HTTP://docs.aws.amazon .COM/AmazonS3 /最新/ API/APIRest.html
例如,如果有一个OpenStack Swift或Amazon S3 API的"骨架",我可以从中开始实现我的服务.
谢谢
我Account (joss.model.Account)在配置中创建了一个
allowReauthenticate=true
Run Code Online (Sandbox Code Playgroud)
我打电话给帐户创建后几乎是immidiateley
Access mAccess = mAccount.authenticate(); // (joss.model.Access)
Run Code Online (Sandbox Code Playgroud)
之后我需要使用令牌.我在30分钟和1.5小时和24小时等之后使用它,通过调用mAccess.getToken()Token外出时间为1小时.我可以假设重新认证将被执行,并且在2.4小时之后,令牌将有效吗?或者我需要手动重新验证?
即mAccess.getToken()在1.5小时和24小时后将返回无效(过期的令牌).在这种情况下如何正确重新验证?
我已经使用Spark 1.3.0并使用它将Parquet文件写入Openstack Swift Object store一段时间了.我使用大约12个分区的镶木地板文件,在Swift上将拼花文件分成几个部分.编写文件没有问题.但是当我尝试通过Spark阅读它时,我得到了这个错误:
ERROR Executor: Exception in task 9.0 in stage 2.0 (TID 22)
java.io.EOFException
at java.io.DataInputStream.readFully(DataInputStream.java:197)
at java.io.DataInputStream.readFully(DataInputStream.java:169)
at parquet.hadoop.ParquetFileReader$ConsecutiveChunkList.readAll(ParquetFileReader.java:730)
at parquet.hadoop.ParquetFileReader.readNextRowGroup(ParquetFileReader.java:490)
at parquet.hadoop.InternalParquetRecordReader.checkRead(InternalParquetRecordReader.java:116)
at parquet.hadoop.InternalParquetRecordReader.nextKeyValue(InternalParquetRecordReader.java:193)
at parquet.hadoop.ParquetRecordReader.nextKeyValue(ParquetRecordReader.java:204)
at org.apache.spark.rdd.NewHadoopRDD$$anon$1.hasNext(NewHadoopRDD.scala:143)
at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:39)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327)
at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:308)
at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:327)
at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:210)
at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:63)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:68)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
at org.apache.spark.scheduler.Task.run(Task.scala:64)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:203)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
Run Code Online (Sandbox Code Playgroud)
我正在通过https://github.com/openstack/sahara-extra/tree/master/hadoop-swiftfs使用Hadoop-Swift补丁,它使Hadoop能够将Swift识别为文件系统.
注1:如果将文件从Swift下载到本地文件系统,Spark可以完美地读取文件.
注2:我也注意到如果我不对镶木地板文件进行分区,那么读取是完美的.
谁使用Spark,Openstack Swift?
我想使用文件夹或容器路径删除所有文件和文件夹,而不列出其中的所有文件。是否可以?
我想用 Swift 上传文件。我在 python 中执行了这段代码:
import swiftclient
swift = swiftclient.client.Connection(auth_version='1',user='test:tester',key='testing',authurl='http://localhost:8080/auth/v1.0')
# Create the swift container
swift.put_container('cute-cats')
# Upload the object
with open('cat.jpg', 'rb') as f:
file_data = f.read()
swift.put_object('cute-cats', 'cat.jpg', file_data)
# List the containers
print swift.head_account()
# List the objects in the cute cats containers
print swift.head_container('cute-cats')
Run Code Online (Sandbox Code Playgroud)
代码正在运行,但是,如何检查文件是否存储在 swift 中?Swift 文件夹中不存在该文件。
谢谢。
在我的OpenStack Swift版本2.14.0安装中创建和擦除存储桶(容器)效果很好.这是一个Swift唯一的安装.没有部署像Keystone这样的OpenStack服务.
$ swift stat
Account: AUTH_test
Containers: 2
Objects: 0
Bytes: 0
Containers in policy "policy-0": 2
Objects in policy "policy-0": 0
Bytes in policy "policy-0": 0
Connection: keep-alive
...
$ swift post s3perf
$ swift list -A http://10.0.0.253:8080/auth/v1.0 -U test:tester -K testing
bucket
s3perf
Run Code Online (Sandbox Code Playgroud)
这些是关于文件内桶创建的(正面)消息storage1.error.
$ tail -f /var/log/swift/storage1.error
...
May 9 13:58:50 raspberrypi container-server: STDERR: (1114) accepted
('127.0.0.1', 38118)
May 9 13:58:50 raspberrypi container-server: STDERR: 127.0.0.1 - -
[09/May/2017 11:58:50] "POST /d1/122/AUTH_test/s3perf HTTP/1.1" 204 142 …Run Code Online (Sandbox Code Playgroud) 我已经测试了使用多线程应用程序将对象上传到swift中,该应用程序创建了创建对象的单独请求.有20个线程,我每个线程平均每秒约6个对象.数学表明,这需要很长时间才能完成.我转向批量操作,现在有一个运行的多线程应用程序上传tar.gz文件,其中包含各自容器中的文件.它可以工作,但它比我用单个对象请求运行的速度慢.我正在运行10个线程,每个线程上传一个包含4000个对象的tar.gz.这10个线程的运行速度接近每个线程每秒约2个对象.似乎有些事情我一定做错了.
似乎swift在5到10秒内收到文件,但是花费300到1600秒解压缩并将对象放在容器中.我对此并不乐观,它基于观看正在上传到swift的机器上的网络流量.
考虑可能影响绩效的因素:
这种操作的最佳实践是什么?
几乎在每个OpenStack Swift文档中都提到TempAuth是一个仅用于测试非prod环境的解决方案(但是它的功能完全正常).
在prod中不使用此方法的关键原因是用户信用存储在普通配置文件中,这会降低对象存储的整体安全性.
另一方面,如果App在内部使用对象存储(因此它只在内部基础架构中存储文件),并且App本身提供了身份验证和授权,那么这种方法似乎可能适合生产使用.
您是否可以在prod环境中分享TempAuth使用的任何其他缺点,考虑到对象存储是内部的(或添加其他参数,它没关系:))?
openstack-swift ×10
openstack ×6
cloud ×3
api ×2
python ×2
amazon-s3 ×1
apache-spark ×1
hadoop ×1
hdfs ×1
installation ×1
java ×1
parquet ×1
permissions ×1
python-2.7 ×1
raspbian ×1
token ×1