我正在尝试用Elasticsearch替换Solr设置.这是一个新的设置,还没有看到生产,所以我有很多空间摆弄东西,让他们运作良好.
我有非常非常大量的数据.我正在索引一些实时数据并持续7天(通过使用_ttl字段).我不在索引中存储任何数据(并禁用_source字段).我希望我的指数稳定在200亿左右.我将把这些数据放入2-3个命名索引中.到目前为止,搜索性能高达几十亿行是完全可以接受的,但索引性能是一个问题.
我对ES如何在内部使用分片感到有些困惑.我创建了两个ES节点,每个节点都有一个单独的数据目录,每个节点有8个索引和1个副本.当我查看群集状态时,我只看到每个节点有一个分片和一个副本.每个节点是否保持内部运行多个索引?(检查磁盘存储位置显示肯定只有一个Lucene索引存在). - 已解决,因为我的索引设置未从配置中正确选取.使用API创建索引并指定分片和副本的数量现在已经产生了我期望看到的内容.
此外,我尝试运行相同ES节点的多个副本(来自相同的配置),并且它识别出已经存在副本并且创建其自己的工作区域.这些新的节点实例似乎也只有一个索引在磁盘上. - 既然每个节点实际上都在使用多个索引,那么具有多个索引的单个节点就足以限制整个系统,因此这不是问题.
何时启动其他Elasticsearch节点,以获得最大的索引性能?我应该有多个节点,每个节点运行1个索引1副本,或更少的节点有多吨索引?为了让单个节点做更多的工作,我的配置是否缺少一些东西?
另外:是否有任何指标可用于了解何时仅HTTP节点过载?现在我只有一个节点专门用于HTTP,但除了CPU使用情况之外,我无法判断它是否正常.什么时候启动其他HTTP节点并将索引软件拆分为指向各个节点?
我有这样的数据:
{"key": {"name":"hi", "size":10}}
Run Code Online (Sandbox Code Playgroud)
"关键"是一种动态价值.它不是固定的.我可以访问name和size使用此JSON路径:
*.name
*.size
Run Code Online (Sandbox Code Playgroud)
如何使用JSON Path获取"key"本身的值?*给我的数据的整个行,都$和@给予我在解析器"元素没有找到".
我正在尝试使用JSON输入步骤在Pentaho中执行此操作.
在我的应用程序中,我需要查看新文件的目录.流量非常大,每秒至少会有数百个新文件出现.目前我正在使用这种想法的繁忙循环:
while True:
time.sleep(0.2)
if len(os.listdir('.')) > 0:
# do stuff
Run Code Online (Sandbox Code Playgroud)
运行性能分析后,我看到很多时间都在睡眠中,我想知道是否应该改变它来使用轮询.
我正在尝试使用其中一个可用的类select来轮询我的目录,但我不确定它是否真的有效,或者我是否只是做错了.
我为我的目录获得了一个fd:
fd = os.open('.', os.O_DIRECT)
Run Code Online (Sandbox Code Playgroud)
然后我尝试了几种方法来查看目录何时更改.举个例子,我尝试过的一件事是:
poll = select.poll()
poll.register(fd, select.POLLIN)
poll.poll() # returns (fd, 1) meaning 'ready to read'
os.read(fd, 4096) # prints largely gibberish but i can see that i'm pulling the files/folders contained in the directory at least
poll.poll() # returns (fd, 1) again
os.read(fd, 4096) # empty string - no more data
Run Code Online (Sandbox Code Playgroud)
为什么poll()表现得有更多的信息需要阅读?我假设只有在目录中发生了某些变化时才会这样做.
我想在这里做什么甚至可能吗?
如果没有,还有其他更好的选择while True: look for changes吗?
我有一个Postgresql函数,它返回一个定义为(位置TEXT,id INT)的复合类型.当我运行"SELECT myfunc()"时,我的输出是一个text类型的单列,格式为:
("locationdata", myid)
Run Code Online (Sandbox Code Playgroud)
这太可怕了.有没有办法选择我的复合,以便我得到2列 - 一个TEXT列和一个INT列?
对于使用监视程序进程运行的一些python进程,我遇到了一个奇怪的问题.
看门狗过程是用Python编写,是家长,并有一个名为函数start_child(名称),它使用subprocess.Popen打开子进程.记录Popen对象,以便监视程序可以使用poll()监视进程,并在需要时最终以terminate()结束.如果孩子意外死亡,监视程序再次调用start_child(name)并记录新的Popen对象.
有7个子进程,所有这些进程也都是python.如果我手动运行任何子项,我可以使用kill发送SIGTERM或SIGINT 并获得我期望的结果(过程结束).
但是,当从看门狗进程运行时,子进程将仅在FIRST信号之后结束.当监视程序重新启动子进程时,新的子进程不再响应SIGTERM或SIGINT.我不知道造成这种情况的原因.
watchdog.py
class watchdog:
# <snip> various init stuff
def start(self):
self.running = true
kids = ['app1', 'app2', 'app3', 'app4', 'app5', 'app6', 'app7']
self.processes = {}
for kid in kids:
self.start_child(kid)
self.thread = threading.Thread(target=self._monitor)
self.thread.start()
while self.running:
time.sleep(10)
def start_child(self, name):
try:
proc = subprocess.Popen(name)
self.processes[name] = proc
except:
print "oh no"
else:
print "started child ok"
def _monitor(self):
while …Run Code Online (Sandbox Code Playgroud)