installing RM Server with FileMaker DB

sgenzersgenzer 12Administrator, Moderator, Employee, RapidMiner Certified Analyst, Community Manager, Member, University Professor, PM Moderator Posts: 2,876  Community Manager
edited November 2018 in Help
Hi...I once again am trying to use a FM database with RM.  This time with RM Server.  I have put the fmjdbc.jar driver in the folder with the rest of the drivers but cannot get it to be recognized during the installation process.  I have this working very well in RM Studio so I see no reason why it should not be able to be done in RM Server.  The url in RM Studio is jdbc:filemaker://127.0.0.1/Test FM DB:2399// and it tests out fine.

Help?

Thanks.

Scott
Tagged:

Answers

  • Marco_BoeckMarco_Boeck Team Lead Software Engineering Administrator, Moderator, Employee, Member, University Professor Posts: 1,908   RM Engineering
    Hi,

    Edit: FileMaker DB will not work at all.

    officially supported as installation DBs are only the ones available within the installer. You can of course install it somewhere else at your own risk.
    However, each database has its own template we use to set it up. Thus for non-standard DBs there is no such template. What you have to do is the following:

    1. Install Server with the wrong database like a MySQL one. It does not even need to have a working connection during installation.
    2. Go to SERVER/standalone/configuration folder and edit the standalone.xml.
    3. Find the block below which should look quite similar to yours

    <subsystem xmlns="urn:jboss:domain:datasources:1.1">
               <datasources>
                   <datasource jta="true" jndi-name="java:/jdbc/RapidAnalyticsDS" pool-name="RapidAnalyticsDS" enabled="true" use-java-context="false" use-ccm="true">
                       <connection-url>jdbc:mysql://localhost:3306/ra_21</connection-url>
                       <driver>mysql-connector-java-5.1.31.jar</driver>
                       <pool>
                           <min-pool-size>0</min-pool-size>
                           <max-pool-size>20</max-pool-size>
                           <prefill>true</prefill>
                           <use-strict-min>false</use-strict-min>
                           <flush-strategy>FailingConnectionOnly</flush-strategy>
                       </pool>
                       <security>
                           <user-name>username</user-name>
                           <password>password</password>
                       </security>
                       <validation>
                           <validate-on-match>true</validate-on-match>
                           <background-validation>false</background-validation>
                       </validation>
                       <statement>
                           <prepared-statement-cache-size>0</prepared-statement-cache-size>
                           <share-prepared-statements>false</share-prepared-statements>
                       </statement>
                   </datasource>
                   <drivers>
                       <driver name="mysql-connector-java-5.1.31.jar" module="com/mysql">
                           <driver-class>com.mysql.jdbc.Driver</driver-class>
                           <xa-datasource-class>com.mysql.jdbc.Driver</xa-datasource-class>
                       </driver>
                   </drivers>
               </datasources>
           </subsystem>
    4. Change the  JDBC <connection-url> to match the one for your database.
    5. Change the JDBC <driver> to the one you use. Note that this value has to match the driver name in the <driver> element below.
    6. Change the JDBC driver name of the <driver> element in the <drivers> subsection to match the one you entered one step above.
    7. The module tag right next to it identifies a folder structure in the modules subfolder of the Server. You can either use the one created for MySQL or enter a custom folder. Note how com/mysql refers to SERVER/modules/system/layers/base/com/mysql/main. A value of "my/driver" would refer to SERVER/modules/system/layers/base/my/driver/main.
    8. Change the <driver-class> element to match the driver class in your JDBC driver. Same as the one you see in Studio when managing JDBC drivers.
    9. Add the driver.jar and the module.xml adapted to your driver jar to the folder.
    10. You can now start the server and if the database acts according to JDBC specifications, it should work. Again, we cannot give support for installations on custom JDBC databases. They might fail in certain cases because they don't act according to specification.

    Regards,
    Marco
  • sgenzersgenzer 12Administrator, Moderator, Employee, RapidMiner Certified Analyst, Community Manager, Member, University Professor, PM Moderator Posts: 2,876  Community Manager
    Hi Marco -

    THANK YOU for this.  I have battled with this for a while and cannot get it to work.  Can you at least tell me if these errors are due to a lack of compatibility or something I am doing wrong?  Here's are the errors when I run standalone.sh:

    ----------------
    17:56:38,139 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.serverManagement.controller.management.http: org.jboss.msc.service.StartException in service jboss.serverManagement.controller.management.http: java.io.IOException: Unable to load resource handler
    at org.jboss.as.server.mgmt.HttpManagementService.start(HttpManagementService.java:226) [jboss-as-server-7.2.0.Alpha1-redhat-4.jar:7.2.0.Alpha1-redhat-4]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA.jar:1.0.4.GA]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA.jar:1.0.4.GA]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_75]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_75]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_75]
    Caused by: java.io.IOException: Unable to load resource handler
    at org.jboss.as.domain.http.server.ManagementHttpServer.create(ManagementHttpServer.java:212) [jboss-as-domain-http-interface-7.2.0.Alpha1-redhat-4.jar:7.2.0.Alpha1-redhat-4]
    at org.jboss.as.server.mgmt.HttpManagementService.start(HttpManagementService.java:190) [jboss-as-server-7.2.0.Alpha1-redhat-4.jar:7.2.0.Alpha1-redhat-4]
    ... 5 more
    Caused by: org.jboss.modules.ModuleNotFoundException: org.jboss.as.domain-http-error-context:main
    at org.jboss.modules.ModuleLoader.loadModule(ModuleLoader.java:224) [jboss-modules.jar:1.2.0.CR1]
    at org.jboss.as.domain.http.server.ResourceHandler.getClassLoader(ResourceHandler.java:327) [jboss-as-domain-http-interface-7.2.0.Alpha1-redhat-4.jar:7.2.0.Alpha1-redhat-4]
    at org.jboss.as.domain.http.server.ErrorHandler.<init>(ErrorHandler.java:54) [jboss-as-domain-http-interface-7.2.0.Alpha1-redhat-4.jar:7.2.0.Alpha1-redhat-4]
    at org.jboss.as.domain.http.server.ManagementHttpServer.create(ManagementHttpServer.java:210) [jboss-as-domain-http-interface-7.2.0.Alpha1-redhat-4.jar:7.2.0.Alpha1-redhat-4]
    ... 6 more
    ----------------

    and

    ----------------
    17:56:56,811 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 57) MSC00001: Failed to start service jboss.persistenceunit."rapidminer-server-2.3.1.ear/rapidminer-server-ejb.jar#RapidRepositoryEntity": org.jboss.msc.service.StartException in service jboss.persistenceunit."rapidminer-server-2.3.1.ear/rapidminer-server-ejb.jar#RapidRepositoryEntity": javax.persistence.PersistenceException: [PersistenceUnit: RapidRepositoryEntity] Unable to build EntityManagerFactory
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:103)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_75]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_75]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_75]
    at org.jboss.threads.JBossThread.run(JBossThread.java:122)
    Caused by: javax.persistence.PersistenceException: [PersistenceUnit: RapidRepositoryEntity] Unable to build EntityManagerFactory
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:930)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:904)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:92)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.createContainerEntityManagerFactory(PersistenceUnitServiceImpl.java:200)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.access$600(PersistenceUnitServiceImpl.java:57)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:99)
    ... 4 more
    Caused by: org.hibernate.HibernateException: Unable to determine Dialect to use [name=FileMaker, majorVersion=12]; user must register resolver or explicitly set 'hibernate.dialect'
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:105)
    at org.hibernate.service.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:67)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:146)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:78)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748)
    at org.hibernate.ejb.EntityManagerFactoryImpl.<init>(EntityManagerFactoryImpl.java:94)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:920)
    ... 9 more
    ----------------

    and

    -----------------

    17:56:57,178 ERROR [org.jboss.as] (Controller Boot Thread) JBAS015875: JBoss AS 7.2.0.Alpha1-redhat-4 "Janus" started (with errors) in 23273ms - Started 566 of 694 services (39 services failed or missing dependencies, 88 services are passive or on-demand)

    And here's what I see at the URL:

    https://drive.google.com/file/d/0B0-I7wWw0DZnOVNST3owWk9tZzg/view?usp=sharing

    Last thoughts before I move everything to MySQL?  I really think this has to work as it works perfectly with RM Studio!!

    Scott
  • Marco_BoeckMarco_Boeck Team Lead Software Engineering Administrator, Moderator, Employee, Member, University Professor Posts: 1,908   RM Engineering
    Hi,

    there is a difference between RapidMiner Studio and Server.
    Working with a Database in RapidMiner Studio via a JDBC driver basically boils down to SELECTS and INSERTS and UPDATES written more or less by hand (Read/Write/Update Database work like that). In other words, rather simple SQL queries.
    Using it as the Server Database on the other hand now requires it to work with JPA and whatever framework sits on top of that for the Application Server in question (Hibernate in this case). This is required for the object-relational mapping, i.e. storing entire Java class instances to the DB. This does require intimate knowledge of the DB by the framework and it seems Hibernate does not know anything about FileMaker DB. I guess my previous statement was wrong and there is more to it than adhering to SQL specifications.
    I have dug a bit deeper and came up with a list of DBs which should be more or less supported, FileMaker DB does not appear on it: https://developer.jboss.org/wiki/SupportedDatabases2

    Edit: The first error in your list can be safely ignored as it is no real error. The second one says that Hibernate has no clue what to do with the DB. The last one is just a summary of the previous problems.

    Regards,
    Marco
  • sgenzersgenzer 12Administrator, Moderator, Employee, RapidMiner Certified Analyst, Community Manager, Member, University Professor, PM Moderator Posts: 2,876  Community Manager
    Hi Marco -

    OK I got it.  Makes sense.  I didn't realize the extent that RM Server uses the database.

    So I spun up a MySQL database and indeed got up and running no problem.  My goal with all this is to implement Thomas Ott's new trick using D3js visualization with RM via RM Server.  However there are two strange things that happened:

    - I cannot create a remote repository in RM Studio that is recognized by RM Server.  The error message I get is that my RM Studio license ("Personal Edition") cannot communicate with my RM Server license ("Starter Edition").  Huh?  This would seem to imply that if I downgrade my RM Studio, it would work.  That does not make sense to me.

    - So I bailed on importing data from RM Studio and simply added a test file into the RM Server repository directly (the doc file that was exported from the RM Studio process that Thomas shows on his video).  But when I try to use it in RM Server, it tells me that it is, "not a supported type, but is blob".  What is a blob?

    Here's the RM Studio XML:
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <process version="6.3.000">
      <context>
        <input/>
        <output/>
        <macros/>
      </context>
      <operator activated="true" class="process" compatibility="6.3.000" expanded="true" name="Process">
        <process expanded="true">
          <operator activated="true" class="set_macro" compatibility="6.3.000" expanded="true" height="60" name="Set Macro" width="90" x="45" y="30">
            <parameter key="macro" value="attribute"/>
            <parameter key="value" value="TestRITScore"/>
          </operator>
          <operator activated="true" class="retrieve" compatibility="6.3.000" expanded="true" height="60" name="Retrieve AISL MAP" width="90" x="179" y="30">
            <parameter key="repository_entry" value="data/AISL MAP"/>
          </operator>
          <operator activated="true" class="text:data_to_json" compatibility="6.1.000" expanded="true" height="76" name="Data To JSON" width="90" x="179" y="120">
            <parameter key="generate_array" value="true"/>
          </operator>
          <operator activated="true" class="text:documents_to_data" compatibility="6.1.000" expanded="true" height="76" name="Documents to Data" width="90" x="45" y="210">
            <parameter key="text_attribute" value="text"/>
            <parameter key="add_meta_information" value="false"/>
          </operator>
          <operator activated="true" class="extract_macro" compatibility="6.3.000" expanded="true" height="60" name="Extract Macro" width="90" x="179" y="210">
            <parameter key="macro" value="jsonData"/>
            <parameter key="macro_type" value="data_value"/>
            <parameter key="attribute_name" value="text"/>
            <parameter key="example_index" value="1"/>
            <list key="additional_macros"/>
          </operator>
          <operator activated="true" class="text:create_document" compatibility="6.1.000" expanded="true" height="60" name="Create Document" width="90" x="179" y="300">
            <parameter key="text" value="&lt;!DOCTYPE html&gt;&#10;&lt;html&gt;&#10;&lt;head&gt;&#10;&lt;div class=“chart”&gt;&lt;/div&gt;&#10;&lt;script src=“http://d3js.org/d3.v3.min.js”&#9;charset=“utf-8”&gt;&lt;/script&gt;&#10;&#10;&lt;style&gt;&#10;.chart div {&#10;font: &#9;&#9;&#9;10px sans-serif;&#10;background-color:&#9;steelblue;&#10;text-align:&#9;&#9;right;&#10;padding:&#9;&#9;3px&#10;margin:&#9;&#9;1px&#10;color: white;&#10;}&#10;&lt;/style&gt;&#10;&lt;/head&gt;&#10;&#10;&lt;body&gt;&#10;&lt;script&gt;&#10;&#10;var data = %{jsonData};&#10;&#10;var x = d3.scale.linear()&#10;.domain([0, d3.max(data)])&#10;.range([0, 420]);&#10;&#10;d3.select(“.chart”)&#10;.selectAll(“div”)&#10;.data(data)&#10;.enter()&#10;.append(“div”)&#10;.style(“width”, function(d) { return d.%{attribute} * 10 + “px”; })&#10;.text(function(d) { return d.%{attribute}; });&#10;&#10;&lt;/script&gt;&#10;&lt;/body&gt;&#10;&lt;/html&gt;&#10;"/>
          </operator>
          <operator activated="true" class="text:write_document" compatibility="6.1.000" expanded="true" height="76" name="Write Document" width="90" x="313" y="300">
            <parameter key="file" value="/Users/gcmobile/Desktop/stuff to put back on Fougamou/test2.*"/>
          </operator>
          <connect from_op="Retrieve AISL MAP" from_port="output" to_op="Data To JSON" to_port="example set 1"/>
          <connect from_op="Data To JSON" from_port="documents" to_op="Documents to Data" to_port="documents 1"/>
          <connect from_op="Documents to Data" from_port="example set" to_op="Extract Macro" to_port="example set"/>
          <connect from_op="Extract Macro" from_port="example set" to_port="result 1"/>
          <connect from_op="Create Document" from_port="output" to_op="Write Document" to_port="document"/>
          <connect from_op="Write Document" from_port="document" to_port="result 2"/>
          <portSpacing port="source_input 1" spacing="0"/>
          <portSpacing port="sink_result 1" spacing="0"/>
          <portSpacing port="sink_result 2" spacing="0"/>
          <portSpacing port="sink_result 3" spacing="0"/>
        </process>
      </operator>
    </process>
    Thoughts?

    Scott
  • Marco_BoeckMarco_Boeck Team Lead Software Engineering Administrator, Moderator, Employee, Member, University Professor Posts: 1,908   RM Engineering
    Hi,

    1) That is quite annoying indeed, so we are dropping that with the next patch. Then every Studio license will be able to communicate with every Server license. At the moment, Server and Studio licenses need to be equal (or one of them a Trial).

    2) A blob is a Binary Large Object. In other words, the fallback if the actual type is unknown. Uploading files via the web UI will always produce blobs because when transferring files via Studio to the Server, additional information is passed which determines the type and some other information about the data. So to upload some sort of RapidMiner data, you need to do so via Studio.

    Regards,
    Marco

  • sgenzersgenzer 12Administrator, Moderator, Employee, RapidMiner Certified Analyst, Community Manager, Member, University Professor, PM Moderator Posts: 2,876  Community Manager
    aha got it.  Thanks for the explanation and the hope for a patch to this server-studio issue.  Meanwhile I am trying to get a temporary RM Server trial license to match my Studio license to at least test this.  There does not seem to be a way to automatically get trial licenses so I put in a request on rapidminer.com

    Thanks again Marco.

    Scott



Sign In or Register to comment.