<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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.
-->
<head>
    <title>Apache Griffin</title>
    <meta name="keywords" content="Apache Griffin, Hadoop, Analyze, Data Quality, Quality, Real Time">
    <meta name="description" content="Apache Griffin - Big Data Quality Solution For Batch and Streaming">
    <meta name="author" content="Apache Griffin">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <!-- Style Sheets -->
    <link rel="stylesheet" href="css/animate.css">
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link rel="stylesheet" href="css/misc.css">
    <link rel="stylesheet" href="css/style.css">
    <link rel="stylesheet" href="css/styles.css">
    <link rel="stylesheet" href="css/colorbox.css">
    <link rel="shortcut icon" href="images/favicon.png">


    <!-- Baidu Analytics Tracking-->
    <script>
        var _hmt = _hmt || [];
        (function () {
            var hm = document.createElement("script");
            hm.src = "//hm.baidu.com/hm.js?43d74b26b35e1aa99faf2bc4c340a012";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>

    <!-- Google Analytics Tracking -->
    <script>
        (function (i, s, o, g, r, a, m) {
            i['GoogleAnalyticsObject'] = r;
            i[r] = i[r] || function () {
                (i[r].q = i[r].q || []).push(arguments)
            }, i[r].l = 1 * new Date();
            a = s.createElement(o),
                m = s.getElementsByTagName(o)[0];
            a.async = 1;
            a.src = g;
            m.parentNode.insertBefore(a, m)
        })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');
        ga('create', 'UA-125017142-1', 'auto');
        ga('send', 'pageview');
    </script>
</head>
<body>
<!-- header start -->
<div id="home_page">
    <div class="topbar">
        <div class="container">
            <div class="row">
                <nav class="navbar navbar-default">
                    <div class="container-fluid">
                        <!-- Brand and toggle get grouped for better mobile display -->
                        <div class="navbar-header">
                            <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                                    data-target="#bs-example-navbar-collapse-1"><span
                                    class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span
                                    class="icon-bar"></span> <span class="icon-bar"></span></button>
                            <a class="navbar-brand" href="#"><img src="images/logo.png" height="44px"
                                                                  style="margin-top:-7px"></a></div>

                        <!-- Collect the nav links, forms, and other content for toggling -->
                        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                            <ul class="nav navbar-nav navbar-right" id="top-menu">
                                <li><a class="menu" href="#home_page">HOME</a></li>
                                <li><a class="menu" href="#about_page">ABOUT</a></li>
                                <li><a class="menu" href="#diagram_page">ARCHITECTURE</a></li>
                                <li><a class="menu" href="#community_page">COMMUNITY</a></li>
                                <li><a class="menu" href="docs/quickstart.html">DOCS</a></li>
                            </ul>
                        </div>
                        <!-- /.navbar-collapse -->
                    </div>
                    <!-- /.container-fluid -->
                </nav>
            </div>
        </div>
    </div>
    <div class="headerimage">
        <div >
            <ul class="slides">
                <li><img src="images/slider.jpeg"></li>
            </ul>
        </div>
    </div>
    <!--<div class="particles"></div>-->
    <div class="slider-caption">
        <div class="homewrapper">
            <div class="hometext">
                <h2 style="font-weight:500;">Apache Griffin</h2>
                <h3>Big Data Quality Solution For Batch and Streaming</h3>
            </div>
        </div>

        <div class="download" style="margin-left:10px;" title="Get Started"><a href="docs/quickstart.html">GET STARTED</a></div>
        <div class="download"><a href="docs/contribute.html" title="Contribute">CONTRIBUTE</a></div>
    </div>
</div>

<!-- header end -->

<!-- team start -->


<!-- team start -->
<div class="workwrapper" id="about_page">
    <div class="container">
        <div class="row">
            <h2 class="sectiontile">ABOUT APACHE GRIFFIN</h2>
            <div class="col-md-12">
                <p style="width:80%; margin-left:auto; margin-right:auto;"> Apache Griffin is an open source Data
                    Quality solution for Big Data, which supports both batch and streaming mode. It offers an unified
                    process to measure your data quality from different perspectives, helping you build trusted data
                    assets, therefore boost your confidence for your business. </p>
                <br/>
                <!--<p style="width:80%; margin-left:auto; margin-right:auto;"> Griffin provides a simplified data quality-->
                    <!--management process, which enables you easily define a data quality domain model, and then waiting-->
                    <!--for the data quality metrics visualized in the dashboard. All you need is to focus on what you need,-->
                    <!--leaving the complexity of distributed big data processing to Griffin.</p>-->
                <p style="width:80%; margin-left:auto; margin-right:auto;"> Apache Griffin offers a set of well-defined data
                    quality domain model, which covers most of data quality problems in general. It also define a set of
                    data quality DSL to help users define their quality criteria. By extending the DSL, users are even
                    able to implement their own specific features/functions in Apache Griffin.</p>
                <!--<p style="width:80%; margin-left:auto; margin-right:auto;"> Apache Griffin is also high performance on-->
                    <!--data processing. It has been running on hundreds of data quality metrics in eBay, checking 700+M-->
                    <!--records every day.</p>-->
                <div class="sepline"></div>
                <p>Apache Griffin had been accepted as an Apache Incubator Project on Dec 7, 2016.</P>
                <p>Apache Griffin graduated as an Apache Top Level Project on Nov 21, 2018.</P>
                <div class="sepline"></div>
                <p>Apache Griffin handle data quality issues in 3 steps:</p>
            </div>
        </div>
        <section id="cd-timeline" class="cd-container" style="margin-top:-3px;">
            <div class="cd-timeline-block">
                <div class="cd-timeline-img cd-picture"><img src="images/step1.png" alt="Picture"></div>
                <div class="cd-timeline-content service-box-content">
                    <h3>Step 1 Define Data Quality</h3>
                    <p>Data scientists/analyst define their data quality requirements such as accuracy, completeness, timeliness, profiling, etc.</p>
                </div>
            </div>
            <div class="cd-timeline-block">
                <div class="cd-timeline-img cd-movie"><img src="images/step2.png" alt="Picture"></div>
                <div class="cd-timeline-content service-box-content">
                    <h3>Step 2 Measure Data Quality</h3>
                    <p>Source data will be ingested into Apache Griffin computing cluster and Apache Griffin will kick off data quality measurement based on data quality requirements.</p>
                </div>
            </div>
            <div class="cd-timeline-block">
                <div class="cd-timeline-img cd-icon"><img src="images/step3.png" alt="Picture"></div>
                <div class="cd-timeline-content service-box-content">
                    <h3>Step 3 Metrics</h3>
                    <p>Data quality reports as metrics will be evicted to designated destination.</p>
                </div>
            </div>
            <div class="cd-timeline-block">
                <div class="cd-timeline-img cd-location"><img src="images/step4.png" alt="Picture"></div>
                <div class="cd-timeline-content service-box-content">
                    <h3>Additional Bonus</h3>
                    <p>Apache Griffin provides front tier for user to easily onboard any new data
                        quality requirement into Apache Griffin platform and write comprehensive logic to define their data quality.</p>
                </div>
            </div>
        </section>
    </div>
</div>

<!-- team end -->

<div class="clear"></div>

<!-- diagram start -->

<div class="workwrapper" id="diagram_page">
    <div class="container">
        <div class="row">
            <h2 class="sectiontile">ARCHITECTURE</h2>
            <div class="col-md-12 marginbot"><img src="images/arch.png"
                                                  style="border-radius: 10px; margin-top:10px;"></div>
        </div>
    </div>
</div>
<!-- diagram end -->

<div class="clear"></div>

<div class="clear"></div>
<!-- team start -->
<div class="client_wrapper" id="community_page">
    <div class="container">
        <div class="row">
            <h2 class="sectiontile">WHO USES Apache Griffin</h2>
            <div class="row" style="margin-top:50px;">
                <div class="workmargin">
                    <a class="one" href="http://www.ebay.com/"><img style="width: 160px;margin-left:60px;" src="/images/ebay.png"
                                                        class="usecaseimage"></a>
                    <a class="two" href="http://www.huawei.com/"><img style="width: 160px;margin-left:60px;" src="/images/huawei.png"
                                                        class="usecaseimage"></a>
                    <a class="three" href="http://www.jd.com/"><img style="width: 160px;margin-left:60px;" src="/images/jd.png"
                                                        class="usecaseimage"></a>
                    <a class="four" href="http://bank.pingan.com/"><img style="width: 160px;margin-left:60px;" src="/images/payh.png"
                                                           class="usecaseimage"></a>
                    <a class="four" href="http://www.meituan.com/"><img style="width: 160px;margin-left:60px;" src="/images/meituan.png"
                                                                        class="usecaseimage"></a>
                </div>
                <div class="row" style="margin-top:50px;">
                    <div class="workmargin">
                        <a class="one" href="http://www.paypal.com/"><img style="width: 160px;margin-left:60px;" src="/images/paypal.svg"
                                                           class="usecaseimage"></a>
                        <a class="two"  href="http://www.vip.com/"><img style="width: 160px;margin-left:60px;" src="/images/vip.jpg"
                                                           class="usecaseimage"></a>
                        <a class="three" href="https://www.vmware.com/"><img style="width: 160px;margin-left:60px;"
                                                               src="/images/vmware.png" class="usecaseimage"></a>
                        <a class="four" href="https://www.expedia.com/"><img style="width: 160px;margin-left:60px;"
                                                                src="/images/expedia.png" class="usecaseimage"></a>
                        <a class="four"  href="http://www.163.com/"><img style="width: 160px;margin-left:60px;" src="/images/NetEase.jpg"
                                                                        class="usecaseimage"></a>
                    </div>
            </div>
        </div>
    </div>
</div>
<!-- team end -->

<div class="clear"></div>

<!-- team start -->
<div class="workwrapper" id="community_pag">
    <div class="container">
        <div class="row">
            <h2 class="sectiontile">COMMUNITY</h2>
            <div class="row" style="margin-top:50px;">
                <div class="col-md-4">
                    <h4 style="text-align: left">Contribution</h4>
                    <div style="text-align:left">
                        <p>Get help using Apache Griffin or contribute to the project</p>
                        <ul>
                            <li>
                                <a href="/docs/community.html" target="_blank"><b>Mailing Lists</b></a>
                            </li>
                            <li>
                                <a href="https://issues.apache.org/jira/browse/Griffin" target="_blank"><b>Issues Tracking</b></a>
                            </li>
                            <li>
                                <a href="http://github.com/apache/incubator-griffin" target="_blank"><b>Apache Griffin Github</b></a>
                            </li>
                            <li>
                                <a href="/docs/contribute.html" target="_blank"><b>How to Contribute</b></a>
                            </li>
                        </ul>
                    </div>
                </div>
                <div class="col-md-4">
                    <h4 style="text-align: left">Events</h4>
                    <div style="text-align:left">
                        <p>Learn more about Apache Griffin from Conferences</p>
                        <ul>
                            <li><a href="/docs/conf.html"><b>Conferences</b></a></li>
                            <li><a href="/docs/conf.html"><b>Meetups</b></a></li>
                        </ul>
                    </div>
                </div>
                <div class="col-md-4">
                    <h4 style="text-align: left">Apache Software Foundation</h4>
                    <div style="text-align:left">
                        <p></p>
                        <ul>
                            <li><a href="https://www.apache.org/" target="_blank"><b>Foundation</b></a></li>
                            <li><a href="https://www.apache.org/licenses/" target="_blank"><b>License</b></a></li>
                            <li><a href="https://www.apache.org/foundation/sponsorship" target="_blank"><b>Sponsorship</b></a></li>
                            <li><a href="https://www.apache.org/security" target="_blank"><b>Security</b></a></li>
                            <li><a href="https://www.apache.org/foundation/thanks" target="_blank"><b>Thanks</b></a></li>
                            <li><a href="https://www.apache.org/foundation/policies/conduct" target="_blank"><b>Code of Conduct</b></a></li>
                        </ul>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- footer start -->
<div class="footerwrapper">
    <div class="container">
        <div class="row">
            <div class="col-md-3">
                <a href="https://www.apache.org/events/current-event.html">
                    <img src="https://www.apache.org/events/current-event-234x60.png" alt="ASF Current Event">
                </a>
            </div>
            <div class="col-md-9">
                <div>
                    Copyright © 2018 The Apache Software Foundation, Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.<br>
                    Apache Griffin, Griffin, Apache, the Apache feather logo and the Apache Griffin logo are trademarks of The Apache Software Foundation.
                </div>
            </div>
        </div>
    </div>
</div>
<!-- footer end -->

<!-- JavaScripts -->

<script
        src="https://code.jquery.com/jquery-2.2.4.min.js"
        integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
        crossorigin="anonymous"></script>

<script>
    var lastId,
        topMenu = $("#top-menu"),
        topMenuHeight = topMenu.outerHeight() + 15,
        // All list items
        menuItems = topMenu.find("a"),
        // Anchors corresponding to menu items
        scrollItems = menuItems.map(function () {
            var item = $($(this).attr("href"));
            if (item.length) {
                return item;
            }
        });

    menuItems.click(function (e) {
        var href = $(this).attr("href"),
            offsetTop = href === "#" ? 0 : $(href).offset().top - topMenuHeight + 1;
        $('html, body').stop().animate({
            scrollTop: offsetTop
        }, 300);
        e.preventDefault();
    });
    // Bind to scroll
    $(window).scroll(function () {


        // Get container scroll position
        var fromTop = $(this).scrollTop() + topMenuHeight;
        // Get id of current scroll item
        var cur = scrollItems.map(function () {
            if ($(this).offset().top < fromTop)
                return this;
        });
        // Get the id of the current element
        cur = cur[cur.length - 1];
        var id = cur && cur.length ? cur[0].id : "";
        if (lastId !== id) {
            lastId = id;
            // Set/remove active class
            menuItems
                .parent().removeClass("active")
                .end().filter("[href=#" + id + "]").parent().addClass("active");
        }
    });
</script>
</body>
</html>
