我们需要序列化一些数据以放入solr和hadoop.
我正在评估序列化工具.
我名单中的前两位是Gson和Avro.
据我所知,Avro = Gson + Schema-In-JSON
如果这是正确的,我不明白为什么Avro如此受Solr/Hadoop的欢迎?
我在互联网上搜索了很多,但找不到一个正确的答案.
它所说的任何地方,Avro都很好,因为它存储架构.我的问题是如何处理该架构?
对于Hadoop中的非常大的对象可能是好的,其中单个对象存储在多个文件块中,使得存储每个部分的模式有助于更好地分析它.但即使在这种情况下,模式也可以单独存储,只需对其进行引用就足以描述模式.我认为没有理由为什么架构应该成为每一件作品的一部分.
如果有人可以给我一些好的用例,Avro如何帮助他们,而Gson/Jackson不能达到此目的,那将非常有帮助.
此外,Avro网站上的官方文档说我们需要为Avro提供一个架构,以帮助它生成Schema + Data.我的问题是,如果输入架构并将相同的数据发送到输出以及数据的JSON表示,那么Avro正在实现什么额外的?我可以不通过使用JSON序列化对象,添加我的输入模式并将其称为Avro来自己做吗?
我真的很困惑!
有一个假设的Web服务器只支持一个非常简单的API - 在过去的小时,分钟和秒中收到的请求数.该服务器在世界上非常流行,每秒收到数千个请求.
瞄准它找到如何准确地将这3个计数返回到每个请求?
请求一直在进行,因此每个请求的一小时,一分钟和一秒的窗口是不同的.如何根据请求管理不同的窗口,以便每个请求的计数正确?
我经历过
无处解释使用此标志的好处.
这是性能优势吗?如果是的话,是否会有一个粗略的定义,将会有多少性能优势?(我知道性能问题的答案完全取决于具体情况,但是如果有人报告这样做会带来好处,那就太好了).
这是最近在一次采访中向朋友询问的,除了简单的O(n 3)之外,我们不知道任何解决方案.
有更好的算法吗?
问题是在整数数组中找到所有三元组,其总和小于或等于给定的总和S.
注意:我已经在SO上看到了其他类似的问题,性能为O(n 2 log n),但是所有这些问题都解决了这个问题的简单版本,比如arr[i] + arr[j] + arr[k] = S他们只在哪里检查是否存在这样的三元组.
我的问题是找出所有i,j,k在arr[]这样arr[i] + arr[j] + arr[k] <= S
我需要帮助来理解为什么下面的代码需要3到4秒.
更新:我的应用程序的用例是获取自上次登录以来的人的活动供稿.此Feed可能包含来自朋友的更新或他网络之外的一些他可能感兴趣的新项目.Activity表存储所有这些活动,当用户登录时,我在GAE-DataStore上运行查询以返回上述活动.我的应用程序也支持无限滚动,因此我需要GAE的光标功能.在给定的时间,我得到大约32个项目,但活动表可能有数百万行(因为它包含来自所有用户的数据).
目前,Activity表很小,只包含25条记录,下面的java代码只读取同一个表中的3条记录.
Activity表中的每条记录都有4个UUID字段.
我无法想象如果表包含数百万行并且结果包含100行,则查询将如何表现.
以下代码有什么问题吗?
(我正在使用Objectify和app-engine游标)
Filter filter = new FilterPredicate("creatorID", FilterOperator.EQUAL, userId);
Query<Activity> query = ofy().load().type(Activity.class).filter(filter);
query = query.startAt(Cursor.fromWebSafeString(previousCursorString));
QueryResultIterator<Activity> itr = query.iterator();
while (itr.hasNext())
{
Activity a = itr.next();
System.out.println (a);
}
Run Code Online (Sandbox Code Playgroud)
我已经浏览了Google App Engine应用程序非常慢并且验证了如果我继续刷新页面(调用上面的代码),响应时间会有所改善.但是,改善只有~30%
将此与任何其他数据库进行比较,这些微小数据的响应时间以毫秒为单位,甚至不到100毫秒.
我期望从GAE DataStore获得常规数据库性能是错误的吗?
我还不想打开memcache,因为我想先改进这个层而不先缓存.
高级消费者API似乎一次只读取一条消息.
如果消费者想要处理这些消息并将其提交给Solr或Elastic-Search等其他下游消费者,因为他们更喜欢批量发送消息而不是一次发送消息,这对消费者来说可能是个问题.
将这些消息在内存中批处理也不是一件容易的事,因为Kafka中的偏移量也只需要在批处理已经提交时同步,否则崩溃的kafka-consumer与未提交的下游消息(如在Solr或ES中)将具有其偏移量已经更新,因此消息松散.
如果在向下游提交消息之后但在更新消息偏移之前崩溃,消费者可能会多次使用消息.
如果Kafka批量使用消息,那么一些指向代码/文档的指针将非常受欢迎.
谢谢!
我的项目包含一些依赖性,这些依赖性正在拉动相同的共同依赖性.
公共依赖项storm-kafka具有新版本1.0.2和旧版本0.10.0
在构建一个带阴影的jar时,我会看到我的胖罐中的两个版本中的类,并且在执行过程中以某种方式,较旧的一个被拾取,这给出了一个ClassNotFoundError因为与旧版本相关的其他依赖项不存在.
jar -xvf my_shaded_fat_jar.jar
find . -name KeyValueSchemeAsMultiScheme.class
./org/apache/storm/kafka/KeyValueSchemeAsMultiScheme.class
./storm/kafka/KeyValueSchemeAsMultiScheme.class
Run Code Online (Sandbox Code Playgroud)
storm/kafka是旧的,org/apache/storm/kafka是我想要的新的.
令人惊讶的是我在我的~/.m2回购中看不到0.10.0 :
ls ~/.m2/repository/org/apache/storm/storm-kafka/
1.0.2
# no 0.10.0 here !
Run Code Online (Sandbox Code Playgroud)
如何调试maven以找出较旧的依赖关系从何处蔓延?
编辑:
在跑步时mvn dependency:tree -Dverbose -Dincludes=storm.kafka,我得到:
[WARNING] The POM for org.apache.storm:flux-core:jar:1.0.2 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
[WARNING] The POM for org.apache.storm:storm-kafka:jar:1.0.2 is invalid, transitive dependencies (if any) will not be available, enable debug logging for …Run Code Online (Sandbox Code Playgroud) 我有一个项目,其依赖关系树很大,即它包含来自多个团队的模块。
现在有一些常用的依赖关系,它们在多个模块中是通用的。
一个简化的例子可以是:
TopModule.jar
ChildModule.jar
CommonModule-v1.jar
CommonModule-v2.jar
Run Code Online (Sandbox Code Playgroud)
当我构建项目时,我指定了公共依赖项的最新版本,但很难向其他每个团队提出相同的要求。
因此,TopModule 通常是使用不同版本的 CommonModule 构建的(上例中的 v1 和 v2)。
我的问题是:
如果最终的 jar 文件同时包含 CommonModule-v1.jar 和 CommonModule-v2.jar,它对运行时有何影响?
运行时是否会错误地加载需要 v1 的版本 v2,反之亦然?
我已经浏览了https://www.elastic.co/blog/found-interfacing-elasticsearch-picking-client上的官方文档
但它没有给出任何基准或性能数据来帮助客户进行选择.我发现设置TransportClient或设置NodeClient非常简单,因为它的文档也非常稀少,几乎没有任何示例.
因此,如果有人已经在选择客户端时做了一些基准测试,我会非常感谢并且更多地关注调整已建立的客户端而不是评估要选择的客户端.
我们的应用程序是一个重量级的应用程序,我们计划为此设置一个50-shard,50-replica ES集群.
这个问题是参考https://zookeeper.apache.org/doc/trunk/zookeeperObservers.html
观察员是一个集合的无投票权成员,他们只听到投票结果,而不是导致投票结果的协议协议。除了这个简单的区别之外,观察者的功能与追随者完全相同——客户端可以连接到它们并向它们发送读取和写入请求。观察者像追随者一样将这些请求转发给领导者,但他们只是等待听到投票结果。因此,我们可以在不损害投票性能的情况下,随心所欲地增加观察者的数量。
观察者还有其他优势。因为它们不投票,所以它们不是 ZooKeeper 集合的关键部分。因此,它们可能会失败,或与集群断开连接,而不会损害 ZooKeeper 服务的可用性。对用户的好处是观察者可以通过比追随者更不可靠的网络链接进行连接。事实上,观察者可用于与来自另一个数据中心的 ZooKeeper 服务器通信。Observer 的客户端将看到快速读取,因为所有读取都在本地提供,并且写入导致最小的网络流量,因为在没有投票协议的情况下所需的消息数量较少。
1)合奏团的无投票权成员- 有投票权的成员投票什么?
2)观察者的更新请求是如何工作的- 当 ZK 领导者收到更新请求时,它需要法定人数的节点来响应。观察者节点似乎不被视为法定节点。这是否意味着观察者节点在更新方面落后于领导者节点?如果这是真的,它如何确保观察者节点在读取过程中不响应陈旧数据?
3)观察者的客户端将看到快速读取,因为所有读取都是在本地提供的,并且写入导致最小的网络流量,因为在没有投票协议的情况下所需的消息数量较少- 来自所有其他节点的读取也将是本地只是因为它们与领导者同步,不是吗?我没有得到关于写入的部分。
这些问题应该有助于理解zookeeper和分布式系统。感谢这些问题的详细答案。提前致谢 !
java ×4
algorithm ×2
maven ×2
performance ×2
apache ×1
apache-kafka ×1
apache-storm ×1
avro ×1
hadoop ×1
jvm ×1
solr ×1
web-services ×1