一、spark加载hadoop本地库的时候出现不能加载的情况,这是什么原因导致的呢? 我64位机器,当时hadoop启动的时候出现不能加载本地类库的这个问题是因为hadoop本身自带的本地库是32位的,编译完hadoop源码后我替换了hadoop-3.0.0本地库为64位的。
** 解决办法–spark加载hadoop本地库的时候出现不能加载的情况。 vim /etc/profile export LD_LIBRARY_PATH=/data/software/hadoop-3.0/lib/native/:$LD_LIBRARY_PATH source /etc/profile 你是用的spark on yarn吗,如果是的话,仅在客户端设置这些动态库是不行的,需要这样设置:
spark-submit –master yarn-cluster –class … –conf spark.driver.extraJavaOptions=”-Djava.library.path=/data/software/hadoop-3.0/lib/native/:$LD_LIBRARY_PATH” …
注意,每个hadoop结点上必须存在/data/software/hadoop-3.0/lib/native/**
二、集群添加Federation后,fsck只能delete操作,其他move、blocks等操作失败。
** http://192.168.8.17:50070/fsck?ugi=hdfs&path=路径&move=1 需要用“-D fs.defaultFS=”指定具体操作的namespace,比如: bin/hdfs fsck -D fs.defaultFS=hdfs://namenodes /tmp/logs/ -delete**
三、 spark on yarn 方式运行 spark需要启动步骤吗?是不是配置了HADOOP_CONF_DIR就直接可用了?网上看了一些关于spark on yarn方式的集群搭建,都是安装过scala和hadoop后,配置spark集群的slaves,然后再启动,worker不应该是yarn自动分配的吗?
只需要配置HADOOP_CONF_DIR,hadoop处于启动状态,就可以用。 你提到了的slaves等等是standalone模式下启动的组件,在spark on yarn中,正如你说的,worker/executor是yarn自动分配和启动的。
四、上一课课件中代码,计算pi那个, val count = sc.parallelize(1 to n, slices).map { i => val x = random * 2 -‐ 1 val y = random * 2 -‐ 1 if (xx + yy < 1) 1 else 0 }.reduce(_ + _) 对这里的map 语法为什么要用 {} ,而不是()不理解。老师能给解释下吗? 好像换成()就不能运行了!!!
不可以的,不符合scala语法,在scala里面: i => val x = random * 2 - 1 val y = random * 2 - 1 if (xx + yy < 1) 1 else 0 是一个partial function,必须用{}包起来,所以必须是: {i => val x = random * 2 - 1 val y = random * 2 - 1 if (xx + yy < 1) 1 else 0 } 因为需要这么写: map({ i => val x = random * 2 - 1 val y = random * 2 - 1 if (xx + yy < 1) 1 else 0 })
而此处,()可以省略(简写),所以可以写成: map {i => val x = random * 2 - 1 val y = random * 2 - 1 if (xx + yy < 1) 1 else 0 }**
五、董老师,再问你一个纠结我很久的问题,就是配置hue用mr可以前端打印实时日志,但是改成saprk就不能前端打印日志了,请问能指导下吗?
** spark在各个task上产生日志,需要启动spark history server便可以查看日志。**
六、task序列化的目的是什么?
因为task的调度是在driver端做的,执行是在executor端执行,driver需要把task通过网络传输到executor端,task是一个(java、scala)对象,对象不能通过网络传输,必须转化为字节流,再从网络传输;把一个对象转换为字节流的过程就是序列化。executor收到task序列化的字节流之后,它再把task还原成一个对象就是反序列化。