This is an automated email from the ASF dual-hosted git repository. yihua pushed a commit to branch asf-site in repository https://gitbox.apache.org/repos/asf/hudi.git
The following commit(s) were added to refs/heads/asf-site by this push: new b5df8d0 [DOCS] Redesigned the blog page with grid layout (#5006) b5df8d0 is described below commit b5df8d0932986148dee6005e74177201378dbe34 Author: Vinoth Govindarajan <vino...@uber.com> AuthorDate: Wed Mar 16 11:44:12 2022 -0700 [DOCS] Redesigned the blog page with grid layout (#5006) --- .../blog/2021-08-18-improving-marker-mechanism.md | 1 + website/blog/2021-08-23-s3-events-source.md | 1 + ...g-eb-level-data-lake-using-hudi-at-bytedance.md | 1 + ...se-concurrency-control-are-we-too-optimistic.md | 1 + ...2022-01-06-apache-hudi-2021-a-year-in-review.md | 1 + ...e-data-capture-with-debezium-and-apache-hudi.md | 1 + website/docusaurus.config.js | 6 +- website/src/css/custom.css | 23 ++++ website/src/theme/BlogLayout/index.js | 40 ++++++ website/src/theme/BlogPostItem/index.js | 149 +++++++++++++++++++++ website/src/theme/BlogPostItem/styles.module.css | 22 +++ 11 files changed, 243 insertions(+), 3 deletions(-) diff --git a/website/blog/2021-08-18-improving-marker-mechanism.md b/website/blog/2021-08-18-improving-marker-mechanism.md index d5fad9f..3f81269 100644 --- a/website/blog/2021-08-18-improving-marker-mechanism.md +++ b/website/blog/2021-08-18-improving-marker-mechanism.md @@ -3,6 +3,7 @@ title: "Improving Marker Mechanism in Apache Hudi" excerpt: "We introduce a new marker mechanism leveraging the timeline server to address performance bottlenecks due to rate-limiting on cloud storage like AWS S3." author: yihua category: blog +image: /assets/images/blog/marker-mechanism/timeline-server-based-marker-mechanism.png --- Hudi supports fully automatic cleanup of uncommitted data on storage during its write operations. Write operations in an Apache Hudi table use markers to efficiently track the data files written to storage. In this blog, we dive into the design of the existing direct marker file mechanism and explain its performance problems on cloud storage like AWS S3 for diff --git a/website/blog/2021-08-23-s3-events-source.md b/website/blog/2021-08-23-s3-events-source.md index 85af044..e48b89c 100644 --- a/website/blog/2021-08-23-s3-events-source.md +++ b/website/blog/2021-08-23-s3-events-source.md @@ -3,6 +3,7 @@ title: "Reliable ingestion from AWS S3 using Hudi" excerpt: "From listing to log-based approach, a reliable way of ingesting data from AWS S3 into Hudi." author: codope category: blog +image: /assets/images/blog/s3_events_source_design.png --- In this post we will talk about a new deltastreamer source which reliably and efficiently processes new data files as they arrive in AWS S3. diff --git a/website/blog/2021-09-01-building-eb-level-data-lake-using-hudi-at-bytedance.md b/website/blog/2021-09-01-building-eb-level-data-lake-using-hudi-at-bytedance.md index d3016f7..51c6a41 100644 --- a/website/blog/2021-09-01-building-eb-level-data-lake-using-hudi-at-bytedance.md +++ b/website/blog/2021-09-01-building-eb-level-data-lake-using-hudi-at-bytedance.md @@ -3,6 +3,7 @@ title: "Building an ExaByte-level Data Lake Using Apache Hudi at ByteDance" excerpt: "Ziyue Guan from Bytedance shares the production experience of building an ExaByte-level data lake using Apache Hudi and how it is used in the recommendation system at Bytedance." author: Ziyue Guan, translated to English by yihua category: blog +image: /assets/images/blog/datalake-bytedance-hudi/slide1.png --- Ziyue Guan from Bytedance shares the experience of building an ExaByte(EB)-level data lake using Apache Hudi at Bytedance. diff --git a/website/blog/2021-12-16-lakehouse-concurrency-control-are-we-too-optimistic.md b/website/blog/2021-12-16-lakehouse-concurrency-control-are-we-too-optimistic.md index 5dd20ca..f45ace9 100644 --- a/website/blog/2021-12-16-lakehouse-concurrency-control-are-we-too-optimistic.md +++ b/website/blog/2021-12-16-lakehouse-concurrency-control-are-we-too-optimistic.md @@ -3,6 +3,7 @@ title: "Lakehouse Concurrency Control: Are we too optimistic?" excerpt: "Vinoth Chandar, Creator of Apache Hudi, dives into concurrency control mechanisms" author: vinoth category: blog +image: /assets/images/blog/concurrency/MultiWriter.gif --- Transactions on data lakes are now considered a key characteristic of a Lakehouse these days. But what has actually been accomplished so far? What are the current approaches? How do they fare in real-world scenarios? These questions are the focus of this blog. diff --git a/website/blog/2022-01-06-apache-hudi-2021-a-year-in-review.md b/website/blog/2022-01-06-apache-hudi-2021-a-year-in-review.md index da65662..7286aea 100644 --- a/website/blog/2022-01-06-apache-hudi-2021-a-year-in-review.md +++ b/website/blog/2022-01-06-apache-hudi-2021-a-year-in-review.md @@ -3,6 +3,7 @@ title: "Apache Hudi - 2021 a Year in Review" excerpt: "A reflection on the growth and momentum of Apache Hudi in 2021" author: vinoth category: blog +image: /assets/images/Hudi_community.png --- As the year came to end, I took some time to reflect on where we are and what we accomplished in 2021. I am humbled by how strong our community is and how regardless of it being another tough pandemic year, that people from around the globe leaned in together and made this the best year yet for Apache Hudi. In this blog I want to recap some of the 2021 highlights. diff --git a/website/blog/2022-01-14-change-data-capture-with-debezium-and-apache-hudi.md b/website/blog/2022-01-14-change-data-capture-with-debezium-and-apache-hudi.md index 01373db..fc87dc0 100644 --- a/website/blog/2022-01-14-change-data-capture-with-debezium-and-apache-hudi.md +++ b/website/blog/2022-01-14-change-data-capture-with-debezium-and-apache-hudi.md @@ -3,6 +3,7 @@ title: "Change Data Capture with Debezium and Apache Hudi" excerpt: "A review of new Debezium source connector for Apache Hudi" author: Rajesh Mahindra category: blog +image: /assets/images/blog/debezium.png --- As of Hudi v0.10.0, we are excited to announce the availability of [Debezium](https://debezium.io/) sources for [Deltastreamer](https://hudi.apache.org/docs/hoodie_deltastreamer) that provide the ingestion of change capture data (CDC) from Postgres and Mysql databases to your data lake. For more details, please refer to the original [RFC](https://github.com/apache/hudi/blob/master/rfc/rfc-39/rfc-39.md). diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index e8c3e8a..66ccad4 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -432,8 +432,8 @@ module.exports = { blog: { editUrl: 'https://github.com/apache/hudi/edit/asf-site/website/blog/', - blogTitle: 'Blog - Apache Hudi: Blogs', - blogSidebarCount: 15, + blogTitle: 'Blogs List Page', + blogSidebarCount: 0, blogSidebarTitle: 'Recent posts', /** * URL route for the blog section of your site. @@ -441,7 +441,7 @@ module.exports = { */ routeBasePath: 'blog', include: ['*.md', '*.mdx'], - postsPerPage: 15, + postsPerPage: 12, /** * Theme components used by the blog pages. */ diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 7fcdd0f..b48c1b2 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -170,3 +170,26 @@ footer .container { max-width: var(--ifm-col-width); flex: 0 0 var(--ifm-col-width); } + +.blogThumbnail img { + height: auto; + width: 100% +} + +.blog-list-page article { + display: inline-flex; + width: 28%; + margin: 1.2em; +} + +@media only screen and (max-width: 767px) { + .blog-list-page article { + display: flex; + width: 100%; + margin: 1.2em; + } +} + +.blog-post-page .blogPostTitle_src-theme-BlogPostItem-styles-module { + font-size: 3rem; +} diff --git a/website/src/theme/BlogLayout/index.js b/website/src/theme/BlogLayout/index.js new file mode 100644 index 0000000..2bac333 --- /dev/null +++ b/website/src/theme/BlogLayout/index.js @@ -0,0 +1,40 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import BlogSidebar from '@theme/BlogSidebar'; + +function BlogLayout(props) { + const {sidebar, toc, children, ...layoutProps} = props; + const hasSidebar = sidebar && sidebar.items.length > 0; + return ( + <Layout {...layoutProps}> + <div className="container margin-vert--lg"> + <div className="row"> + {hasSidebar && ( + <aside className="col col--3"> + <BlogSidebar sidebar={sidebar} /> + </aside> + )} + <main + className={clsx('col', { + 'col--7': hasSidebar, + 'col--9 col--offset-2': !hasSidebar, + })} + itemScope + itemType="http://schema.org/Blog"> + {children} + </main> + {toc && <div className="col col--2">{toc}</div>} + </div> + </div> + </Layout> + ); +} + +export default BlogLayout; diff --git a/website/src/theme/BlogPostItem/index.js b/website/src/theme/BlogPostItem/index.js new file mode 100644 index 0000000..7630979 --- /dev/null +++ b/website/src/theme/BlogPostItem/index.js @@ -0,0 +1,149 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ +import React from 'react'; +import clsx from 'clsx'; +import {MDXProvider} from '@mdx-js/react'; +import Translate, {translate} from '@docusaurus/Translate'; +import Link from '@docusaurus/Link'; +import {useBaseUrlUtils} from '@docusaurus/useBaseUrl'; +import {usePluralForm} from '@docusaurus/theme-common'; +import MDXComponents from '@theme/MDXComponents'; +import EditThisPage from '@theme/EditThisPage'; +import styles from './styles.module.css'; +import TagsListInline from '@theme/TagsListInline'; +import BlogPostAuthors from '@theme/BlogPostAuthors'; // Very simple pluralization: probably good enough for now + +function useReadingTimePlural() { + const {selectMessage} = usePluralForm(); + return (readingTimeFloat) => { + const readingTime = Math.ceil(readingTimeFloat); + return selectMessage( + readingTime, + translate( + { + id: 'theme.blog.post.readingTime.plurals', + description: + 'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)', + message: 'One min read|{readingTime} min read', + }, + { + readingTime, + }, + ), + ); + }; +} + +function BlogPostItem(props) { + const readingTimePlural = useReadingTimePlural(); + const {withBaseUrl} = useBaseUrlUtils(); + const { + children, + frontMatter, + assets, + metadata, + truncated, + isBlogPostPage = false, + } = props; + const { + date, + formattedDate, + permalink, + tags, + readingTime, + title, + editUrl, + authors, + } = metadata; + const image = assets.image ?? frontMatter.image ?? '/assets/images/logo-big.png'; + const truncatedPost = !isBlogPostPage && truncated; + const tagsExists = tags.length > 0; + + const renderPostHeader = () => { + const TitleHeading = isBlogPostPage ? 'h1' : 'h2'; + return ( + <header> + {!isBlogPostPage && image && ( + <div className="col blogThumbnail" itemProp="blogThumbnail"> + <Link itemProp="url" to={permalink}> + <img + src={withBaseUrl(image, { + absolute: true, + })} + /> + </Link> + </div> + )} + <TitleHeading className={styles.blogPostTitle} itemProp="headline"> + {isBlogPostPage ? ( + title + ) : ( + <Link itemProp="url" to={permalink}> + {title} + </Link> + )} + </TitleHeading> + <div className={clsx(styles.blogPostData, 'margin-vert--md')}> + <time dateTime={date} itemProp="datePublished"> + {formattedDate} + </time> + + {typeof readingTime !== 'undefined' && ( + <> + {' ยท '} + {readingTimePlural(readingTime)} + </> + )} + </div> + {isBlogPostPage && ( + <BlogPostAuthors authors={authors} assets={assets} /> + )} + </header> + ); + }; + + return ( + <article + className={!isBlogPostPage ? 'blog-list-item' : undefined} + itemProp="blogPost" + itemScope + itemType="http://schema.org/BlogPosting"> + {renderPostHeader()} + + + {isBlogPostPage && ( + <div className="markdown" itemProp="articleBody"> + <MDXProvider components={MDXComponents}>{children}</MDXProvider> + </div> + )} + + {(tagsExists || truncated) && ( + <footer + className={clsx('row docusaurus-mt-lg', { + [styles.blogPostDetailsFull]: isBlogPostPage, + })}> + {tagsExists && ( + <div + className={clsx('col', { + 'col--9': truncatedPost, + })}> + <TagsListInline tags={tags} /> + </div> + )} + + {isBlogPostPage && editUrl && ( + <div className="col margin-top--sm"> + <EditThisPage editUrl={editUrl} /> + </div> + )} + </footer> + )} + </article> + ); +} + +export default BlogPostItem; diff --git a/website/src/theme/BlogPostItem/styles.module.css b/website/src/theme/BlogPostItem/styles.module.css new file mode 100644 index 0000000..be04a4d --- /dev/null +++ b/website/src/theme/BlogPostItem/styles.module.css @@ -0,0 +1,22 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.blogPostTitle { + font-size: 1rem; +} + +.blogPostData { + font-size: 0.9rem; +} + +.blogPostDetailsFull { + flex-direction: column; +} + +.blog-list-page .container .row { + width: max-content; +}