Code Monkey home page Code Monkey logo

hadoop-connectors's Introduction

Pravega Build Status codecov License Version CII Best Practices

Pravega is an open source distributed storage service implementing Streams. It offers Stream as the main primitive for the foundation of reliable storage systems: a high-performance, durable, elastic, and unlimited append-only byte stream with strict ordering and consistency.

To learn more about Pravega, visit https://pravega.io

Prerequisites

  • Java 11+

In spite of the requirements of using JDK 11+ to build this project, client artifacts (and its dependencies) must be compatible with a Java 8 runtime. All other components are built and ran using JDK11+.

The clientJavaVersion project property determines the version used to build the client (defaults to 8).

Building Pravega

Checkout the source code:

git clone https://github.com/pravega/pravega.git
cd pravega

Build the pravega distribution:

./gradlew distribution

Install pravega jar files into the local maven repository. This is handy for running the pravega-samples locally against a custom version of pravega.

./gradlew install

Running unit tests:

./gradlew test

Setting up your IDE

Pravega uses Project Lombok so you should ensure you have your IDE setup with the required plugins. Using IntelliJ is recommended.

To import the source into IntelliJ:

  1. Import the project directory into IntelliJ IDE. It will automatically detect the gradle project and import things correctly.
  2. Enable Annotation Processing by going to Build, Execution, Deployment -> Compiler > Annotation Processors and checking 'Enable annotation processing'.
  3. Install the Lombok Plugin. This can be found in Preferences -> Plugins. Restart your IDE.
  4. Pravega should now compile properly.

For eclipse, you can generate eclipse project files by running ./gradlew eclipse.

Note: Some unit tests will create (and delete) a significant amount of files. For improved performance on Windows machines, be sure to add the appropriate 'Microsoft Defender' exclusion.

Releases

The latest pravega releases can be found on the Github Release project page.

Snapshot artifacts

All snapshot artifacts from master and release branches are available in GitHub Packages Registry

Add the following to your repositories list and import dependencies as usual.

maven {
    url "https://maven.pkg.github.com/pravega/pravega"
    credentials {
        username = "pravega-public"
        password = "\u0067\u0068\u0070\u005F\u0048\u0034\u0046\u0079\u0047\u005A\u0031\u006B\u0056\u0030\u0051\u0070\u006B\u0079\u0058\u006D\u0035\u0063\u0034\u0055\u0033\u006E\u0032\u0065\u0078\u0039\u0032\u0046\u006E\u0071\u0033\u0053\u0046\u0076\u005A\u0049"
    }
}

Note GitHub Packages requires authentication to download packages thus credentials above are required. Use the provided password as is, please do not decode it.

If you need a dedicated token to use in your repository (and GitHub Actions) please reach out to us.

As alternative option you can use JitPack (https://jitpack.io/#pravega/pravega) to get pre-release artifacts.

Quick Start

Read Getting Started page for more information, and also visit sample-apps repo for more applications.

Running Pravega

Pravega can be installed locally or in a distributed environment. The installation and deployment of pravega is covered in the Running Pravega guide.

Support

Don’t hesitate to ask! Contact the developers and community on slack (signup) if you need any help. Open an issue if you found a bug on Github Issues.

Documentation

The Pravega documentation is hosted on the website: https://pravega.io/docs/latest or in the documentation directory of the source code.

Contributing

Become one of the contributors! We thrive to build a welcoming and open community for anyone who wants to use the system or contribute to it. Here we describe how to contribute to Pravega! You can see the roadmap document here.

About

Pravega is 100% open source and community-driven. All components are available under Apache 2 License on GitHub.

hadoop-connectors's People

Contributors

alexanderzhao1 avatar charlielchen avatar claudiofahey avatar crazyzhou avatar eronwright avatar guangfeng-xu avatar raulgracia avatar thekingofcity avatar vijikarthi avatar yangb8 avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hadoop-connectors's Issues

Update Connector version to 0.3.2

Problem description

In preparation of the connector release, update connector version to 0.3.2 from the r0.3 branch in support of Pravega release 0.3.2 ( https://github.com/pravega/pravega/releases/tag/v0.3.2)

  • Update Pravega version from gradle.properties to 0.3.2
  • Update Connector version from gradle.properties to 0.3.2
  • Update Pravega sub-module commit ID to aa957aa962c486c00d48d2c4acb7bc8764031a23

Problem location
Build scripts

Suggestions for an improvement

PravegaConnectorMiniYarnITCase failed if usePravegaVersionSubModule is set to false.

everything works well if I set usePravegaVersionSubModule to true (submodule build). However, below exception will be thrown if it's set to false. So seems like there is some dependency issue. I tried to add all hadoop yarn jars, but still got this error.

io.pravega.connectors.hadoop.PravegaConnectorMiniYarnITCase > testPravegaConnector FAILED
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: org.apache.hadoop.yarn.webapp.WebAppException: Error starting http server
at org.apache.hadoop.yarn.server.MiniYARNCluster.startResourceManager(MiniYARNCluster.java:347)
at org.apache.hadoop.yarn.server.MiniYARNCluster.access$300(MiniYARNCluster.java:116)
at org.apache.hadoop.yarn.server.MiniYARNCluster$ResourceManagerWrapper.serviceStart(MiniYARNCluster.java:468)
at org.apache.hadoop.service.AbstractService.start(AbstractService.java:193)
at org.apache.hadoop.service.CompositeService.serviceStart(CompositeService.java:120)
at org.apache.hadoop.yarn.server.MiniYARNCluster.serviceStart(MiniYARNCluster.java:296)
at org.apache.hadoop.service.AbstractService.start(AbstractService.java:193)
at io.pravega.connectors.hadoop.PravegaConnectorMiniYarnITCase.setUp(PravegaConnectorMiniYarnITCase.java:73)

    Caused by:
    org.apache.hadoop.yarn.webapp.WebAppException: Error starting http server
        at org.apache.hadoop.yarn.webapp.WebApps$Builder.start(WebApps.java:310)
        at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.startWepApp(ResourceManager.java:1078)
        at org.apache.hadoop.yarn.server.resourcemanager.ResourceManager.serviceStart(ResourceManager.java:1176)
        at org.apache.hadoop.service.AbstractService.start(AbstractService.java:193)
        at org.apache.hadoop.yarn.server.MiniYARNCluster.startResourceManager(MiniYARNCluster.java:339)
        ... 7 more

        Caused by:
        java.io.IOException: Unable to initialize WebAppContext
            at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:955)
            at org.apache.hadoop.yarn.webapp.WebApps$Builder.start(WebApps.java:306)
            ... 11 more

            Caused by:
            com.sun.jersey.api.container.ContainerException: No WebApplication provider is present
                at com.sun.jersey.spi.container.WebApplicationFactory.createWebApplication(WebApplicationFactory.java:69)
                at com.sun.jersey.spi.container.servlet.ServletContainer.create(ServletContainer.java:391)
                at com.sun.jersey.spi.container.servlet.ServletContainer$InternalWebComponent.create(ServletContainer.java:306)
                at com.sun.jersey.spi.container.servlet.WebComponent.load(WebComponent.java:607)
                at com.sun.jersey.spi.container.servlet.WebComponent.init(WebComponent.java:210)
                at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:373)
                at com.sun.jersey.spi.container.servlet.ServletContainer.init(ServletContainer.java:710)
                at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114)
                at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98)
                at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172)
                at org.mortbay.jetty.servlet.FilterHolder.doStart(FilterHolder.java:97)
                at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
                at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:713)
                at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
                at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1282)
                at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:518)
                at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:499)
                at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
                at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
                at org.mortbay.jetty.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:156)
                at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
                at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
                at org.mortbay.jetty.Server.doStart(Server.java:224)
                at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
                at org.apache.hadoop.http.HttpServer2.start(HttpServer2.java:933)
                ... 12 more

Create release branch r0.3 (release-prep 0.3.0)

Problem description
In preparation of 0.3.0 release, create a release branch 0.3 and tag the current master branch to mark the pre-release commit point

git checkout master
git tag branch-0.3
git push origin branch-0.3

git checkout -b r0.3
git push origin r0.3

Problem location
connector repository

Suggestions for an improvement
None

Setup Travis build

Setup a Travis build along the same lines that we have for other repositories under Pravega, e.g., flink-connectors.

Configure travis build to use JDK 8

Problem description
Hadoop connector build currently supports java 8 but the travis configuration does not enforce the JDK version. Recent travis build for Hadoop connector is failing since it is trying to use JDK 11 (https://api.travis-ci.org/v3/job/545513969/log.txt). Configure travis build to use JDK 8.

jdk:
  - openjdk8

Problem location
Travis configuration

Suggestions for an improvement

Update Pravega version in r0.5 branch

Problem description

Update Pravega version in r0.5 branch to the latest commit 6f8a8203b807a4babbad54f8efe856f3fbef916d and the corresponding snapshot version is 0.5.0-2269.6f8a820-SNAPSHOT.

Problem location
Connector r0.5 branch build configurations

Suggestions for an improvement

Move examples to pravega-samples

Some examples are embedded in the main sourceset and should be moved to the pravega-samples repository. Be sure to trim the dependencies upon removal of the examples (notably spark).

Implement `WritableComparable` on `EventKey`

The EventKey class conveys the key for each event read. Keys in MR are supposed to be sortable via the WritableComparable interface. I don't know the consequences of not implementing it.

Update connector to use Pravega r0.5 artifacts

Problem description
In preparation of connector 0.5.0 release, update connector build configuration to use Pravega artifacts from r0.5 branch i.e., 0.5.0-2223.ce3ba81-SNAPSHOT (commit: ce3ba813713ce918a300e68bbaa681664ab135c3)

Problem location
Build configuration

Suggestions for an improvement

Update connector to support Pravega client API refactor

Problem description
Update Hadoop connector to support recent changes to Pravega client API see here. Make changes to the connector to support Pravega client API refactor changes.

  • update Pravega snapshot to latest artifact version
  • resolve API compatibility issues

Problem location
Hadoop connector

Suggestions for an improvement

Change version in r0.3 branch in preparation for release

Problem description
Change version in preparation for the connector release 0.3.1.

  • update pravega version to 0.3.1
  • update connector version to from 0.3.1-SNAPSHOT to 0.3.1

Problem location
Gradle properties.

Suggestions for an improvement
NA

Cherry-pick commits from master to r0.5 branch

Problem description
Cherry-Pick following commits from master to r0.5 branch

a8c7d541e32501e93230656798d15414df00801b [issue-51] Add developer information to pom file for maven publishing
0d7e5af72ffed561667ac0187336c30d31771211 [issue-80] Fix TLS security configuration
dcec8c52936163b1c0fead5ae06da33e7ec7bb1f [issue-94] Configure travis build to use JDK 8 

Problem location
r0.5 branch

Suggestions for an improvement

Prepare for 0.5 release

Problem description
As part of preparing for 0.5.0 release, update the following configurations from gradle.properties

  • bump Pravega version to 0.5.0
  • change connection version to 0.5.0 from 0.5.0-SNAPSHOT
  • update Pravega sub-module commit id to 38a40f37a1a6e121dbc7c8a04ef7d3c055352353

Problem location
gradle.properties and git pravega submodule

Suggestions for an improvement

Add support for Hive

Currently, hadoop-connectors are implemented by using new MapReduce API but some applications like Hive only supports Input/OutputFormat with the old MapRed interface.

So far I don't see there is a requirement to support Hive, but just create this issue to track this potential effort. It's a low priority now.

Add pravega client dependency to connector POM

(same issue as pravega/flink-connectors#145)

Problem description
The Pravega client is currently shaded but not relocated in the connector JAR, and is not mentioned in the effective POM. This is an odd situation, because an application that links to the connector is not told that Pravega is included, yet it is, or what version is included. The application may well need to use the client directly, for example the pravega samples pre-create a scope in their main method.

Adding the client dependency is not as simple as it sounds, however. If the connector were to have a straightforward dependency on the Pravega client in its effective POM, the application would see it as a transitive dependency and include it in its own uberjar without the shading that is normally required. The true prerequisite is pravega/pravega#1339 (Pravega client to shade its dependencies), which would vastly simplify both the connector and the application.

Problem location

Suggestions for an improvement

Publish a 0.3 release

Make the necessary changes to the build to publish a release to Maven Central.

Prerequisite: a released version of Pravega client.

Change connectorVersion to 0.3.1-SNAPSHOT in r0.3 branch

Problem description

Change connectorVersion from 0.3.0 to 0.3.1-SNAPSHOT

Problem location
Ensures any future changes are considered part of the 0.3.1 pre-release as opposed to being part of 0.3.0.

Suggestions for an improvement
None

Update connector version in r0.5

Problem description
Update connector version to 0.5.1-SNAPSHOT in r0.5 branch

Problem location
gradle.properties

Suggestions for an improvement

Copyright year

Problem description
Update copyright information from all the repository files as per the following guidelines

  • Delete the year in the license header across all files (0.5)
  • Delete the year in the license header across all files (0.6)
  • Add a NOTICE file with the copyright statement

Refer to the issue pravega/pravega#3508 for more details specific to the reason for the requested change.

Problem location
Copyrights information

Suggestions for an improvement

Fix TLS security configurations

Problem description
This PR pravega/pravega#3693 has introduced changes to Pravega TLS security configurations which is used in connector system/integration tests. We need to fix the corresponding security configuration files used in connector according to the changes implemented in this PR pravega/pravega#3693.

Problem location
Security related integration tests

Suggestions for an improvement

Update Pravega version

Problem description
Update Pravega version to 0.4.0-50.da91e55-SNAPSHOT and sub-module commit ID to da91e5518b9797306e94bb383508e59a96f3bc23

Problem location
build configurations

Suggestions for an improvement

Add Pravega security configuration support

Problem description

The current implementation of Hadoop Connectors does not provide options to accept Pravega security configurations (PravegaConfig). This restricts the use of connectors in Pravega secured environment. Fix connectors implementation to accept Pravega security configurations.

  • InputFormat & OutputFormat implementation should work

  • Update test code to run InProcPravegaCluster in secure mode

  • Ensure to use the latest Pravega snapshot build 0.5.0-50.59e3614-SNAPSHOT that has many fixes specific to Pravega security.

  • Update the Pravega sub-module with the commit 59e3614e835713259dd70acf649dbbd4f1d79347.

  • Test and validate connector system tests with Pravega security (authentication and TLS).

Problem location

https://github.com/pravega/hadoop-connectors/blob/master/src/main/java/io/pravega/connectors/hadoop/PravegaInputFormat.java#L83

https://github.com/pravega/hadoop-connectors/blob/master/src/main/java/io/pravega/connectors/hadoop/PravegaOutputFormat.java#L94

https://github.com/pravega/hadoop-connectors/blob/master/src/test/java/io/pravega/connectors/hadoop/utils/SetupUtils.java#L89

Suggestions for an improvement

Add distribution publishing configuration

Problem description
Add gradle distribution configurations to enable packaging connectors project workspace for release

Problem location
build configurations

Suggestions for an improvement
None

Update Pravega version to latest master

Problem description
Update Pravega version to 0.6.0-50.51c766c-SNAPSHOT and bump the sub-module commit to 51c766c126b184a6d93f09115c1907f697bb15ee

Problem location
Build configurations

Suggestions for an improvement

Pass Pravega credentials as environment variables for integration test

Problem description
When the integration test is enabled to use Authentication, the Pravega ClientConfig class will try to load the Credentials based on either system or environment values passed. Initialize the tests by passing appropriate environment variables.

Problem location
Integration test

Suggestions for an improvement

Update version info from master branch (release-prep 0.3.0)

Problem description
As part of the 0.3.0 release, update gradle properties configurations from the master branch to the following.

pravegaVersion=0.4.0-50.63aea88-SNAPSHOT
connectorVersion=0.4.0-SNAPSHOT

Also, update pravega submodule to latest pravega/master (0.4.0-SNAPSHOT)

Problem location
connector gradle.properties

Suggestions for an improvement
None

Resolve YarnMiniCluster guava dependency conflict with Pravega

Problem description
While addressing the fix for the issue #64, I have found that the PravegaConnectorMiniYarnITCase failed to start and it is due to the guava jar dependency conflict.

Pravega has the guava dependency 27.0.1-jre whereas the yarn package library used in the connector project has guava dependency com.google.guava:guava:11.0.2.

Relates to
pravega/pravega#1142
pravega/pravega#1339

2019-03-22 15:29:07,548 INFO  [main] service.AbstractService (AbstractService.java:noteFailure(272)) - Service org.apache.hadoop.yarn.server.MiniYARNCluster$ResourceManagerWrapper_0 failed in state STARTED; cause: org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.NoSuchFieldError: WHITESPACE
org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.NoSuchFieldError: WHITESPACE
	at org.apache.hadoop.yarn.server.MiniYARNCluster.startResourceManager(MiniYARNCluster.java:349)
	at org.apache.hadoop.yarn.server.MiniYARNCluster.access$300(MiniYARNCluster.java:118)
	at org.apache.hadoop.yarn.server.MiniYARNCluster$ResourceManagerWrapper.serviceStart(MiniYARNCluster.java:479)
	at org.apache.hadoop.service.AbstractService.start(AbstractService.java:193)
	at org.apache.hadoop.service.CompositeService.serviceStart(CompositeService.java:120)
	at org.apache.hadoop.yarn.server.MiniYARNCluster.serviceStart(MiniYARNCluster.java:298)
	at org.apache.hadoop.service.AbstractService.start(AbstractService.java:193)
	at io.pravega.connectors.hadoop.PravegaConnectorMiniYarnITCase.setUp(PravegaConnectorMiniYarnITCase.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.contrib.java.lang.system.EnvironmentVariables$EnvironmentVariablesStatement.evaluate(EnvironmentVariables.java:122)
	at org.junit.rules.RunRules.evaluate(RunRules.java:20)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.NoSuchFieldError: WHITESPACE
	at org.apache.hadoop.yarn.webapp.WebApp.getPrefix(WebApp.java:265)
	at org.apache.hadoop.yarn.webapp.WebApp.parseRoute(WebApp.java:231)
	at org.apache.hadoop.yarn.webapp.WebApp.route(WebApp.java:219)
	at org.apache.hadoop.yarn.server.resourcemanager.webapp.RMWebApp.setup(RMWebApp.java:60)

Problem location
Hadoop Connector integration test PravegaConnectorMiniYarnITCase

Suggestions for an improvement

Update Pravega to 0.4.0-RC5

Problem description
In preparation of 0.4.0 release, Update Pravega version to v0.4.0-rc5 from gradle.properties (version=0.4.0-2030.d99411b-SNAPSHOT). Also update the Pravega sub-module commit ID to d99411b1cb805f9d6c7374db566801e7eb724851 in r0.4.

Problem location

  • gradle.properties
  • submodule

Suggestions for an improvement

Improve tests

The current tests are best understood as integration tests. Develop a unit test suite that focuses on coverage and mocks the Pravega batch client.

Consolidate the existing tests as an integration test called InputFormatITCase that makes use of Pravega Standalone and MiniYARN to demonstrate the end-to-end functionality.

Update Connector version in branch r0.3

Problem description
Update the connector version to 0.3.2-SNAPSHOT post 0.3.1 release.

Problem location
gradle.properties

Suggestions for an improvement
NA

Update version info from r0.3 branch (release-prep 0.3.0)

Problem description
As part of the 0.3.0 release, update gradle properties configurations from the r0.3 branch to the following.

pravegaVersion=0.3.0
connectorVersion=0.3.0

Also, update pravega submodule commit

Problem location
connector gradle.properties

Suggestions for an improvement
None

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.