├── .gitignore ├── config ├── slaves ├── .DS_Store ├── start-hadoop.sh ├── ssh_config ├── mapred-site.xml ├── core-site.xml ├── yarn-site.xml ├── hdfs-site.xml ├── run-wordcount.sh └── hadoop-env.sh ├── hadoop-cluster-docker.png ├── resize-cluster.sh ├── start-container.sh ├── Dockerfile ├── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /config/slaves: -------------------------------------------------------------------------------- 1 | hadoop-slave1 2 | hadoop-slave2 3 | hadoop-slave3 4 | hadoop-slave4 5 | -------------------------------------------------------------------------------- /config/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiwenlau/hadoop-cluster-docker/HEAD/config/.DS_Store -------------------------------------------------------------------------------- /hadoop-cluster-docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiwenlau/hadoop-cluster-docker/HEAD/hadoop-cluster-docker.png -------------------------------------------------------------------------------- /config/start-hadoop.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo -e "\n" 4 | 5 | $HADOOP_HOME/sbin/start-dfs.sh 6 | 7 | echo -e "\n" 8 | 9 | $HADOOP_HOME/sbin/start-yarn.sh 10 | 11 | echo -e "\n" 12 | 13 | -------------------------------------------------------------------------------- /config/ssh_config: -------------------------------------------------------------------------------- 1 | Host localhost 2 | StrictHostKeyChecking no 3 | 4 | Host 0.0.0.0 5 | StrictHostKeyChecking no 6 | 7 | Host hadoop-* 8 | StrictHostKeyChecking no 9 | UserKnownHostsFile=/dev/null -------------------------------------------------------------------------------- /config/mapred-site.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | mapreduce.framework.name 5 | yarn 6 | 7 | 8 | -------------------------------------------------------------------------------- /config/core-site.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | fs.defaultFS 5 | hdfs://hadoop-master:9000/ 6 | 7 | 8 | -------------------------------------------------------------------------------- /config/yarn-site.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | yarn.nodemanager.aux-services 5 | mapreduce_shuffle 6 | 7 | 8 | yarn.nodemanager.aux-services.mapreduce_shuffle.class 9 | org.apache.hadoop.mapred.ShuffleHandler 10 | 11 | 12 | yarn.resourcemanager.hostname 13 | hadoop-master 14 | 15 | 16 | -------------------------------------------------------------------------------- /resize-cluster.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # N is the node number of hadoop cluster 4 | N=$1 5 | 6 | if [ $# = 0 ] 7 | then 8 | echo "Please specify the node number of hadoop cluster!" 9 | exit 1 10 | fi 11 | 12 | # change slaves file 13 | i=1 14 | rm config/slaves 15 | while [ $i -lt $N ] 16 | do 17 | echo "hadoop-slave$i" >> config/slaves 18 | ((i++)) 19 | done 20 | 21 | echo "" 22 | 23 | echo -e "\nbuild docker hadoop image\n" 24 | 25 | # rebuild kiwenlau/hadoop image 26 | sudo docker build -t kiwenlau/hadoop:1.0 . 27 | 28 | echo "" 29 | -------------------------------------------------------------------------------- /config/hdfs-site.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | dfs.namenode.name.dir 5 | file:///root/hdfs/namenode 6 | NameNode directory for namespace and transaction logs storage. 7 | 8 | 9 | dfs.datanode.data.dir 10 | file:///root/hdfs/datanode 11 | DataNode directory 12 | 13 | 14 | dfs.replication 15 | 2 16 | 17 | 18 | -------------------------------------------------------------------------------- /config/run-wordcount.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # test the hadoop cluster by running wordcount 4 | 5 | # create input files 6 | mkdir input 7 | echo "Hello Docker" >input/file2.txt 8 | echo "Hello Hadoop" >input/file1.txt 9 | 10 | # create input directory on HDFS 11 | hadoop fs -mkdir -p input 12 | 13 | # put input files to HDFS 14 | hdfs dfs -put ./input/* input 15 | 16 | # run wordcount 17 | hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.7.2-sources.jar org.apache.hadoop.examples.WordCount input output 18 | 19 | # print the input files 20 | echo -e "\ninput file1.txt:" 21 | hdfs dfs -cat input/file1.txt 22 | 23 | echo -e "\ninput file2.txt:" 24 | hdfs dfs -cat input/file2.txt 25 | 26 | # print the output of wordcount 27 | echo -e "\nwordcount output:" 28 | hdfs dfs -cat output/part-r-00000 29 | 30 | -------------------------------------------------------------------------------- /start-container.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # the default node number is 3 4 | N=${1:-3} 5 | 6 | 7 | # start hadoop master container 8 | sudo docker rm -f hadoop-master &> /dev/null 9 | echo "start hadoop-master container..." 10 | sudo docker run -itd \ 11 | --net=hadoop \ 12 | -p 50070:50070 \ 13 | -p 8088:8088 \ 14 | --name hadoop-master \ 15 | --hostname hadoop-master \ 16 | kiwenlau/hadoop:1.0 &> /dev/null 17 | 18 | 19 | # start hadoop slave container 20 | i=1 21 | while [ $i -lt $N ] 22 | do 23 | sudo docker rm -f hadoop-slave$i &> /dev/null 24 | echo "start hadoop-slave$i container..." 25 | sudo docker run -itd \ 26 | --net=hadoop \ 27 | --name hadoop-slave$i \ 28 | --hostname hadoop-slave$i \ 29 | kiwenlau/hadoop:1.0 &> /dev/null 30 | i=$(( $i + 1 )) 31 | done 32 | 33 | # get into hadoop master container 34 | sudo docker exec -it hadoop-master bash 35 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.04 2 | 3 | MAINTAINER KiwenLau 4 | 5 | WORKDIR /root 6 | 7 | # install openssh-server, openjdk and wget 8 | RUN apt-get update && apt-get install -y openssh-server openjdk-7-jdk wget 9 | 10 | # install hadoop 2.7.2 11 | RUN wget https://github.com/kiwenlau/compile-hadoop/releases/download/2.7.2/hadoop-2.7.2.tar.gz && \ 12 | tar -xzvf hadoop-2.7.2.tar.gz && \ 13 | mv hadoop-2.7.2 /usr/local/hadoop && \ 14 | rm hadoop-2.7.2.tar.gz 15 | 16 | # set environment variable 17 | ENV JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 18 | ENV HADOOP_HOME=/usr/local/hadoop 19 | ENV PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin 20 | 21 | # ssh without key 22 | RUN ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' && \ 23 | cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 24 | 25 | RUN mkdir -p ~/hdfs/namenode && \ 26 | mkdir -p ~/hdfs/datanode && \ 27 | mkdir $HADOOP_HOME/logs 28 | 29 | COPY config/* /tmp/ 30 | 31 | RUN mv /tmp/ssh_config ~/.ssh/config && \ 32 | mv /tmp/hadoop-env.sh /usr/local/hadoop/etc/hadoop/hadoop-env.sh && \ 33 | mv /tmp/hdfs-site.xml $HADOOP_HOME/etc/hadoop/hdfs-site.xml && \ 34 | mv /tmp/core-site.xml $HADOOP_HOME/etc/hadoop/core-site.xml && \ 35 | mv /tmp/mapred-site.xml $HADOOP_HOME/etc/hadoop/mapred-site.xml && \ 36 | mv /tmp/yarn-site.xml $HADOOP_HOME/etc/hadoop/yarn-site.xml && \ 37 | mv /tmp/slaves $HADOOP_HOME/etc/hadoop/slaves && \ 38 | mv /tmp/start-hadoop.sh ~/start-hadoop.sh && \ 39 | mv /tmp/run-wordcount.sh ~/run-wordcount.sh 40 | 41 | RUN chmod +x ~/start-hadoop.sh && \ 42 | chmod +x ~/run-wordcount.sh && \ 43 | chmod +x $HADOOP_HOME/sbin/start-dfs.sh && \ 44 | chmod +x $HADOOP_HOME/sbin/start-yarn.sh 45 | 46 | # format namenode 47 | RUN /usr/local/hadoop/bin/hdfs namenode -format 48 | 49 | CMD [ "sh", "-c", "service ssh start; bash"] 50 | 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Run Hadoop Cluster within Docker Containers 2 | 3 | - Blog: [Run Hadoop Cluster in Docker Update](http://kiwenlau.com/2016/06/26/hadoop-cluster-docker-update-english/) 4 | - 博客: [基于Docker搭建Hadoop集群之升级版](http://kiwenlau.com/2016/06/12/160612-hadoop-cluster-docker-update/) 5 | 6 | 7 | ![alt tag](https://raw.githubusercontent.com/kiwenlau/hadoop-cluster-docker/master/hadoop-cluster-docker.png) 8 | 9 | 10 | ### 3 Nodes Hadoop Cluster 11 | 12 | ##### 1. pull docker image 13 | 14 | ``` 15 | sudo docker pull kiwenlau/hadoop:1.0 16 | ``` 17 | 18 | ##### 2. clone github repository 19 | 20 | ``` 21 | git clone https://github.com/kiwenlau/hadoop-cluster-docker 22 | ``` 23 | 24 | ##### 3. create hadoop network 25 | 26 | ``` 27 | sudo docker network create --driver=bridge hadoop 28 | ``` 29 | 30 | ##### 4. start container 31 | 32 | ``` 33 | cd hadoop-cluster-docker 34 | sudo ./start-container.sh 35 | ``` 36 | 37 | **output:** 38 | 39 | ``` 40 | start hadoop-master container... 41 | start hadoop-slave1 container... 42 | start hadoop-slave2 container... 43 | root@hadoop-master:~# 44 | ``` 45 | - start 3 containers with 1 master and 2 slaves 46 | - you will get into the /root directory of hadoop-master container 47 | 48 | ##### 5. start hadoop 49 | 50 | ``` 51 | ./start-hadoop.sh 52 | ``` 53 | 54 | ##### 6. run wordcount 55 | 56 | ``` 57 | ./run-wordcount.sh 58 | ``` 59 | 60 | **output** 61 | 62 | ``` 63 | input file1.txt: 64 | Hello Hadoop 65 | 66 | input file2.txt: 67 | Hello Docker 68 | 69 | wordcount output: 70 | Docker 1 71 | Hadoop 1 72 | Hello 2 73 | ``` 74 | 75 | ### Arbitrary size Hadoop cluster 76 | 77 | ##### 1. pull docker images and clone github repository 78 | 79 | do 1~3 like section A 80 | 81 | ##### 2. rebuild docker image 82 | 83 | ``` 84 | sudo ./resize-cluster.sh 5 85 | ``` 86 | - specify parameter > 1: 2, 3.. 87 | - this script just rebuild hadoop image with different **slaves** file, which pecifies the name of all slave nodes 88 | 89 | 90 | ##### 3. start container 91 | 92 | ``` 93 | sudo ./start-container.sh 5 94 | ``` 95 | - use the same parameter as the step 2 96 | 97 | ##### 4. run hadoop cluster 98 | 99 | do 5~6 like section A 100 | 101 | -------------------------------------------------------------------------------- /config/hadoop-env.sh: -------------------------------------------------------------------------------- 1 | # Licensed to the Apache Software Foundation (ASF) under one 2 | # or more contributor license agreements. See the NOTICE file 3 | # distributed with this work for additional information 4 | # regarding copyright ownership. The ASF licenses this file 5 | # to you under the Apache License, Version 2.0 (the 6 | # "License"); you may not use this file except in compliance 7 | # with the License. You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | # Set Hadoop-specific environment variables here. 18 | 19 | # The only required environment variable is JAVA_HOME. All others are 20 | # optional. When running a distributed configuration it is best to 21 | # set JAVA_HOME in this file, so that it is correctly defined on 22 | # remote nodes. 23 | 24 | # The java implementation to use. 25 | export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64 26 | 27 | # The jsvc implementation to use. Jsvc is required to run secure datanodes 28 | # that bind to privileged ports to provide authentication of data transfer 29 | # protocol. Jsvc is not required if SASL is configured for authentication of 30 | # data transfer protocol using non-privileged ports. 31 | #export JSVC_HOME=${JSVC_HOME} 32 | 33 | export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"} 34 | 35 | # Extra Java CLASSPATH elements. Automatically insert capacity-scheduler. 36 | for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do 37 | if [ "$HADOOP_CLASSPATH" ]; then 38 | export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f 39 | else 40 | export HADOOP_CLASSPATH=$f 41 | fi 42 | done 43 | 44 | # The maximum amount of heap to use, in MB. Default is 1000. 45 | #export HADOOP_HEAPSIZE= 46 | #export HADOOP_NAMENODE_INIT_HEAPSIZE="" 47 | 48 | # Extra Java runtime options. Empty by default. 49 | export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true" 50 | 51 | # Command specific options appended to HADOOP_OPTS when specified 52 | export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS" 53 | export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS" 54 | 55 | export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS" 56 | 57 | export HADOOP_NFS3_OPTS="$HADOOP_NFS3_OPTS" 58 | export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS" 59 | 60 | # The following applies to multiple commands (fs, dfs, fsck, distcp etc) 61 | export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS" 62 | #HADOOP_JAVA_PLATFORM_OPTS="-XX:-UsePerfData $HADOOP_JAVA_PLATFORM_OPTS" 63 | 64 | # On secure datanodes, user to run the datanode as after dropping privileges. 65 | # This **MUST** be uncommented to enable secure HDFS if using privileged ports 66 | # to provide authentication of data transfer protocol. This **MUST NOT** be 67 | # defined if SASL is configured for authentication of data transfer protocol 68 | # using non-privileged ports. 69 | export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER} 70 | 71 | # Where log files are stored. $HADOOP_HOME/logs by default. 72 | #export HADOOP_LOG_DIR=${HADOOP_LOG_DIR}/$USER 73 | 74 | # Where log files are stored in the secure data environment. 75 | export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER} 76 | 77 | ### 78 | # HDFS Mover specific parameters 79 | ### 80 | # Specify the JVM options to be used when starting the HDFS Mover. 81 | # These options will be appended to the options specified as HADOOP_OPTS 82 | # and therefore may override any similar flags set in HADOOP_OPTS 83 | # 84 | # export HADOOP_MOVER_OPTS="" 85 | 86 | ### 87 | # Advanced Users Only! 88 | ### 89 | 90 | # The directory where pid files are stored. /tmp by default. 91 | # NOTE: this should be set to a directory that can only be written to by 92 | # the user that will run the hadoop daemons. Otherwise there is the 93 | # potential for a symlink attack. 94 | export HADOOP_PID_DIR=${HADOOP_PID_DIR} 95 | export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR} 96 | 97 | # A string representing this instance of hadoop. $USER by default. 98 | export HADOOP_IDENT_STRING=$USER 99 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | --------------------------------------------------------------------------------