{"id":15976,"date":"2023-11-21T12:09:48","date_gmt":"2023-11-21T06:39:48","guid":{"rendered":"https:\/\/opstree.com\/blog\/\/?p=15976"},"modified":"2023-11-21T12:09:48","modified_gmt":"2023-11-21T06:39:48","slug":"nifi-cluster-setup-with-external-zookeeper","status":"publish","type":"post","link":"https:\/\/opstree.com\/blog\/2023\/11\/21\/nifi-cluster-setup-with-external-zookeeper\/","title":{"rendered":"Nifi Cluster Setup with External Zookeeper"},"content":{"rendered":"\n<p class=\"has-text-align-justify\" style=\"font-size:15px\"><strong>Apache NiFi<\/strong> is an open-source data integration and automation tool that enables the automation of data flow between different systems. NiFi provides a user-friendly interface to design, control, and manage the flow of data between various sources and destinations. The tool is particularly useful in handling data from different sources, applying transformations, and routing it to different systems in real-time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading has-medium-font-size\"><strong>Why use the <\/strong>Nifi cluster over the <strong>standalone?<\/strong><\/h2>\n\n\n\n<ul>\n<li style=\"font-size:16px\"><strong>Performance:<\/strong> Clusters can handle higher throughput and provide better performance than standalone instances due to load distribution.<\/li>\n\n\n\n<li style=\"font-size:16px\"><strong>Fault Tolerance:<\/strong> Clusters provide high availability and fault tolerance such as if one node fails, the other nodes take over the processing.<\/li>\n\n\n\n<li style=\"font-size:16px\"><strong>Scalability:<\/strong> Clusters allow for scalability by adding more nodes, whereas standalone instances have limitations in scaling.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"612\" height=\"530\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2023\/10\/image-25.png?w=612\" alt=\"\" class=\"wp-image-16129\" style=\"width:333px;height:auto\" \/><\/figure>\n\n\n\n<p><br><\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-text-align-justify\">Recently while trying to set up Apache Nifi in cluster mode, I faced the challenge of finding proper documentation or any article describing how to do that exactly. In addition configuring the right cluster configurations was not an easy task. In this article, we will set up a three-node Zookeeper and Nifi cluster on Ubuntu. It&#8217;s important to note that the steps remain the same for other Linux distributions as well.<\/p>\n\n\n\n<p>Enough said! Now let me show you how we can do it end to end.<\/p>\n\n\n\n<h1 class=\"wp-block-heading has-medium-font-size\"><strong>Setting up Apache Nifi Cluster with external Zookeeper<\/strong><\/h1>\n\n\n\n<p class=\"has-text-align-justify\"><strong>ZooKeeper<\/strong> is a centralized service used for maintaining configuration information, naming, providing distributed synchronization, and providing group services within distributed systems. ZooKeeper is designed to be durable and secure. With multiple nodes, there&#8217;s added protection against data loss, corruption, and security breaches.<\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Three Node Zookeeper Cluster Setup<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\"><strong>Prerequisites<\/strong><\/p>\n\n\n\n<p style=\"font-size:16px\">Before you begin this installation, you will need the following:<\/p>\n\n\n\n<ul>\n<li style=\"font-size:16px\">Three Ubuntu 20.04 servers with a non-root user having sudo privileges.<\/li>\n\n\n\n<li style=\"font-size:16px\">OpenJDK 8 or 17 installed on all servers as Zookeeper requires Java to run.<\/li>\n<\/ul>\n\n\n\n<p style=\"font-size:16px\"><strong>Step 1<\/strong> &#8211; Downloading and Extracting Zookeeper Binaries.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code><mark style=\"background-color:#e5e5e5\" class=\"has-inline-color has-dark-gray-color\">wget <a href=\"http:\/\/archive.apache.org\/dist\/zookeeper\/zookeeper-3.8.0\/apache-zookeeper-3.8.0-bin.tar.gz\" target=\"_blank\" rel=\"noopener\">http:\/\/archive.apache.org\/dist\/zookeeper\/zookeeper-3.8.0\/apache-zookeeper-3.8.0-bin.tar.gz<\/a> &amp;&amp; tar -xvzf apache-zookeeper-3.8.0-bin.tar.gz \/opt\/<\/mark><\/code><\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/opt &amp;&amp; mv <span style=\"font-size: inherit\">apache-zookeeper-3.8.0-bin zookeeper<\/span><\/code><\/pre>\n\n\n\n<p><strong>Step 2<\/strong> &#8211; Creating zoo.cfg file in \/opt\/zookeeper\/conf with configurations below<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:16px;letter-spacing:0px\"><code>\ncat &lt;&lt;EOT &gt;&gt; \/opt\/conf\/zookeeper\/conf\/zoo.cfg\ndataDir=\/var\/lib\/zookeeper\nclientPort=2181\ninitLimit=5\nsyncLimit=5\nserver.1=&lt;hostname&gt;:2888:3888\nserver.2=&lt;hostname&gt;:2888:3888\nserver.3=&lt;hostname&gt;:2888:3888\nEOT\n<\/code><\/pre>\n\n\n\n<p><strong>Step 3<\/strong> &#8211; Create a zookeeper directory in the lib folder. That will be the zookeeper&#8217;s data directory as mentioned in zoo.cfg file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo mkdir \/var\/lib\/zookeeper<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo touch \/var\/lib\/zookeeper\/myid<\/code><\/pre>\n\n\n\n<p><strong>Server 1<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo sh -c \"echo '1' &gt; \/var\/lib\/zookeeper\/myid\"<\/code><\/pre>\n\n\n\n<p><strong>Server 2<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo sh -c \"echo '2' &gt; \/var\/lib\/zookeeper\/myid\"<\/code><\/pre>\n\n\n\n<p><strong>Server 3<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo sh -c \"echo '3' &gt; \/var\/lib\/zookeeper\/myid\"<\/code><\/pre>\n\n\n\n<p><strong>Step 4<\/strong> &#8211; Restart the zookeeper on all nodes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo \/opt\/zookeeper\/bin\/zkServer.sh&nbsp; restart<\/code><\/pre>\n\n\n\n<p>After following the steps above if you check the status of the zookeeper on each node, you will one server elected as leader and the other two as followers.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"73\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2023\/11\/image-28.png\" alt=\"\" class=\"wp-image-16457\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Three Node Nifi Cluster Setup<\/strong><\/p>\n\n\n\n<p style=\"font-size:18px\"><strong>Prerequisites<\/strong><\/p>\n\n\n\n<p>Before you begin this installation, you will need the following:<\/p>\n\n\n\n<ul>\n<li>Three Ubuntu 20.04 servers with a non-root user having sudo privileges.<\/li>\n\n\n\n<li>OpenJDK 8 or 17 installed on all servers as Zookeeper requires Java to run.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-justify\">In the next steps, we are going to set up nifi-1.19.1 three-node cluster. But with this version of nifi we can not form a\u00a0 nifi cluster directly as it requires\u00a0 <strong>Nifi.sensitive.props.key. <\/strong>And to get a value for this key we need to start nifi as standalone on each node first.<\/p>\n\n\n\n<p style=\"font-size:16px\"><strong>Step 1 &#8211; <\/strong>Downloading and Extracting Nifi Binaries<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wget <a href=\"https:\/\/archive.apache.org\/dist\/nifi\/1.19.1\/nifi-1.19.1-bin.zip\" target=\"_blank\" rel=\"noopener\">https:\/\/archive.apache.org\/dist\/nifi\/1.19.1\/nifi-1.19.1-bin.zip<\/a> &amp;&amp; unzip nifi-1.19.1-bin.zip \/opt\/<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-dark-gray-color\">cd \/opt &amp;&amp; mv nifi-1.19.1 nifi<\/mark><\/code><\/pre>\n\n\n\n<p style=\"font-size:16px\"><strong> Step 2 &#8211; <\/strong>Downloading and Extracting Nifi toolkit Binaries<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wget <a href=\"https:\/\/archive.apache.org\/dist\/nifi\/1.19.1\/nifi-toolkit-1.19.1-bin.zip\" target=\"_blank\" rel=\"noopener\">https:\/\/archive.apache.org\/dist\/nifi\/1.19.1\/nifi-toolkit-1.19.1-bin.zip<\/a> &amp;&amp; unzip nifi-toolkit-1.19.1-bin.zip \/opt\/<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/opt &amp;&amp; mv nifi-toolkit-1.19.1 nifi-toolkit<\/code><\/pre>\n\n\n\n<p style=\"font-size:16px\"><strong>Step 3<\/strong> &#8211; Update nifi.properties file to start nifi on each node. Below are the properties that should be updated for that.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nnifi.remote.input.host=&lt;hostname&gt;\nnifi.remote.input.socket.port=9997\nnifi.web.http.host=&lt;hostname&gt;\nnifi.web.http.port=8443\n<\/code><\/pre>\n\n\n\n<p class=\"has-texturina-font-family\" style=\"font-size:18px\"><strong>Step 4 &#8211; <\/strong>Restart Nifi on all nodes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/nifi\/bin\/nifi.sh restart<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:16px\"><code>\/opt\/nifi\/bin\/nifi.sh status<\/code><\/pre>\n\n\n\n<p>Nifi should be running on each node and we can access it on <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#047;&#047;&lt;hostname&gt;:8443\/nifi<\/code><\/pre>\n\n\n\n<p class=\"has-text-align-justify\"><strong>Note:<\/strong>  Restarting nifi as standalone will generate a different value for <strong>nifi.sensitive.props.key<\/strong> in the nifi.properties file on each node. If the keys differ across nodes, sensitive information encrypted on one node with one key won&#8217;t be decryptable on another node with a different key,  also there could be issues with data integrity and consistency, leading to problems in data processing or transfer. Hence it is important to copy the value of <strong>nifi.sensitive.props.key<\/strong> from one node to the other two nodes.<\/p>\n\n\n\n<p><strong>Step 5<\/strong> &#8211; Now that Nifi is running as a standalone on each node it\u2019s time to form a three-node nifi cluster and for that configuration below should be updated in \/opt\/nifi\/nifi.properties.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"font-size:16px\"><code>\nnifi.cluster.is.node=true\nnifi.cluster.node.address=&lt;hostname&gt;\nnifi.cluster.node.protocol.port=9998\nnifi.zookeeper.connect.string=&lt;zookeeperhostname&gt;:2181\nnifi.state.management.embedded.zookeeper.start=false\n<\/code><\/pre>\n\n\n\n<p><strong>Step 6 &#8211;<\/strong> Apart from updating the zookeeper connect string in the nifi.properties file, we need to update the zookeeper hostname in the cluster provider section of \/opt\/nifi\/conf\/state-management.xml file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;property name=\"Connect String\"&gt;zookeeperhostname:2181&lt;\/property&gt;<\/code><\/pre>\n\n\n\n<p><strong>Step 7 &#8211;<\/strong> After updating files in the above steps, we need to restart nifi on each node again to form a cluster of nifi nodes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/nifi\/bin\/nifi.sh restart<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/nifi\/bin\/nifi.sh status<\/code><\/pre>\n\n\n\n<p style=\"font-size:15px\">Now  we should see a cluster being formed if we access nifi on <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#047;&#047;&lt;hostname&gt;:8443\/nifi<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"77\" src=\"https:\/\/opstree.com\/blog\/\/wp-content\/uploads\/2023\/11\/screenshot-2023-11-21-101722.png?w=800\" alt=\"\" class=\"wp-image-16432\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Conclusion<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-justify\">So in this blog, I have covered the requirements and steps to set up the Nifi cluster with an external zookeeper. In the next blog, I will explain how we can secure nifi cluster with self-signed certificates. If you guys have any ideas or suggestions about my approach, please comment in the comment section. I would really appreciate your suggestions and feedback. Thanks for reading. <\/p>\n\n\n\n<p><strong>Blog Pundits: <strong><a href=\"https:\/\/opstree.com\/blog\/\/author\/pankajkumar1301\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Pankaj Kumar<\/strong><\/a><\/strong> and <a rel=\"noreferrer noopener\" href=\"https:\/\/opstree.com\/blog\/\/author\/sandeep7c51ad81ba\/\" target=\"_blank\">Sandeep Rawat<\/a><\/strong><\/p>\n\n\n\n<p><strong>OpsTree is an End-to-End <a href=\"https:\/\/opstree.com\/services\/\" target=\"_blank\" rel=\"noreferrer noopener\">DevOps Solution<\/a> Provider.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/opstree.com\/contact-us\/?utm_source=WordPress&amp;utm_medium=Blog&amp;utm_campaign=Nifi+Cluster+Setup+with+External+Zookeeper\" target=\"_blank\" rel=\"noreferrer noopener\">Contact Us<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"has-text-align-center\"><strong>Connect with Us<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-social-links aligncenter is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-1 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-linkedin  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/www.linkedin.com\/company\/opstree-solutions\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">LinkedIn<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-youtube  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/www.youtube.com\/channel\/UCeLma6SpNYH7jjYKSBNSexw\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">YouTube<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/github.com\/OpsTree\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-facebook  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/www.facebook.com\/opstree\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Facebook<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-medium  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/medium.com\/buildpiper\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M20.962,7.257l-5.457,8.867l-3.923-6.375l3.126-5.08c0.112-0.182,0.319-0.286,0.527-0.286c0.05,0,0.1,0.008,0.149,0.02 c0.039,0.01,0.078,0.023,0.114,0.041l5.43,2.715l0.006,0.003c0.004,0.002,0.007,0.006,0.011,0.008 C20.971,7.191,20.98,7.227,20.962,7.257z M9.86,8.592v5.783l5.14,2.57L9.86,8.592z M15.772,17.331l4.231,2.115 C20.554,19.721,21,19.529,21,19.016V8.835L15.772,17.331z M8.968,7.178L3.665,4.527C3.569,4.479,3.478,4.456,3.395,4.456 C3.163,4.456,3,4.636,3,4.938v11.45c0,0.306,0.224,0.669,0.498,0.806l4.671,2.335c0.12,0.06,0.234,0.088,0.337,0.088 c0.29,0,0.494-0.225,0.494-0.602V7.231C9,7.208,8.988,7.188,8.968,7.178z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Medium<\/span><\/a><\/li>\n\n<li class=\"wp-social-link wp-social-link-twitter  wp-block-social-link\"><a rel=\"noopener nofollow\" target=\"_blank\" href=\"https:\/\/twitter.com\/opstreedevops\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M22.23,5.924c-0.736,0.326-1.527,0.547-2.357,0.646c0.847-0.508,1.498-1.312,1.804-2.27 c-0.793,0.47-1.671,0.812-2.606,0.996C18.324,4.498,17.257,4,16.077,4c-2.266,0-4.103,1.837-4.103,4.103 c0,0.322,0.036,0.635,0.106,0.935C8.67,8.867,5.647,7.234,3.623,4.751C3.27,5.357,3.067,6.062,3.067,6.814 c0,1.424,0.724,2.679,1.825,3.415c-0.673-0.021-1.305-0.206-1.859-0.513c0,0.017,0,0.034,0,0.052c0,1.988,1.414,3.647,3.292,4.023 c-0.344,0.094-0.707,0.144-1.081,0.144c-0.264,0-0.521-0.026-0.772-0.074c0.522,1.63,2.038,2.816,3.833,2.85 c-1.404,1.1-3.174,1.756-5.096,1.756c-0.331,0-0.658-0.019-0.979-0.057c1.816,1.164,3.973,1.843,6.29,1.843 c7.547,0,11.675-6.252,11.675-11.675c0-0.178-0.004-0.355-0.012-0.531C20.985,7.47,21.68,6.747,22.23,5.924z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">Twitter<\/span><\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Apache NiFi is an open-source data integration and automation tool that enables the automation of data flow between different systems. NiFi provides a user-friendly interface to design, control, and manage the flow of data between various sources and destinations. The tool is particularly useful in handling data from different sources, applying transformations, and routing it &hellip; <a href=\"https:\/\/opstree.com\/blog\/2023\/11\/21\/nifi-cluster-setup-with-external-zookeeper\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Nifi Cluster Setup with External Zookeeper&#8221;<\/span><\/a><\/p>\n","protected":false},"author":217204634,"featured_media":29900,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[28070474],"tags":[319067111,44070,768739308,676319247,4996032,425781],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/opstree.com\/blog\/wp-content\/uploads\/2025\/11\/DevSecOps-1.jpg","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfDBOm-49G","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/15976"}],"collection":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/users\/217204634"}],"replies":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/comments?post=15976"}],"version-history":[{"count":26,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/15976\/revisions"}],"predecessor-version":[{"id":17460,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/posts\/15976\/revisions\/17460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media\/29900"}],"wp:attachment":[{"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/media?parent=15976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/categories?post=15976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/opstree.com\/blog\/wp-json\/wp\/v2\/tags?post=15976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}