Setting up Druid on a firewalled machine

Hello, I am trying to setup Druid on a machine that sits behind a firewall. I followed the steps in the tutorial to deploy Driud and Zookeeper. When I try to run the tutorial example, it fails at the point where it tries to obtain dependencies:

2015-07-01T00:50:58,723 ERROR [main] io.druid.initialization.Initialization - Unable to resolve artifacts for [io.druid.extensions:druid-examples:jar:0.7.3 (runtime) -> < [ (https://repo1.maven.org/maven2/, releases+snapshots), (https://metamx.artifactoryonline.com/metamx/pub-libs-releases-local, releases+snapshots)]].

java.lang.NullPointerException

at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies(DefaultRepositorySystem.java:361) ~[aether-impl-0.9.0.M2.jar:?]

at io.tesla.aether.internal.DefaultTeslaAether.resolveArtifacts(DefaultTeslaAether.java:289) ~[tesla-aether-0.0.5.jar:0.0.5]

at io.druid.initialization.Initialization.getClassLoaderForCoordinates(Initialization.java:214) [druid-server-0.7.3.jar:0.7.3]

at io.druid.initialization.Initialization.getFromExtensions(Initialization.java:141) [druid-server-0.7.3.jar:0.7.3]

at io.druid.cli.Main.main(Main.java:76) [druid-services-0.7.3.jar:0.7.3]

Exception in thread “main” java.lang.NullPointerException

at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies(DefaultRepositorySystem.java:361)

at io.tesla.aether.internal.DefaultTeslaAether.resolveArtifacts(DefaultTeslaAether.java:289)

at io.druid.initialization.Initialization.getClassLoaderForCoordinates(Initialization.java:214)

at io.druid.initialization.Initialization.getFromExtensions(Initialization.java:141)

at io.druid.cli.Main.main(Main.java:76)

``

I understand that this is because the firewall is preventing access, and I read that I need to pull the dependencies to a local repository. However, I am struggling with doing so. What do I need to do to get the necessary dependencies?

Any help or guidance is much appreciated.

Thanks,

Tim

Hi Tim,

you can run pull deps using the following command io.druid.cli.Main tools pull-deps -Ddruid.extensions.localRepository=<Directory_to_pull_dependencies>

what are the issues you are facing when you run this command ?

Hi Nishant, thank you for replying.

I ran the command, but I am still getting the same error:

2015-07-01T09:35:35,358 ERROR [main] io.druid.initialization.Initialization - Unable to resolve artifacts for [io.druid.extensions:druid-examples:jar:0.7.3 (runtime) -> < [ (https://repo1.maven.org/maven2/, releases+snapshots), (https://metamx.artifactoryonline.com/metamx/pub-libs-releases-local, releases+snapshots)]].

java.lang.NullPointerException

at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies(DefaultRepositorySystem.java:361) ~[aether-impl-0.9.0.M2.jar:?]

at io.tesla.aether.internal.DefaultTeslaAether.resolveArtifacts(DefaultTeslaAether.java:289) ~[tesla-aether-0.0.5.jar:0.0.5]

at io.druid.initialization.Initialization.getClassLoaderForCoordinates(Initialization.java:214) [druid-server-0.7.3.jar:0.7.3]

at io.druid.initialization.Initialization.getFromExtensions(Initialization.java:141) [druid-server-0.7.3.jar:0.7.3]

at io.druid.cli.Main.main(Main.java:76) [druid-services-0.7.3.jar:0.7.3]

Exception in thread “main” java.lang.NullPointerException

at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies(DefaultRepositorySystem.java:361)

at io.tesla.aether.internal.DefaultTeslaAether.resolveArtifacts(DefaultTeslaAether.java:289)

at io.druid.initialization.Initialization.getClassLoaderForCoordinates(Initialization.java:214)

at io.druid.initialization.Initialization.getFromExtensions(Initialization.java:141)

at io.druid.cli.Main.main(Main.java:76)

``

I think it is still trying to dependencies from the remote repository and failing because of the firewall. Is there a way I can download those dependencies on my own machine? If I can do that, I can transfer the files to the machine behind the firewall.

Any ideas?

Thanks,

Tim

Hi Tim,

Yes, you can manually download this extension and put its dependent jars in the classpath, and set druid.extensions.coordinates= so that Druid won’t download it.

Hi Bingkun, thank you for responding. Where do I find the extensions to download them manually?

You should be able to run the same pull-deps command locally then copy the files wherever you need

Thanks Charles. Did that, and it looks like it is trying to reach the geolite.maxmind.com DB but fails because of the firewall.

I had extracted Druid locally on my Windows machine (with Java 1.7.0_51), and added the following property to the common.runtime.properties:
druid.extensions.localRepository=C:/Temp/druid-0.7.3/repo

``

Then, I ran the following pull-deps command:

java -classpath “C:\Temp\druid-0.7.3\config_common;C:\Temp\druid-0.7.3\lib*” io.druid.cli.Main tools pull-deps

``

Once all dependencies were downloaded successfully, I transferred them to the machine behind the firewall and followed these steps. Now, I am getting the following error when I try to run the example script:

2015-07-01T20:38:02,910 ERROR [main] io.druid.cli.CliBroker - Error when starting up. Failing.

com.google.inject.ProvisionException: Guice provision errors:

  1. Error injecting constructor, java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class io.druid.segment.realtime.firehose.WikipediaIrcDecoder] value failed: geolite.maxmind.com (through reference chain: java.util.ArrayList[0])

at io.druid.guice.FireDepartmentsProvider.(FireDepartmentsProvider.java:41)

while locating io.druid.guice.FireDepartmentsProvider

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:79)

while locating java.util.List<io.druid.segment.realtime.FireDepartment>

for parameter 0 at io.druid.segment.realtime.RealtimeManager.(RealtimeManager.java:85)

while locating io.druid.segment.realtime.RealtimeManager

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:83)

while locating io.druid.query.QuerySegmentWalker

for parameter 3 at io.druid.server.QueryResource.(QueryResource.java:89)

while locating io.druid.server.QueryResource

1 error

at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1014) ~[guice-4.0-beta.jar:?]

at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1036) ~[guice-4.0-beta.jar:?]

at io.druid.guice.LifecycleModule$2.start(LifecycleModule.java:134) ~[druid-api-0.3.8.jar:0.7.3]

Caused by: java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class io.druid.segment.realtime.firehose.WikipediaIrcDecoder] value failed: geolite.maxmind.com (through reference chain: java.util.ArrayList[0])

at com.google.common.base.Throwables.propagate(Throwables.java:160) ~[guava-16.0.1.jar:?]

at io.druid.guice.FireDepartmentsProvider.(FireDepartmentsProvider.java:52) ~[druid-server-0.7.3.jar:0.7.3]

… 25 more

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Instantiation of [simple type, class io.druid.segment.realtime.firehose.WikipediaIrcDecoder] value failed: geolite.maxmind.com (through reference chain: java.util.ArrayList[0])

at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.wrapException(StdValueInstantiator.java:405) ~[jackson-databind-2.4.4.jar:2.4.4]

at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:234) ~[jackson-databind-2.4.4.jar:2.4.4]

at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:167) ~[jackson-databind-2.4.4.jar:2.4.4]

… 25 more

Caused by: java.net.UnknownHostException: geolite.maxmind.com

at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178) ~[?:1.7.0_80]

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.7.0_80]

at java.net.Socket.connect(Socket.java:579) ~[?:1.7.0_80]

… 25 more

``

Any suggestions?

Tim

Hi Tim, the file it’s trying to download is only needed to run the Wikipedia example firehose.

To work around it, download http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz ,

gunzip it, and copy it to ${java.io.tmpdir}/io.druid.segment.realtime.firehose.WikipediaIrcDecoder.GeoLite2-City.mmdb

This way it won’t try to download it on the fly.

Thanks Xavier, this got rid of the UnknownHostException exception, but now getting this error when I run the wikipedia example script:

2015-07-01T21:36:51,543 ERROR [main] io.druid.cli.CliBroker - Error when starting up. Failing.

com.google.inject.ProvisionException: Guice provision errors:

  1. Error injecting constructor, java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Guice provision errors:

  2. Unknown provider[mysql] of Key[type=io.druid.metadata.SQLMetadataConnector, annotation=[none]], known options[[derby]]

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.SQLMetadataConnector

for parameter 2 at io.druid.metadata.SQLMetadataSegmentPublisher.<init>(SQLMetadataSegmentPublisher.java:51)

while locating io.druid.metadata.SQLMetadataSegmentPublisher

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.MetadataSegmentPublisher

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:62)

while locating io.druid.segment.realtime.SegmentPublisher annotated with @com.google.inject.multibindings.Element(setName=,uniqueId=70, type=MAPBINDER)

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.segment.realtime.SegmentPublisher

1 error (through reference chain: java.util.ArrayList[0])

at io.druid.guice.FireDepartmentsProvider.(FireDepartmentsProvider.java:41)

while locating io.druid.guice.FireDepartmentsProvider

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:79)

while locating java.util.List<io.druid.segment.realtime.FireDepartment>

for parameter 0 at io.druid.segment.realtime.RealtimeManager.<init>(RealtimeManager.java:85)

while locating io.druid.segment.realtime.RealtimeManager

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:83)

while locating io.druid.query.QuerySegmentWalker

for parameter 3 at io.druid.server.QueryResource.<init>(QueryResource.java:89)

while locating io.druid.server.QueryResource

1 error

    at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1014) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1036) ~[guice-4.0-beta.jar:?]

    at io.druid.guice.LifecycleModule$2.start(LifecycleModule.java:134) ~[druid-api-0.3.8.jar:0.7.3]

    at io.druid.cli.GuiceRunnable.initLifecycle(GuiceRunnable.java:71) [druid-services-0.7.3.jar:0.7.3]

    at io.druid.cli.ServerRunnable.run(ServerRunnable.java:38) [druid-services-0.7.3.jar:0.7.3]

    at io.druid.cli.Main.main(Main.java:88) [druid-services-0.7.3.jar:0.7.3]

Caused by: java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: Guice provision errors:

  1. Unknown provider[mysql] of Key[type=io.druid.metadata.SQLMetadataConnector, annotation=[none]], known options[[derby]]

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.SQLMetadataConnector

for parameter 2 at io.druid.metadata.SQLMetadataSegmentPublisher.<init>(SQLMetadataSegmentPublisher.java:51)

while locating io.druid.metadata.SQLMetadataSegmentPublisher

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.MetadataSegmentPublisher

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:62)

while locating io.druid.segment.realtime.SegmentPublisher annotated with @com.google.inject.multibindings.Element(setName=,uniqueId=70, type=MAPBINDER)

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.segment.realtime.SegmentPublisher

1 error (through reference chain: java.util.ArrayList[0])

    at com.google.common.base.Throwables.propagate(Throwables.java:160) ~[guava-16.0.1.jar:?]

    at io.druid.guice.FireDepartmentsProvider.<init>(FireDepartmentsProvider.java:52) ~[druid-server-0.7.3.jar:0.7.3]

    at io.druid.guice.FireDepartmentsProvider$$FastClassByGuice$$229da177.newInstance(<generated>) ~[guice-4.0-beta.jar:0.7.3]

    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:108) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[guice-4.0-beta.jar:?]

    at com.google.inject.Scopes$1$1.get(Scopes.java:65) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:107) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:56) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[guice-4.0-beta.jar:?]

    at io.druid.guice.LifecycleScope$1.get(LifecycleScope.java:49) ~[druid-api-0.3.8.jar:0.7.3]

    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:107) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001) ~[guice-4.0-beta.jar:?]

    ... 5 more

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Guice provision errors:

  1. Unknown provider[mysql] of Key[type=io.druid.metadata.SQLMetadataConnector, annotation=[none]], known options[[derby]]

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.SQLMetadataConnector

for parameter 2 at io.druid.metadata.SQLMetadataSegmentPublisher.<init>(SQLMetadataSegmentPublisher.java:51)

while locating io.druid.metadata.SQLMetadataSegmentPublisher

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.MetadataSegmentPublisher

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:62)

while locating io.druid.segment.realtime.SegmentPublisher annotated with @com.google.inject.multibindings.Element(setName=,uniqueId=70, type=MAPBINDER)

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.segment.realtime.SegmentPublisher

1 error (through reference chain: java.util.ArrayList[0])

    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:210) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:189) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:206) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2122) ~[jackson-databind-2.4.4.jar:2.4.4]

    at io.druid.guice.FireDepartmentsProvider.<init>(FireDepartmentsProvider.java:43) ~[druid-server-0.7.3.jar:0.7.3]

    at io.druid.guice.FireDepartmentsProvider$$FastClassByGuice$$229da177.newInstance(<generated>) ~[guice-4.0-beta.jar:0.7.3]

    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:108) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[guice-4.0-beta.jar:?]

    at com.google.inject.Scopes$1$1.get(Scopes.java:65) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:107) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:56) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[guice-4.0-beta.jar:?]

    at io.druid.guice.LifecycleScope$1.get(LifecycleScope.java:49) ~[druid-api-0.3.8.jar:0.7.3]

    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:107) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001) ~[guice-4.0-beta.jar:?]

    ... 5 more

Caused by: com.google.inject.ProvisionException: Guice provision errors:

  1. Unknown provider[mysql] of Key[type=io.druid.metadata.SQLMetadataConnector, annotation=[none]], known options[[derby]]

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.SQLMetadataConnector

for parameter 2 at io.druid.metadata.SQLMetadataSegmentPublisher.<init>(SQLMetadataSegmentPublisher.java:51)

while locating io.druid.metadata.SQLMetadataSegmentPublisher

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.metadata.MetadataSegmentPublisher

at io.druid.guice.RealtimeModule.configure(RealtimeModule.java:62)

while locating io.druid.segment.realtime.SegmentPublisher annotated with @com.google.inject.multibindings.Element(setName=,uniqueId=70, type=MAPBINDER)

at io.druid.guice.PolyBind.createChoiceWithDefault(PolyBind.java:67)

while locating io.druid.segment.realtime.SegmentPublisher

1 error

    at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1014) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1036) ~[guice-4.0-beta.jar:?]

    at com.fasterxml.jackson.databind.introspect.GuiceInjectableValues.findInjectableValue(GuiceInjectableValues.java:47) ~[druid-common-0.7.3.jar:0.7.3]

    at com.fasterxml.jackson.databind.DeserializationContext.findInjectableValue(DeserializationContext.java:293) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.impl.PropertyValueBuffer.inject(PropertyValueBuffer.java:66) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.startBuilding(PropertyBasedCreator.java:160) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:331) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:132) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:536) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:156) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer._deserializeTypedForId(AsPropertyTypeDeserializer.java:113) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:84) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeWithType(BeanDeserializerBase.java:956) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:536) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:344) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1064) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:232) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:206) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066) ~[jackson-databind-2.4.4.jar:2.4.4]

    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2122) ~[jackson-databind-2.4.4.jar:2.4.4]

    at io.druid.guice.FireDepartmentsProvider.<init>(FireDepartmentsProvider.java:43) ~[druid-server-0.7.3.jar:0.7.3]

    at io.druid.guice.FireDepartmentsProvider$$FastClassByGuice$$229da177.newInstance(<generated>) ~[guice-4.0-beta.jar:0.7.3]

    at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:61) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:108) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.BoundProviderFactory.get(BoundProviderFactory.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[guice-4.0-beta.jar:?]

    at com.google.inject.Scopes$1$1.get(Scopes.java:65) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:107) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:56) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1058) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[guice-4.0-beta.jar:?]

    at io.druid.guice.LifecycleScope$1.get(LifecycleScope.java:49) ~[druid-api-0.3.8.jar:0.7.3]

    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:107) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:88) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:269) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl$3$1.call(InjectorImpl.java:1005) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1051) ~[guice-4.0-beta.jar:?]

    at com.google.inject.internal.InjectorImpl$3.get(InjectorImpl.java:1001) ~[guice-4.0-beta.jar:?]

    ... 5 more

``

What could be the issue now?

Hi Tim,

You need to load this extension “io.druid.extensions:mysql-metadata-storage:0.7.3” in order to use mysql as metadata storage.

http://druid.io/docs/latest/configuration/#metadata-storage

Hi Bingkun, the JAR exists in the local repo under /druid-0.7.3/repo/io/druid/extensions/mysql-metadata-storage/0.7.3 and common.runtime.properties already has the following:

druid.metadata.storage.type=mysql

druid.metadata.storage.connector.connectURI=jdbc:mysql://localhost:3306/druid

druid.metadata.storage.connector.user=druid

druid.metadata.storage.connector.password=diurd

druid.extensions.localRepository=/druid-0.7.3/repo

``

Do I need to “load” the extension differently?

Hi Tim,

There are two ways to load extensions to Druid, one is let Druid download remote extensions, which requires Internet access. The other one is manually putting extension jars in the Druid classpath. In your case, you need to put locations of each jar file under /druid-0.7.3/repo/io/druid/extensions/mysql-metadata-storage/0.7.3 into your classpath.

Hi Bingkun, thank you for the clarification. So, I added the JAR path to the CLASSPATH in my .bash_profile:

CLASSPATH=/druid-0.7.3/repo/io/druid/extensions/mysql-metadata-storage/0.7.3/mysql-metadata-storage-0.7.3.jar:$CLASSPATH

export CLASSPATH

``

When I echo the CLASSPATH, I am getting:

/druid-0.7.3/repo/io/druid/extensions/mysql-metadata-storage/0.7.3/mysql-metadata-storage-0.7.3.jar:

``

But when I run the example script, I still get the same error. Mind you, the only JAR file under /druid-0.7.3/repo/io/druid/extensions/mysql-metadata-storage/0.7.3/ is mysql-metadata-storage-0.7.3.jar

Am I missing something here?

Hi Tim,

If you look at the run_example_server.sh, there is a variable called DRUID_CP, which is the classpath used by the java command. You can append the locations of extension jar files to that variable. For mysql-metadata-storage, make sure DRUID_CP contains jdbi-2.32.jar(under org/jdbi/2.32),mysql-connector-java-5.1.34.jar(under mysql/mysql-connector-java/5.1.34) and mysql-metadata-storage-0.7.3.jar. You can verify this by echo DRUID_CP.

Related post

https://groups.google.com/forum/m/#!topic/druid-user/tiRCi0P9mjw

Hi Bingkun, looks like adding the JAR filepath to DRUID_CP as you’ve suggested fixed the issue, thank you very much!

Now, I am getting this error:

2015-07-02T10:30:11,651 INFO [main-EventThread] org.apache.curator.framework.state.ConnectionStateManager - State change: CONNECTED

2015-07-02T10:30:21,414 INFO [main] io.druid.segment.realtime.firehose.IrcFirehoseFactory - connecting to irc server [irc.wikimedia.org]

2015-07-02T10:30:21,434 INFO [ServerInventoryView-0] io.druid.client.BatchServerInventoryView - Inventory Initialized

2015-07-02T10:30:36,430 ERROR [main] io.druid.cli.CliBroker - Error when starting up. Failing.

java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_80]

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_80]

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_80]

at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_80]

at com.metamx.common.lifecycle.Lifecycle$AnnotationBasedHandler.start(Lifecycle.java:331) ~[java-util-0.27.0.jar:?]

at com.metamx.common.lifecycle.Lifecycle.start(Lifecycle.java:250) ~[java-util-0.27.0.jar:?]

at io.druid.guice.LifecycleModule$2.start(LifecycleModule.java:136) ~[druid-api-0.3.8.jar:0.7.3]

at io.druid.cli.GuiceRunnable.initLifecycle(GuiceRunnable.java:71) [druid-services-0.7.3.jar:0.7.3]

at io.druid.cli.ServerRunnable.run(ServerRunnable.java:38) [druid-services-0.7.3.jar:0.7.3]

at io.druid.cli.Main.main(Main.java:88) [druid-services-0.7.3.jar:0.7.3]

Caused by: java.nio.channels.UnresolvedAddressException

at sun.nio.ch.Net.checkAddress(Net.java:107) ~[?:1.7.0_80]

at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:649) ~[?:1.7.0_80]

at com.ircclouds.irc.api.comms.SocketChannelConnection.open(SocketChannelConnection.java:24) ~[irc-api-1.0-0011.jar:?]

at com.ircclouds.irc.api.AbstractIRCSession.open(AbstractIRCSession.java:104) ~[irc-api-1.0-0011.jar:?]

at com.ircclouds.irc.api.IRCApiImpl.connect(IRCApiImpl.java:99) ~[irc-api-1.0-0011.jar:?]

at io.druid.segment.realtime.firehose.IrcFirehoseFactory.connect(IrcFirehoseFactory.java:116) ~[druid-server-0.7.3.jar:0.7.3]

at io.druid.segment.realtime.firehose.IrcFirehoseFactory.connect(IrcFirehoseFactory.java:59) ~[druid-server-0.7.3.jar:0.7.3]

at io.druid.segment.realtime.FireDepartment.connect(FireDepartment.java:97) ~[druid-server-0.7.3.jar:0.7.3]

at io.druid.segment.realtime.RealtimeManager$FireChief.init(RealtimeManager.java:207) ~[druid-server-0.7.3.jar:0.7.3]

at io.druid.segment.realtime.RealtimeManager.start(RealtimeManager.java:109) ~[druid-server-0.7.3.jar:0.7.3]

… 10 more

``

I don’t suppose I can download irc.wikimedia.org locally, can I?

Hi Tim,

It is trying to connect to the IRC to fetch the event stream which is not being allowed by the firewall.

you can have a look at the Local firehose which can ingest events from local files.

the format of firehose can be found here - http://druid.io/docs/latest/ingestion/firehose.html

you can either create a sample data file yourself or use the sample tpch dataset that we used for benchmarking druid.

(more details about the dataset can be found here - http://druid.io/blog/2014/03/17/benchmarking-druid.html)

Hi Nishant, I did a few tried here and there, and I feel like I am almost there getting the example to work.

I figured out the JSON structure that it should look something like the following:

{“timestamp”: “2013-08-31T01:02:33Z”, “page”: “Gypsy Danger”, “language” : “en”, “user” : “nuclear”, “unpatrolled” : “true”, “newPage” : “true”, “robot”: “false”, “anonymous”: “false”, “namespace”:“article”, “continent”:“North America”, “country”:“United States”, “region”:“Bay Area”, “city”:“San Francisco”, “added”: 57, “deleted”: 200, “delta”: -143}

{“timestamp”: “2013-08-31T03:32:45Z”, “page”: “Striker Eureka”, “language” : “en”, “user” : “speed”, “unpatrolled” : “false”, “newPage” : “true”, “robot”: “true”, “anonymous”: “false”, “namespace”:“wikipedia”, “continent”:“Australia”, “country”:“Australia”, “region”:“Cantebury”, “city”:“Syndey”, “added”: 459, “deleted”: 129, “delta”: 330}

{“timestamp”: “2013-08-31T07:11:21Z”, “page”: “Cherno Alpha”, “language” : “ru”, “user” : “masterYi”, “unpatrolled” : “false”, “newPage” : “true”, “robot”: “true”, “anonymous”: “false”, “namespace”:“article”, “continent”:“Asia”, “country”:“Russia”, “region”:“Oblast”, “city”:“Moscow”, “added”: 123, “deleted”: 12, “delta”: 111}

{“timestamp”: “2013-08-31T11:58:39Z”, “page”: “Crimson Typhoon”, “language” : “zh”, “user” : “triplets”, “unpatrolled” : “true”, “newPage” : “false”, “robot”: “true”, “anonymous”: “false”, “namespace”:“wikipedia”, “continent”:“Asia”, “country”:“China”, “region”:“Shanxi”, “city”:“Taiyuan”, “added”: 905, “deleted”: 5, “delta”: 900}

{“timestamp”: “2013-08-31T12:41:27Z”, “page”: “Coyote Tango”, “language” : “ja”, “user” : “cancer”, “unpatrolled” : “true”, “newPage” : “false”, “robot”: “true”, “anonymous”: “false”, “namespace”:“wikipedia”, “continent”:“Asia”, “country”:“Japan”, “region”:“Kanto”, “city”:“Tokyo”, “added”: 1, “deleted”: 10, “delta”: -9}

``

I could also figure out that the firehose will need to be something like this:

“firehose”: {

“type”: “local”,

“baseDir”: “/druid-0.7.3/data”,

“filter”: “my_wikipedia_data.json”

},

``

What I am still unable to figure out is the rest of the wikipedia_realtime.spec file. Specifically, the fields highlighted:

[{

“dataSchema”: {

"dataSource": "wikipedia",

"parser": {

  "type": "string",

  "parseSpec": {

    "format": "json",

    "timestampSpec": {

      "column": "timestamp",

      "format": "auto"

    },

    "dimensionsSpec": {

      "dimensions": [

        "page",

        "language",

        "user",

        "unpatrolled",

        "newPage",

        "robot",

        "anonymous",

        "namespace",

        "continent",

        "country",

        "region",

        "city"

      ],

      "dimensionExclusions": [],

      "spatialDimensions": []

    }

  },

  "decoder": {

    "type": "wikipedia",

    "namespaces": {

      "#en.wikipedia": {

        "_empty_": "main",

        "Category": "category",

        "$1 talk": "project talk",

        "Template talk": "template talk",

        "Help talk": "help talk",

        "Media": "media",

        "MediaWiki talk": "mediawiki talk",

        "File talk": "file talk",

        "MediaWiki": "mediawiki",

        "User": "user",

        "File": "file",

        "User talk": "user talk",

        "Template": "template",

        "Help": "help",

        "Special": "special",

        "Talk": "talk",

        "Category talk": "category talk"

      }

    }

  }

},

"metricsSpec": [

  {

    "type": "count",

    "name": "count"

  },

  {

    "type": "doubleSum",

    "name": "added",

    "fieldName": "added"

  },

  {

    "type": "doubleSum",

    "name": "deleted",

    "fieldName": "deleted"

  },

  {

    "type": "doubleSum",

    "name": "delta",

    "fieldName": "delta"

  }

],

"granularitySpec": {

  "type": "uniform",

  "segmentGranularity": "HOUR",

  "queryGranularity": "NONE"

}

},

“ioConfig”: {

"type": "realtime",

"firehose": {

  "type": "local",

  "baseDir": "/druid-0.7.3/data",
  "filter": "my_wikipedia_data.json"

},

"plumber": {

  "type": "realtime"

}

},

“tuningConfig”: {

"type": "realtime",

"maxRowsInMemory": 500000,

"intermediatePersistPeriod": "PT10m",

"windowPeriod": "PT10m",

"basePersistDirectory": "\/tmp\/realtime\/basePersist",

"rejectionPolicy": {

  "type": "serverTime"

}

}

}]

``

I do not wish to give up at this point. Also, it would be nice if there is a little more straightforward way to get this example working on firewalled machines. I would like to help with that, and will do, but as soon as I get this working.

Hi Nishant, and everyone.

So, I managed to get the Wikipedia example script working. I just had to leech some content from the 4 Wikimedia IRC channels, and then create my own IRC server to serve channel content to Druid. Of course, in the wikipedia_realtime.spec JSON, I had the host point to my IRC server.

Thanks again to all who have responded.

Tim

Hi Tim, glad to hear you have things working. If you have time, it’d be great to have some of this information contributed back to the documentation so others can get around the issue easier.

Hi Fangjin, of course, I’d love to contribute back. I took a look at the Community page, but not quite sure how to contribute to documentation. Could you please let me know the steps?

Thank you!