如何用spark实现:调用外部程序或者调用动态链接库函数,对批量文件进行处理?

Myra_Maimaimai 2016-03-04 10:03:54
楼主的情况是,用自己的几台机器搭了spark standalone集群,用来做机器学习:生成可用样本、特征提取、训练、预测
第一步中,一批原始文件经某算法的处理生成一批可用样本,而某算法是用C写的(有可执行程序和so库)
那么问题来了:
(1)对于这种需求有什么解决方案吗?
(2)如果将每个文件都创建一个RDD,map时使用so库中的函数作为映射关系,可以实现吗?
谢谢!
...全文
1185 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinkSe7en 2016-09-26
  • 打赏
  • 举报
回复
引用 6 楼 qq_22717679 的回复:
[quote=引用 5 楼 link0007 的回复:] 文件名集合->文件名rdd->mapToPair(jni调用你c函数)->文件名,特征集合PairRdd 重点是你c的函数能不能访问hdfs,否则你的音频数据文件要分发到每台worker节点上的同一路径下。 或者改造能接收文件内容(即字节数组)而不是文件路径。那么流程就变为: 文件名集合->文件名rdd->mapToPair->文件名,文件内容字节数组RDD->map(jni调用你c函数)->文件名,特征集合PairRdd
对,c函数可以访问hdfs是很重要的,不过因为c函数是直接so库拿来用的,我没有再写接口让它可以访问jhdfs,而是用了很笨拙的方法:map的时候根据本节点分配到的文件名,从主节点传输对应的文件过来... 感觉这种做法十分失败,完全没有用到spark的特性,仅仅利用了rdd的分配...[/quote] 其实可以把音频文件上传到hdfs,程序运行的时候让executor拉到本地临时目录,让c去访问。你这样会把主节点的网络io占满,性能很差。最好还是能接受字节数组作为参数,或者能直接访问hdfs
LinkSe7en 2016-09-25
  • 打赏
  • 举报
回复
文件名集合->文件名rdd->mapToPair(jni调用你c函数)->文件名,特征集合PairRdd 重点是你c的函数能不能访问hdfs,否则你的音频数据文件要分发到每台worker节点上的同一路径下。 或者改造能接收文件内容(即字节数组)而不是文件路径。那么流程就变为: 文件名集合->文件名rdd->mapToPair->文件名,文件内容字节数组RDD->map(jni调用你c函数)->文件名,特征集合PairRdd
Myra_Maimaimai 2016-09-25
  • 打赏
  • 举报
回复
引用 5 楼 link0007 的回复:
文件名集合->文件名rdd->mapToPair(jni调用你c函数)->文件名,特征集合PairRdd 重点是你c的函数能不能访问hdfs,否则你的音频数据文件要分发到每台worker节点上的同一路径下。 或者改造能接收文件内容(即字节数组)而不是文件路径。那么流程就变为: 文件名集合->文件名rdd->mapToPair->文件名,文件内容字节数组RDD->map(jni调用你c函数)->文件名,特征集合PairRdd
对,c函数可以访问hdfs是很重要的,不过因为c函数是直接so库拿来用的,我没有再写接口让它可以访问jhdfs,而是用了很笨拙的方法:map的时候根据本节点分配到的文件名,从主节点传输对应的文件过来... 感觉这种做法十分失败,完全没有用到spark的特性,仅仅利用了rdd的分配...
野男孩 2016-09-24
  • 打赏
  • 举报
回复
map内的处理就是调用这个C程序,参数就是map得到的行数据,也就是文件名。等待c程序进程结束后,输出的文件数据该咋处理咋处理。 重点是这个C程序预先部署到所有work上,路径一致就好了。 没验证,按说可以。
Myra_Maimaimai 2016-09-03
  • 打赏
  • 举报
回复
引用 2 楼 someone1999 的回复:
不知道你的外部C程序的输入、输出是什么? 我现在遇到的问题和你类似,我的方法是在rdd.mapPartitions内处理
我的C程序是对一批音频文件进行特征提取,在单机上,输入是音频文件路径,输出是特征值集合(写到txt文件里)。 我的做法是读取全部的音频文件名生成rdd,而不是读取音频文件本身,rdd的单个元素就变成了单个文件名。 因为我的C程序作用于完整的音频文件,如果把文件数据用于生成rdd,不知道怎样实现想要的功能...
someone1999 2016-09-02
  • 打赏
  • 举报
回复
不知道你的外部C程序的输入、输出是什么? 我现在遇到的问题和你类似,我的方法是在rdd.mapPartitions内处理
Heart09 2016-03-04
  • 打赏
  • 举报
回复
谢邀。不过我没看懂。不会用spark。

1,269

社区成员

发帖
与我相关
我的任务
社区描述
Spark由Scala写成,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于MapReduce算法实现的分布式计算。
社区管理员
  • Spark
  • shiter
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧