董西城问答整理:第三课

来源:互联网 发布:视频剪辑用什么软件 编辑:程序博客网 时间:2024/05/01 17:22

一、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 (x*x + y*y < 1) 1 else 0
}.reduce(_ + _)
对这里的map 语法为什么要用 {} ,而不是()不理解。老师能给解释下吗?
好像换成()就不能运行了!!!
不可以的,不符合scala语法,在scala里面:
i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
是一个partial function,必须用{}包起来,所以必须是:
{i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
}
因为需要这么写:
map({ i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 1) 1 else 0
})

而此处,()可以省略(简写),所以可以写成:
map {i =>
val x = random * 2 - 1
val y = random * 2 - 1
if (x*x + y*y < 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还原成一个对象就是反序列化。

0 0