在Windows上运行Apache Hive和Apache Spark
我觉得使用MSYS/MinGW在Hive和Spark中轻松玩耍。只使用MSYS(和JDK),而不使用Cygwin来运行。在这里,我只是确认在单节点模式下,不打算创建集群,所以可能没有太大的实用性,但是如果将Hadoop的版本设置为2.6.0,就可以创建集群(*)。
虽然不是最新版本,但Hive能运行GREE提供的hive-ruby-scripting的0.12.0版本。Spark能运行相对较新的1.2.0版本。
为了在本地轻松使用,我们使用了可以简单构建的旧版本hadoop 0.23.11作为基础。它是仅限于hadoop2的API较旧,对YARN没有期望。然而,在本地模式下,它非常容易使用并且性能良好。
最初几年前,我们在Windows上使用hadoop 0.23的本地模式运行Pig,现在我们也成功在单节点模式下运行了HDFS(使用hadoop 0.23.11,尚未验证集群模式)。
使用Hadoop 2.6.0构建在Windows 8.1上,可以使用构建的Hadoop 2.6.0,在正常的YARN中使用Hive。
换句话说,如果想轻松地在本地模式下使用,可以选择Hadoop 0.23.11,而如果要进行正式的使用,则可以选择Hadoop 2.6.0。这里主要描述了在Hadoop 0.23.11上的使用方法。
请参考(**) Spark 的新版本1.4.0中的SparkR功能的构建和操作,并将其用于开发。
最后的Spark应该能够在没有使用Hadoop的情况下组建集群,因此在具有实用性的情况下可以使用它。
为了构建和执行这些,我们分别创建了相应的补丁。
如果构建很麻烦,可以从以下获取已构建的二进制文件,包括Hadoop 2.6.0和与其兼容的Hive。
(http://sourceforge.jp/projects/win-hadoop/releases/62852)的内容请用中文进行翻译。只需要提供一种选项。
首先,构建Hadoop。
由于目标是只使用MSYS和JDK来运行,所以可以使用msysGit而不是MSYS/MinGW。但是在构建过程中需要使用协议缓冲区编译器,所以请下载版本为2.5.0的protoc二进制文件(https://code.google.com/p/protobuf/downloads/detail?name=protoc-2.5.0-win32.zip),并将其复制到C:\Windows文件夹中。
如果使用Hadoop 2.6.0,则可以忽略此处的构建方法,请参考此链接。Hadoop 2.6.0需要从Windows命令提示符而不是MSYS进行使用。
从Hadoop Archives(https://archive.apache.org/dist/hadoop/core/hadoop-0.23.11/)下载hadoop-0.23.11-src.tar.gz并解压缩。由于路径较长,请将其放在一个简短的父文件夹(例如C:\work)中。
获取用于在MSYS中构建Hadoop 0.23.11的补丁文件(https://github.com/qtwi/msys-hadoop-0.23.11/raw/master/patch/hadoop-0.23.11-src-mingw-0002r.patch)并应用该补丁。
cd hadoop-0.23.11-src
patch -u -p1 < .../hadoop-0.23.11-src-mingw-0002r.patch
最后,使用Maven进行构建。
mvn clean package -Pdist -DskipTests
建立完成后,将其复制到hadoop-dist/target/hadoop-0.23.11(例如C:\Apps或C:\Apache等)的适当位置。由于偷懒的原因,所有文件必须位于C:驱动器。
如果处于本地模式,如果JAVA_HOME被正确设置(在Hadoop中不允许在JAVA_HOME中包含空格,所以它需要设置为类似于c:/Progra~1/Java/jdk1.7.0_75的路径),那么它应该可以正常工作。
当在单节点模式下使用时,需要在etc/hadoop/core-site.xml中将fs.defaultFS设置为hdfs://localhost:9000。
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
在hdfs-site.xml中进行dfs.replication的配置。
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
一般情况下可以使用sbin/start-dfs.sh来启动,但本次无法使用,因此需要手动在不同的窗口中分别启动NameNode和DataNode。
bin/hdfs namenode -format # 最初の1回だけHDFSのフォーマット
bin/hdfs namenode
bin/hdfs datanode
如果您想更简便地实现持续运行,请使用Shell脚本。
#!/bin/bash
start bash -c "$HADOOP_HOME/bin/hdfs namenode"
start bash -c "$HADOOP_HOME/bin/hdfs datanode"
我认为可以用类似的方式准备。另外,为了结束它,需要进行kill操作,因此必须保存进程ID。
HDFS的操作需在另一个窗口中执行,但是在MSYS中有一种奇怪的路径字符串转换特性,当指定从根目录开始的路径时,需要将头部的“/”加倍。
bin/hdfs dfs ls //
bin/hdfs dfs -mkdir -p //user/yourname
# サンプルの実行
bin/hdfs dfs -put etc/hadoop input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-0.23.11.jar grep input output 'dfs[a-z.]+'
bin/hdfs dfs -cat output/\*
下一步,构建Hive。
从存档中下载Hive 0.12.0的源代码。(https://archive.apache.org/dist/hive/hive-0.12.0/)
获取用于在MSYS中构建Hive 0.12.0的补丁(https://raw.githubusercontent.com/qtwi/msys-hadoop-0.23.11/master/patch/hive-0.12.0-src-mingw-0002r.patch),然后应用该补丁。
cd hive-0.12.0/src
patch -u -p1 < .../hive-0.12.0-src-mingw-0002r.patch
使用ant构建Hive 0.12.0。
ant clean package
Hive 0.12.0的原版是在默认的Hadoop1上进行构建的,但通过补丁,可以在Hadoop 0.23.11上进行构建。要在Hadoop 2.6.0上进行构建,需按照以下方式操作。
ant clean package -Dhadoop.version=2.6.0 -Dhadoop-0.23.version=2.6.0 -Dhadoop.mr.rev=23
将构建结果复制到适当的文件夹中,它位于build/dist中。
在配置文件 conf/hive-env.sh 和 conf/hive-site.xml 中进行设置。
在本地模式下设置时,需要注意在 hive-site.xml 中设置的 hive.metastore.warehouse.dir 。它必须是以斜杠(“/”)开头的以斜杠(“/”)分割的Windows完整路径。务必不要忘记开头的斜杠(“/”)。例如,
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/c:/apps/hive-0.12.0/data/user/hive/warehouse</value>
</property>
如果处于单节点模式,上述内容不需要特别关注或设置,但现在需要在HDFS上创建 “/user/hive/warehouse” 文件夹和 /tmp。
# hadoop
bin/hdfs dfs -mkdir -p //user/hive/warehouse
bin/hdfs dfs -mkdir //tmp
如果使用Hadoop 0.23.11版本,可以在不启动YARN的情况下使用Hive。但是,如果使用Hadoop 2.6.0版本,则需要同时启动YARN。(Hadoop 2.6.0版本需要在具备管理员权限的Windows命令提示符窗口中启动HDFS和YARN)
# hadoop 2.6.0
start bin\yarn resourcemanager
start bin\yarn nodemanager
如果在hive-site.xml中准确地指定存储元数据的文件夹,在使用SparkQL从Spark中进行设置时,就会变得更加简便。(可以从Spark中加载hive的数据并在Spark中处理,或者使用类似HiveQL的SparkQL进行处理)
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=c:/apache/hive-0.12.0/data/metastore_db;create=true</value>
</property>
将示例数据存放在HDFS上,然后通过Hive命令行验证其功能。
# hadoop
bin/hdfs dfs -put ../hive-0.12.0/examples/files/flights_tiny.txt
# hive
bin/hive --service cli
hive> create table flight (departure string, arrive string, year int, month int, day int, delay float, number int);
hive> load data inpath 'flights_tiny.txt' into table flight;
hive> select count(*) from flight;
请尝试运行非命令行界面的hwi或hiveserver等服务,请确保它们能够正常工作。
如果要使用hive-ruby-scripting,则需要构建hive-ruby-scripting并将jar文件复制到hive的lib文件夹中,还需要下载JRuby 1.7.4(http://jruby.org/files/downloads/1.7.4/)并将jruby.jar也复制到lib文件夹中,这样就可以方便地使用了。
git clone https://github.com/gree/hive-ruby-scripting
mvn clean package
cp hive-ruby-scripting.jar /c/apache/hive-0.12.0/lib
curl -LO https://s3.amazonaws.com/jruby.org/downloads/1.7.4/jruby-bin-1.7.4.tar.gz
tar xzf jruby-bin-1.7.4.tar.gz
cp jruby-1.7.4/lib/jruby.jar /c/apache/hive-0.12.0/lib
最后,构建Apache Spark。
下载Spark 1.2.0的源代码。(https://archive.apache.org/dist/spark/spark-1.2.0/spark-1.2.0.tgz)
由于Spark将直接在构建的文件夹中使用,所以最好将其解压到已复制Hadoop或Hive二进制文件的文件夹中。
获取适用于MSYS的Spark 1.2.0补丁(https://raw.githubusercontent.com/qtwi/msys-hadoop-0.23.11/master/patch/spark-1.2.0-mingw-0002r.patch),并应用该补丁。
cd spark-1.2.0
patch -u -p1 < .../spark-1.2.0-mingw-0002r.patch
Spark 使用 Maven 进行构建时,可以添加稍长的选项。
export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"
mvn package -DskipTests -Phadoop-0.23 -Dhadoop.version=0.23.11 \
-Pyarn-alpha -Phive -Phive-0.12.0 -Phive-thriftserver
要构建针对Hadoop 2.6.0的版本,请按照以下方式进行操作。
mvm package -DskipTests -Phadoop-2.4 -Dhadoop.version=2.6.0 \
-Pyarn -Phive -Phive-0.12.0 -Phive-thriftserver
在笔记本电脑上进行构建大约需要30分钟完成。
将HADOOP_HOME和HADOOP_CONF_DIR写入conf/spark-env.sh文件中进行设置。要在SparkQL中读取Hive数据库,需要设置HIVE_CONF_DIR,同时在Spark的conf文件夹中创建hive-site.xml,并将Spark的conf文件夹设置为HIVE_CONF_DIR。
export HADOOP_HOME=`cd $SPARK_HOME/../hadoop-0.23.11; pwd`
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"$HADOOP_HOME/etc/hadoop"}
export HIVE_CONF_DIR=$SPARK_HOME/conf
然后,在spark-shell上进行操作确认。
# Spark
bin/spark-shell
scala> val tf = sc.textFile("README.md")
scala> tf.count()
scala> val qc = new org.apache.spark.sql.hive.HiveContext(sc)
scala> qc.sql("SELECT COUNT(*) FROM flight").collect().foreach(println)
概述
搭建一个集群,若不使用,则无法期望到Hadoop的本质使用方式和性能。然而,如果你只是纯粹地享受HiveQL或Hive的UDF开发,或者使用Spark,那么并不一定需要像Hadoop那样重重复复,即使在单机Windows上使用,也有一些相当实用的方法。(要严肃地搭建一个Hadoop集群,可以考虑使用Hadoop 2.6.0进行记录。)
我认为在使用Windows作为主操作系统的情况下,许多人也会安装msysGit来使用Git,同时不使用Cygwin可以更加轻松地使用Hive和Spark。