我正在使用CDH4,我正在尝试使用JOCL从映射器类的cleanup()方法访问GPU。(注意:我的普通代码(没有mapreduce)在GPU上工作正常)。
当我执行我的map-reduce代码时,它会抛出一个错误(下面指定)。
attempt_201309171647_0021_m_000000_1: No protocol specified
attempt_201309171647_0021_m_000000_1: No protocol specified
13/09/20 18:03:01 INFO mapred.JobClient: Task Id : attempt_201309171647_0021_m_000000_2, Status : FAILED
org.jocl.CLException: CL_DEVICE_NOT_FOUND
at org.jocl.CL.checkResult(CL.java:569)
at org.jocl.CL.clGetDeviceIDs(CL.java:2239)
at com.testMR.jocl.WordCountMapper.cleanup(WordCountMapper.java:106)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:142)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:672)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330)
at org.apache.hadoop.mapred.Child$4.run(Child.java:268)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
at org.apache.hadoop.mapred.Child.main(Child.java:262)
******************************************************************************
每个映射任务都会引发错误"未指定协议"。 这是什么意思?映射器类中使用的协议是什么?
问候
操作系统的图形设备有问题。
我们解决了:-)
我们遇到的问题是在Hadoop上运行的AMD OpenCL代码。MapReduce代码无法访问GPU卡。它需要 X-server 提供的 GUI 服务来使用 GPU 计算资源。
据我了解,AMD OpenCL代码(适用于root以外的用户)无法在没有访问X服务器的情况下运行(http://en.wikipedia.org/wiki/X_Window_System)
根据这个线程 http://devgurus.amd.com/thread/160838 AMD正在努力让OpenCL在没有X服务器的情况下工作。
我发现的让OpenCL代码在Hadoop上运行的解决方案改编自这个线程 http://devgurus.amd.com/message/1284840,它建议了在没有GUI的情况下通过ssh登录运行OpenCL代码的步骤。
以下是我遵循的步骤:
- 使用 'chsh lightdm'
命令编辑 'lightdm' 用户的 shell,并将其设置为/bin/bash
$sudo chsh lightdm
当它提示时,键入:/bin/bash
打开/etc/rc.local 并在"exit 0"之前添加以下行。
su -l lightdm -c "sleep 30 ; export DISPLAY=:0 ; xhost +local:"
创建一个文件/etc/profile.d/compute.sh并在其中添加以下内容(并执行 'chmod 755/etc/profile.d/compute.sh' ):
#!/bin/sh export COMPUTE=:0 #export DISPLAY=:0 #export GPU_MAX_ALLOC_PRCENT=100 #export GPU_MAX_HEAP_SIZE=100 if [ ! -z "$DISPLAY" ]; then xhost +local: fi
上面注释掉的条目用于测试其他内容,如果此设置不起作用,但对我们来说它有效
为上述脚本授予权限
$sudo chmod 755 /etc/profile.d/compute.sh
如果一个人从lightdm登录/注销,X安装程序会重置,因此以下内容被添加到/etc/lightdm/lightdm.conf中
greeter-show-manual-login=true greeter-setup-script=/etc/profile.d/compute.sh session-setup-script=/etc/profile.d/compute.sh
重新启动系统,以便为所有用户(包括mapred)设置环境变量,现在我们可以从Hadoop运行OpenCL代码