本人觉得在spark里使用scala与python两种优秀的编程语言进行编程实现逻辑是件非常酷的事情,于是就实验了各种可行性,Jep算是最出众的工具,可惜由于python的不兼容问题...
这是蛮久之前的实验了,,未成功,也没时间继续,,所以本篇文章只是作为记录,,后续有时间再跟近,,
\
顺便说一下python问题解决思路,因为系统版本是py-2.6, spark需要py-2.7+,,而系统版本不可卸载,装了好几回也记不清都装了什么了,,每次都会调用底版本 即非已经设置为默认版本的python,,,,,,可用多版本管理软件试试切换,,
\
下面是问题与当时的一些参考解决方案:
\
scala> val ii = "import numpy as np"
ii: String = import numpy as np
scala> jep.eval(ii)
jep.JepException: <type 'exceptions.ImportError'>:
Importing the multiarray numpy extension module failed. Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control). Otherwise reinstall numpy.
Original error was: /usr/local/lib/python2.7/dist-packages/numpy/core/multiarray.so: undefined symbol: _Py_ZeroStruct
at /usr/local/lib/python2.7/dist-packages/numpy/core/__init__.<module>(__init__.py:26)
at /usr/local/lib/python2.7/dist-packages/numpy/lib/type_check.<module>(type_check.py:11)
at /usr/local/lib/python2.7/dist-packages/numpy/lib/__init__.<module>(__init__.py:8)
at /usr/local/lib/python2.7/dist-packages/numpy/add_newdocs.<module>(add_newdocs.py:13)
at /usr/local/lib/python2.7/dist-packages/numpy/__init__.<module>(__init__.py:142)
at jep.Jep.eval(Native Method)
at jep.Jep.eval(Jep.java:609)
... 48 elided
一般碰到这种情况,我都会劝人用 Anaconda,省时又省力。
而且楼主要用 NumPy 和 Pandas,就更适合用 Anaconda 了。
################3
import jep._
val jep = new Jep(new JepConfig().addSharedModules("numpy"))
val f = new Array[Float](6)
val nd = new NDArray[Array[Float]](f, 3, 2)
jep.set("x", nd)
val shape = jep.getValue("x.shape")
#######################################
print('hello from python!')
def fn1(i):
return i + 1
def fn2(s):
return 'Hello, ' + s
###
import jep.Jep
object RunPython {
def main(args: Array[String]) = {
val jep = new Jep()
jep.runScript("/home/raini/functions.py")
{
val i = 1
val fn = "fn1"
val r1 = jep.invoke(fn, i.asInstanceOf[AnyRef])
println(s" $ fn( $ i) = $ r1")
}
{
val s = "world"
val fn = "fn2"
val r2 = jep.invoke(fn, s.asInstanceOf[AnyRef])
println(s""" $ fn(" $ s") = $ r2""")
}
}
}
val ii = "import numpy as np"
jep.eval(ii)
#################3 (numpy问题)
- 原因:
numpy版本问题,需要更新版本,但是根据使用的python控制组件不同解决方案不一样
- 解决方案:
如果是anconda安装的numpy以及其他类库,直接使用conda upgrade numpy即可.aconda会一起更新其它组件,如图:
第二种pip安装的numpy,可以直接pip install --upgrade numpy.也可以先卸载,再清除numpy剩下的文件
如果是其他管理工具效果推测应该是同理,但是没有测试
如果都不是,二是原生组件那建议还是先安装pip,或者换用其他管理组件,建议使用anconda
###
这是《机器学习升级版IV》中“Python基础”章节的问题。
这个错误提示是中肯的,既然多维数组本身都无法加载,说明Numpy安装没有成功。所以,建议重新删除后安装。
当然,实际中可能还存在两个问题:
1、安装的版本与系统、Python版本不兼容;
2、如果可以联网,直接安装后续库(如matplotlib),会自动下载依赖,从而无形中解决了这个问题。
(试过,无效)
##
使用pip install matplotlib成功,它自动会引入numpy的库,但运行 import matplotlib出现下面错误
(一样)
原因是需要安装numpy+mkl版本,去这个网站下载 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 对应python版本的numpy+mkl即可
pip install SomePackage-1.0-py2.py3-none-any.whl(试过,无效)
###
numpy-1.13+mkl (用conda安装numpy会自行安装好mkl)
####
How does one install/fix a failed numpy installation that works on python 3.4 but not in 3.5?
(https://stackoverflow.com/questions/42122639/how-does-one-install-fix-a-failed-numpy-installation-that-works-on-python-3-4-bu)
pip install --target=/usr/local/lib/python3.5/dist-packages --upgrade numpy
pip3 install --target=/usr/local/lib/python3.5/dist-packages numpy
python3.5 get-pip.py。这将安装PIP该版本的Python。之后,您可以运行像:python3.5 -m pip install -U numpy如果你无法链接这一新PIP你的PATH。使用sudo如果你遭遇的权限问题
又为什么pip3 install --target=/usr/local/lib/python3.5/dist-packages numpy不工作?你的答案是怎样的不同?
一
(1)在/usr/local/lib/python3.5/dist-packages你只能有Python导入模块。可能是一些“垃圾”不会打破你的安装,但它是不是一个好主意,玩。
(2)作为当前PIP3是由系统安装,你可以看到如果你可以使用apt-get来卸载它。然后通过安装点get-pip.py再次python3.5(我没试过这个)。
(3)的pip3 ...命令将下载python3.4包,然后听从您的具体要求,并把它安装在python3.5目录树
解决:
你不能在Python版本混搭。每一个版本都需要自己的副本NumPy。这是因为Python没有提供一个跨版二元的兼容性.纯Python包(没有编译的代码,因为它是NumPy的情况下)可以工作原则,但环境很难管理。分布共享.py文件的符号链接
第一件事就是去除错误的安装。我将只专注于让Python 3.5安装工作
警告继续前使用rm命令应该慎重,更加使你需要root权限的操作/usr
rm -r numpy
然后,你需要点。你可以将它安装在PyPI网页文件:https://pip.pypa.io/en/latest/installing/
cd
wget https://bootstrap.pypa.io/get-pip.py
和安装
python3.5 get-pip.py
你可以对整个计算机或只是当前用户这样做(与--user选项)。一旦管道安装,
python3.5 -m pip install -U numpy
应该做的
如果有你的Python版本和皮普开始编译的二进制包,事情没有做不到的事,安装包python3.5-dev
//#############################################
select_data1: org.apache.spark.rdd.RDD[(String, Object)] = MapPartitionsRDD[6] at mapValues at <console>:28
scala> select_data1.take(5)
[Stage 0:> (0 + 4) / 4]#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f744f1f16e0, pid=10289, tid=0x00007f744eb05700
#
# JRE version: Java(TM) SE Runtime Environment (8.0_131-b11) (build 1.8.0_131-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C [libpython3.5m.so.1.0+0xa56e0] PyObject_GetAttrString+0x0
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/raini/hs_err_pid10289.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
/home/raini/spark/bin/spark-shell: 行 44: 10289 已放弃 (核心已转储) "${SPARK_HOME}"/bin/spark-submit --class org.apache.spark.repl.Main --name "Spark shell" "$@"
(python35) raini@biyuzhe:~$ spark-shell
因为,错误本身就表明 -无法写入核心转储。核心转储已被禁用。
要启用核心转储,请ulimit -c unlimited在再次启动Java之前尝试 ulimit获取并设置用户限制。有关ulimit的更多信息,
man ulimit
所以,打开一个终端并运行 -
ulimit -c unlimited
这应该解决问题。要检查更改是否成功,请运行 -
ulimit -c -l
这应该给你一个输出如下 -
core file size (blocks, -c) unlimited
max locked memory (kbytes, -l) 64
如果问题仍然存在指这个和这个从askUbuntu。