如何在cassandra的docker示例中启用用户定义的函数?

xurqigkl  于 2022-11-02  发布在  Docker
关注(0)|答案(3)|浏览(115)

当我尝试在cassandra中创建一个简单的减法函数时,出现以下错误:

user defined functions are disabled in cassandra.yaml set enable user defined functions=true

我不知道如何将它设置为true。我该去哪里做这个呢?我正在运行一个cassandra的docker示例,这使得它变得更加困难。

slsn1g29

slsn1g291#

在您的docker-compose.yaml文件中,在您的环境下添加以下内容:

environment:
    - CASSANDRA_ENABLE_USER_DEFINED_FUNCTIONS=true

然后,修改docker-entrypoint.sh(可以从here中获取),并添加enable_user_defined_functions

for yaml in \
        broadcast_address \
        broadcast_rpc_address \
        cluster_name \
        endpoint_snitch \
        listen_address \
        num_tokens \
        rpc_address \
        start_rpc \
        enable_user_defined_functions \

此外,您还需要docker-entrypoint.sh使用修改后的版本覆盖www.example.com:

volumes:
- ./db/Cassandra/docker-entrypoint.sh:/usr/local/bin/docker-entrypoint.sh
gdrx4gfi

gdrx4gfi2#

你需要修改你的Dockerfile中的cassandra.yaml文件。你可以创建一个单独的图层作为你原来的Cassandra图片的扩展(更多信息在这里)。
假设您使用的是Cassandra 3,并且是从软件包安装中安装的,则其位置为:

/etc/cassandra/cassandra.yaml

不同安装选项(tarball等)的其他可能位置记录在here中。如果您正在运行this Docker映像,您可能会在 /etc/cassandra 中找到它。
找到安装路径后,可以使用sed来修改文件,然后使用Docker的RUN命令运行该文件:

RUN sed -i -r 's/enable_user_defined_functions=false/enable_user_defined_functions=true/' /etc/cassandra/cassandra.yaml

然后重新启动节点。

laawzig2

laawzig23#

根据@Edmon的回答和相关的@Ravi的评论,我在我的示例“cassandra 3.11”docker示例中启用了用户定义的函数,并成功运行测试。我将这个答案作为一个应用示例发布,就像迷你教程一样。

重现步骤

先决条件

  • 在一个新的项目文件夹中,应该有这2个文件:和第一个
  • 安装了Docker后,我使用的是Docker Desktop 4.12.0

1.“docker-compose.yml”文件内容


# docker-compose.yml

   version: '3'
   services:
     n1:
      build: .
      image: cassandra:3.11
      networks:
        - cluster
   networks:
   cluster:

2.“Dockerfile”文件内容


# Dockerfile

   FROM cassandra:3.11
   # override default disabled user defined functions
   RUN sed -i -r 's/enable_user_defined_functions: false/enable_user_defined_functions: true/' /etc/cassandra/cassandra.yaml

3.重建映像,然后重新创建相应服务的容器,并基于提供的Dockerfile + docker-compose.yml文件在后台运行。

~ docker-compose up --build -d

4.检查是否已启用用户定义的功能,默认值为false

~ docker-compose exec -it n1 egrep "enable_user_defined_functions" /etc/cassandra/cassandra.yaml

   enable_user_defined_functions: true
   # Java UDFs are always enabled, if enable_user_defined_functions is true.
   # This option has no effect, if enable_user_defined_functions is false.

5.连接到cassandra节点并与cassandra交互
cqlsh是使用CQL(Cassandra查询语言)与Cassandra交互的命令行界面

docker-compose exec n1 cqlsh

   Connected to Test Cluster at 127.0.0.1:9042.
   [cqlsh 5.0.1 | Cassandra 3.11.14 | CQL spec 3.4.4 | Native protocol v4]
   Use HELP for help.
   cqlsh>

6.现在我们进入cassandra cli。我们将创建一个键空间和一个表,在这个键空间中填充测试数据

// create keyspace
   create keyspace foo 
   WITH replication = {
   'class': 'SimpleStrategy', 
   'replication_factor': 1};

   // use keyspace
   use foo;

   // create table data for our udf demo
   CREATE TABLE IF NOT EXISTS UDF_FUNCTION_TEST_DATA 
       (
       id int,
       num1 int,
       num2 int,
       PRIMARY KEY(id)
       );

   // insert table rows for our udf demo
   INSERT INTO 
   UDF_FUNCTION_TEST_DATA(id, num1, num2) 
   VALUES(1, 400, 600);

   INSERT INTO 
   UDF_FUNCTION_TEST_DATA(id, num1, num2) 
   VALUES(2, 500, 400);

   INSERT INTO 
   UDF_FUNCTION_TEST_DATA(id, num2) 
   VALUES(3, 900);

   INSERT INTO 
   UDF_FUNCTION_TEST_DATA(id, num1) 
   VALUES(4, 500);

   // overview our table
   SELECT * 
   FROM UDF_FUNCTION_TEST_DATA
   WHERE id IN(1, 2, 3, 4);

    id | num1 | num2
   ----+------+------
     1 |  400 |  600
     2 |  500 |  400
     3 | null |  900
     4 |  500 | null

7.现在仍然停留在cassandra cli,我们将使用java创建一个用户定义的函数,它返回2个给定数字中的最大值。如果发现任何null,则返回null

// our user defined function "MAX_VALUE"
   CREATE OR REPLACE FUNCTION MAX_VALUE (num1 int, num2 int)
       RETURNS NULL ON NULL INPUT
       RETURNS int
       LANGUAGE java
       AS $$ 
       return Math.max(num1, num2); 
       $$;

   // overview our table 
   // appending results 
   with max number from our udf function
   SELECT 
   id, num1, num2, MAX_VALUE(num1, num2) 
   FROM UDF_FUNCTION_TEST_DATA
   WHERE id IN(1, 2, 3, 4);

    id | num1 | num2 | foo.max_value(num1, num2)
   ----+------+------+---------------------------
     1 |  400 |  600 |                       600
     2 |  500 |  400 |                       500
     3 | null |  900 |                      null
     4 |  500 | null |                      null

     // now that we tested udf successfully,
     // we can exit cqlsh
     exit

8.停止并删除容器、网络

~ docker-compose down

相关问题