【Hadoop】
首先搭建Hadoop平台,这里我选择的版本是2.6.4,具体部署步骤我参考了这一篇博客。
但是其中的配置文件有所更改:
G:\Spark\hadoop\hadoop-2.6.4\hadoop-2.6.4\etc\hadoop\core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/hadoop/data/tmp</value>
</property>
</configuration>
G:\Spark\hadoop\hadoop-2.6.4\hadoop-2.6.4\etc\hadoop\mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
G:\Spark\hadoop\hadoop-2.6.4\hadoop-2.6.4\etc\hadoop\hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>file:/hadoop/data/snn</value>
</property>
<property>
<name>fs.checkpoint.edits.dir</name>
<value>file:/hadoop/data/snn</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/hadoop/data/datanode</value>
</property>
</configuration>
如果遇到启动datanode时候java.io.IOException: All specified directories are failed to load.
将G:\hadoop\data\datanode\current\VERSION中的clusterID更改成G:\hadoop\data\namenode\current\VERSION中的一致,重新启动即可。
【Scala】
这里我选择的是2.11.8版本
【Spark】
Spark我选择了2.1.0版本
由于以Kafka传过来的数据作为输入源,我这里参考了这一篇文章的方法,修改了conf/spark-env.sh中的内容,具体如下
export SPARK_DIST_CLASSPATH=$(G:\Spark\hadoop\hadoop-2.6.4\hadoop-2.6.4\bin classpath):G:\Spark\Spark\spark-2.1.0-bin-hadoop2\spark-2.1.0-bin-hadoop2.6\jars\kafka\*:G:\Spark\Spark\spark-2.1.0-bin-hadoop2\spark-2.1.0-bin-hadoop2.6\examples\jars\*:G:\Spark\KafkaLib\libs\*:G:\Kafka\kafka_2.11-1.0\libs\*
下载对应的Spark-kafka jar文件下载地址为这里,我选择下载了spark-streaming-kafka-0-8-assembly_2.11-2.1.0.jar,放在spark/jar文件夹下,通过压缩软件可以打开查看里面有kafka文件夹,并有该类。
将G:\Spark\Spark\spark-2.1.0-bin-hadoop2\spark-2.1.0-bin-hadoop2.6\python\pyspark文件夹拷贝至python库文件夹内。
至此所有spark方面的准备工作做完。
【Kafka】
本次尝试的是单机模式,即Kafka,Spark,Hadoop安装在同一台机器上。
这里Kafka选择是基于Scala2.11的kafka_2.11-1.0,zookeeper选择的是3.4.12。
开启服务并且创建topic ‘test’
准备工作完成
首先开启所有hadoop功能,接着开启kafka服务
接着参考这一篇,编写wordcount.py
from __future__ import print_function
import sys
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: kafka_wordcount.py <zk> <topic>", file=sys.stderr)
exit(-1)
sc = SparkContext(appName="PythonStreamingKafkaWordCount")
ssc = StreamingContext(sc, 1)
zkQuorum, topic = sys.argv[1:]
kvs = KafkaUtils.createStream(ssc, zkQuorum, "spark-streaming-consumer", {topic: 1})
lines = kvs.map(lambda x: x[1])
counts = lines.flatMap(lambda line: line.split(" ")) \
.map(lambda word: (word, 1)) \
.reduceByKey(lambda a, b: a+b)
counts.pprint()
ssc.start()
ssc.awaitTermination()
之后执行python wordcount.py localhost:2181 test,可以看见每一秒的kafka传过来的数据。