小宝宝的spark之路

原创
2017/03/02 00:32
阅读数 121

版本

软件 版本
java 1.8.0_45
scala 2.11.4
Zookeeper 3.4.9
Hadoop 2.7.3
Spark spark-2.1.0-bin-hadoop2.7
vm centos7-x86_64

常用命令

# 查看后台进程
jps

# hadoop namenode格式化
hadoop namenode -format

# 启动hadoop,注意要到hadoop目录下执行
./start-dfs.sh
./start-yarn.sh

# 停止hadoop,注意要到hadoop目录下执行
./stop-dfs.sh
./stop-yarn.sh

# 查看DataNode信息
hdfs dfsadmin -report 

# 在hdfs上创建目录tmp
hadoop fs -mkdir /tmp
# 提交当前目录下的1.txt到hdfs到/tmp目录下,并命令为1.txt
hadoop fs -put 1.txt /tmp/1.txt
# 在hdfs上查看/tmp目录下的文件 
hadoop fs -ls /tmp
# 在hadoop上运行jar包中的wordcount程序,并指定输入文件和输出结果位置
hadoop jar /opt/hadoop-mapreduce-examples-2.7.1.jar wordcount /tmp/1.txt /tmp/1_out
# 在hdfs上查看文件内容,(cat命令:将文件内容打印出来)
hadoop fs -cat /tmp/1_out/part-r-00000

# 启动spark,注意到spark目录下执行 
./start-master.sh 
./start-slaves.sh

# 停止spark,注意到spark目录下执行
./stop-master.sh    
./stop-slaves.sh

代码示例

wordcount

TODO 代办:以下用spark的三种方式来做代码示例

def main(args: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("WordCount").setMaster("spark://master:7077")
            .set("spark.submit.deployMode","cluster") // 以集群方式运行
        val sc = new SparkContext(conf)
        // 下面的这个jar是当前项目打包的jar包,可以用maven新建项目并打包jar,这个jar地址是所在的开发环境下的地址。
        sc.addJar("~/sparkdemo/target/sparkdemo-0.1.jar")
        //the hadoop conf: core-site.xml hdfs address
        val line = sc.textFile("hdfs://master:9000/tmp/1.txt")
        val result = line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).collect()
        result.foreach(println)
        sc.stop()
    }


常见问题

  1. hdfs dfsadmin -report 结果livenode==0

如果出错(livenode==0)的话,一般是防火墙,ip,端口号等问题。宿主机和虚拟机需要达到互相ping通,所有端口都不能错。另外在hostname中注释掉maser 127.0.0.1。
如果livenode==0而且在http://master:8080 web管理页面中进度始终为0,那么基本可以断定为宿主机和虚拟机的网络问题,即防火墙,ip,端口号或ssh的问题,宿主机和虚拟机也要达到互相ping通的效果。

  1. file not exists

如果提交任务到spark集群上,但是找hdfs上的文件找不到,在集群中运行 hadoop fs -ls 目录,检查是否真实存在,如果存在,那么就是设置的hdfs地址有误,那么可以检查一下虚拟机中hadoop中conf目录里core-site.xml中的hdfs address地址配置,另外注意端口号也不能错。

  1. hadoop集群启动正常,但是spark集群中只有一个worker

是否已经执行 ./start-master.sh ./start-slaves.sh,注意目录还有一个脚本为start-slave.sh,用于单独启动指定的slave,不要输错了。

  1. 讲道理应该对的操作,但是执行失败

将hadoop生成的文件,即 hadoop namenode -format生成的文件删除,并停止所有spark,hadoop,重新格式化,再启动,其中格式化的目录设置在:hadoop的conf目录下的hdfs-site.xml 文件中dfs.datanode.data.dir和dfs.namenode.name.dir属性设置的目录。
或将设置中的虚拟机名字换成ip,虚拟机名字可以直接输入 hostname 查看。

  1. 在webUI中查看信息时,连接都是虚拟机名字+端口号的方式,需要手动换成ip,十分不方便

可以在宿主机中/etc/hosts 中添加虚拟机名字和ip的映射。

  1. mac中端口被关闭,无法通信

/etc/pf.anchors/com.pow文件添加(换成自己需要的端口,并在最后留空行):
rdr pass on lo0 inet proto tcp from any to any port 80 -> 127.0.0.1 port 20559
在/etc/pf.conf中添加以下两句:
rdr-anchor "com.apple/*"后添加: rdr-anchor "pow"
load anchor "com.apple" from "/etc/pf.anchors/com.apple 后添加: load anchor "pow" from "/etc/pf.anchors/com.pow"
最后再留空行
使更改生效: sudo pfctl -f /etc/pf.conf
启用: sudo pfctl -e
如要关闭: sudo pfctl -d

  1. Hadoop2.x Permission denied: user=dr.who, access=READ_EXECUTE inode="/tmp"

$HADOOP_HOME/bin/hdfs dfs -chmod -R 755 /tmp #chmod要有-

  1. 如何在webUI中查看driver.host信息

查看spark 环境信息(包括dirver.host):http://虚拟机IP:4040/environment/

  1. 在idea中运行报错:cannot assign instance of scala.collection.immutable.List$SerializationProxy to field org.apache.spa

// 将该项目打包,并上传到sc中
spark.sparkContext.addJar("/home/workspaces/<project-name>/target/<project-name>.jar")

建议

  1. 当宿主机的内存不够时,可以尝试关闭虚拟机的图形化桌面。TODO 具体方法代办
  2. 建议使用centos来做虚拟机,现在总有一种centos比ubuntu稳定的感觉。
  3. 当宿主机内存不够时,可以使用docker技术来搭建集群。TODO具体方法代办

参考

hadoop集群搭建
spark on Yarn集群安装
mac中开放端口 idea 搭建spark开发环境
windows上搭建spark开发环境
在windows上使用eclipse提交spark任务到spark平台上
spark on Yarn集群搭建
spark on Yarn集群搭建
spark-shell从hdfs上读取文件运行wordcount

展开阅读全文
打赏
2
4 收藏
分享
加载中
更多评论
打赏
0 评论
4 收藏
2
分享
返回顶部
顶部