この素晴らしい時代に、技術者として Spark の名前すら知らないというのは明らかに不当であり、ビッグデータを語るとき、Hadoop と Spark は欠かせません。私はかなり前から Spark をフォローしていますが、今回は最新の Hadoop 実験用クラスターを使用して、Spark の栄枯盛衰を体験してきました。
環境情報:
セントス 6.7 64 ビット
Hadoop-2.7.2(QJM あり)
スパーク-1.6.1
スカラ2.10.5
スタンドアロンモード を使用しています。hadoop-2.7.2 がインストールされており、LZO 圧縮をサポートしています。Hive-1.2.1 は正常に実行されています。Spark と hadoop は両方とも同じユーザーおよびユーザー グループ (hadoop:hadoop) で実行されています。HADOOP_HOME= / home/hadoop/hadoop-2.7.2、Spark と Hadoop の混合デプロイメント、Hadoop を使用してすべてのノードに Spark をデプロイします。
直接ダウンロード: http://www.apache.org/dyn/closer.lua/spark/spark-1.6.1/spark-1.6.1-bin-without-hadoop.tgz、解凍して次の変更を加えて Spark を試してくださいが走っています。
(1)spark-env.shファイルの内容を変更する
#SYSTEM
JAVA_HOME=/usr/local/jdk
SCALA_HOME=/usr/local/scala
HADOOP_HOME=/home/hadoop/hadoop-2.7.2
HADOOP_CONF_DIR=/home/hadoop/hadoop-2.7.2/etc/hadoop
SPARK_DIST_CLASSPATH=$(/home/hadoop/hadoop-2.7.2/bin/hadoop classpath)
#SPARK_DIST_CLASSPATH=$(hadoop --config /home/hadoop/hadoop-2.7.2/etc/hadoop classpath)
#export SPARK_DIST_CLASSPATH="$SPARK_DIST_CLASSPATH:/home/hadoop/hadoop-2.7.2/share/hadoop/tools/lib/*"
#spark
SPARK_HOME=/home/hadoop/spark
SPARK_MASTER_IP=lrts5
SPARK_WORKER_CORES=4
SPARK_WORKER_INSTANCES=1
SPARK_WORKER_MEMORY=4g
SPARK_EXECUTOR_CORES=1
SPARK_EXECUTOR_MEMORY=1g
#spark
SPARK_WORKER_DIR=/home/hadoop/spark/work
SPARK_LOG_DIR=/home/hadoop/spark/logs
SPARK_PID_DIR=/home/hadoop/spark/pid
#LZO
export SPARK_CLASSPATH=/home/hadoop/hadoop-2.7.2/share/hadoop/common/hadoop-lzo-0.4.20-SNAPSHOT.jar
export SPARK_CLASSPATH=$SPARK_CLASSPATH:$CLASSPATH
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$HADOOP_HOME/lib/native
export HADOOP_CONF_DIR=/home/hadoop/hadoop-2.7.2/etc/hadoop
(2) スレーブファイルの内容を変更する
lrts5
lrts6
lrts7
lrts8
(3) Hadoopのhdfs-site.xmlファイルとcore-site.xmlファイルをspark/confディレクトリにコピーします。
(4) 以下の内容をspark-defaults.confファイルに追加します。
spark.files file:///home/hadoop/spark/conf/hdfs-site.xml,file:///home/hadoop/spark/conf/core-site.xml
これを追加しない場合、次のような問題が発生します。
java.lang.IllegalArgumentException: java.net.UnknownHostException: org.apache.hadoop.security.SecurityUtil.buildTokenService(SecurityUtil.java:418)のmycluster
org.apache.hadoop.hdfs.NameNodeProxies.createNonHAProxy(NameNodeProxies.java:231) )
org.apache.hadoop.hdfs.NameNodeProxies.createProxy(NameNodeProxies.java:139)
org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:510)
org.apache.hadoop.hdfs で。 DFSClient.<init>(DFSClient.java:453)
org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:136)
at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2433)
org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88) で
org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467)
で org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449)
で org.apache.hadoop.fs .FileSystem.get(FileSystem.java:367)
で org.apache.hadoop.fs.Path.getFileSystem(Path.java:287)
で org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:221)
でorg.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:270)
org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:172)
org.apache.spark.rdd.RDD
(5) HDFS上のlzoファイルを読み込み、スライス単位で実行する
import org.apache.hadoop.io._
import com.hadoop.mapreduce._
val data = sc.newAPIHadoopFile[LongWritable, Text, LzoTextInputFormat]("hdfs://mycluster/user/hive/warehouse/logs_app_nginx/logdate=20160322/loghost=70/var.log.nginx.access_20160322.log.70.lzo")
data.count()
(6) HDFS のワイルドカード文字で表されるディレクトリおよびサブディレクトリ内のファイルを読み取り、スライスで実行します。
import org.apache.hadoop.io._
import com.hadoop.mapreduce._
val dirdata = sc.newAPIHadoopFile[LongWritable, Text, LzoTextInputFormat]("hdfs://mycluster/user/hive/warehouse/logs_app_nginx/logdate=20160322/loghost=*/")
dirdata.count()
参考: