<!--
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License. See accompanying LICENSE file.
-->
{{ partial "header.html" . }}
<div class="main-section">

</div>

<div class="whatis">
    <div class="container">
        <div class="row header">
            <p class="lead">
                Ozone is a scalable, redundant, and distributed object store for Hadoop. Apart from scaling to billions of objects of varying sizes, Ozone can function effectively in containerized environments such as Kubernetes and YARN. </p> <p class="lead">Applications using frameworks like Apache Spark, YARN and Hive work natively without any modifications.</p>
            <p class="lead">Ozone is built on a highly available, replicated block storage layer called Hadoop Distributed Data Store (HDDS).
            </p>
            </p>
            <p></p>
            <p class="lead">Ozone is now Generally Available(GA) with <a href="release/1.1.0/">1.1.0</a> release.
            </p>
            <p></p>
        </div>
    </div>
</div>


<div class="main-section feature-list-group" style="padding: 80px;">
    <div class="container">
        <div class="row feature-list">
            <div class="col-md-4 col-sm-4 feature-item">

                <h4><span class="glyphicon glyphicon-signal" aria-hidden="true"></span> Scalable</h4>
                <p>
                 Ozone is designed to scale to tens of billions of files and
                 blocks and, in the future, even more.
                </p>
      
                <p></p>
            </div>
            <div class="col-md-4 col-sm-4 feature-item">
                <h4><span class="glyphicon glyphicon-link" aria-hidden="true"></span>
                   Consistent</h4>
                <p>
                    Ozone is a strongly consistent object store. This consistency is achieved by using protocols like RAFT.
                </p>
            </div>
            <div class="col-md-4 col-sm-4 feature-item">
                <h4><span class="glyphicon glyphicon-cloud" aria-hidden="true"></span>Cloud-native</h4>
                <p>Ozone is designed to work well in containerized environments like YARN and Kubernetes.
                </p>
            </div>

                 <div class="col-md-4 col-sm-4 feature-item">
                <h4><span class="glyphicon glyphicon-tower" aria-hidden="true"></span>Secure</h4>
                <p>Ozone integrates with kerberos infrastructure for access control and supports TDE and on-wire encryption.
                </p>
            </div>

 <div class="col-md-4 col-sm-4 feature-item">
                <h4><span class="glyphicon glyphicon-asterisk
" aria-hidden="true"></span>Multi-Protocol Support</h4>
                <p>Ozone supports different protocols like S3 
                and Hadoop File System APIs.

                </p>
            </div>


 <div class="col-md-4 col-sm-4 feature-item">
                <h4><span class="glyphicon glyphicon-random
" aria-hidden="true"></span>Highly Available</h4>
                <p>Ozone is a fully replicated system that is designed to survive multiple failures.
                </p>
            </div>

        </div><!-- /.feature-list -->


    </div><!-- /.container -->
</div><!-- /.feature-list-group -->


<!-- <a name="qa"></a>
<div class="main-section">
    <div class="container">
        <div class="row header">
        {{range where .Site.Pages "Title" "Questions and Answers"}}
        <h2>{{ .Title }}</h2>
{{ .Content }}
        {{end}}
        </div>
    </div>
</div> -->
{{ partial "footer.html" . }}
