十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
首先以一个简单的示例开始:用Spark Streaming对从TCP连接中接收的文本进行单词计数。
10年积累的成都网站设计、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有桃源免费网站建设让你可以放心的选择与我们合作。
/**
* 功能:用spark streaming实现的针对流式数据进行单词计数的程序。
* 该程序只是对数据流中的每一批数据进行单独的计数,而没有进行增量计数。
* 环境:spark 1.6.1, scala 2.10.4
*/
// 引入相关类库
import org.apache.spark._
import org.apache.spark.streaming._
object NetworkWordCount {
def main(args: Array[String]) {
// Spark Streaming程序以StreamingContext为起点,其内部维持了一个SparkContext的实例。
// 这里我们创建一个带有两个本地线程的StreamingContext,并设置批处理间隔为1秒。
val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))
// 在一个Spark应用中默认只允许有一个SparkContext,默认地spark-shell已经为我们创建好了
// SparkContext,名为sc。因此在spark-shell中应该以下述方式创建StreamingContext,以
// 避免创建再次创建SparkContext而引起错误:
// val ssc = new StreamingContext(sc, Seconds(1))
// 创建一个从TCP连接获取流数据的DStream,其每条记录是一行文本
val lines = ssc.socketTextStream("localhost", 9999)
// 对DStream进行转换,最终得到计算结果
val res = lines.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
// 打印该DStream中每个RDD中的前十个元素
res.print()
// 执行完上面代码,Spark Streaming并没有真正开始处理数据,而只是记录需在数据上执行的操作。
// 当我们设置好所有需要在数据上执行的操作以后,我们就可以开始真正地处理数据了。如下:
ssc.start() // 开始计算
ssc.awaitTermination() // 等待计算终止
}
}
为了测试程序,我们得有TCP数据源作为输入,这可以使用Netcat(一般linux系统中都有,如果是windows系统,则推荐你使用 Ncat ,Ncat是一个改进版的Netcat)。如下使用Netcat监听指定本地端口:
nc -lk 9999
如果是使用Ncat,则对应命令如下:
ncat -lk 9999
在IntelliJ IDEA或Eclipse中可以本地运行测试上述Spark Streaming程序,该程序会连接到Netcat(或Ncat)监听的端口,你可以在运行Netcat(或Ncat)的终端中输入东东并回车,然后就可以看到该Spark Streaming程序会马上输出处理结果,并且这个处理是不停的、流式的。
注意:上述示例只是对数据流中的每一批数据进行单独的计数,而没有进行增量计数。
老规矩,先说结论:
或者:
注意:由于 macOS 版 Ncat 的 7.90 和 7.91 版本的 bug,上述方式不再生效。起码 7.91 版本在 macOS 10.15.7 上是不行的。此问题在 7.92 版本中已经解决。
具体原因参见:
但 Linux 上没问题。所以增加个 socat 的替补方案:
Scout 本身很强大,但对代理的支持这部分貌似差一些,只支持 SOCKSv4 和 HTTP Proxy,不支持 SOCKS5。详情参考 《socat 初窥门径》 。
有些时候,由于网络限制等原因,不能直接连通过 SSH 连到指定服务器,需要经过代理进行连接。例如如下场景:
其中,
client.net 不能直接访问 server.net
client.net 可以访问 proxy.net
proxy.net 可以访问 server.net
使用 SSH 的 ProxyCommand 选项,配合 nc/Ncat 命令,实现 client.net 通过代理 proxy.net ,以 SSH 访问 server.net 。
(1) nc
macOS 上常用这种方案。但是 nc 不支持需要认证的代理。
常用参数:
(2) Ncat
Ncat 在 macOS 上通过代理连接时会出现连接断开的情况。
常用参数:
以 nc 为例,如使用 Ncat 可以自行替换。
默认为 Socket5 代理,这时可以省略 -X 参数
或者采用另一种写法:
SSH 配置文件位置:
增加如下两行内容:以 nc 为例,如使用 Ncat 可以自行替换。
使用配置文件之后,就不需要在命令行中进行代理配置了。
对于大部分情况,都可以直接使用 nc 或者 Ncat 解决。但对于一些复杂情况,也可以通过其它方案完成。如在 macOS 上想通过需要认证的代理连接,用 nc 不支持代理认证, Ncat 又有些问题。
对于代理类型的问题,可以通过 Brook 来进行类型转换。
1、 corkscrew
只支持 HTTP 代理
如需要访问带认证的代理服务器:
~/.ssh/myauth 的内容:
2、 proxytunnel
只支持 HTTP 代理
命令行里只填用户名,会提示输入密码,或者通过环境变量传入。
(完)
nc是netcat的简写,有着网络界的瑞士军刀美誉。因为它短小精悍、功能实用,被设计为一个简单、可靠的网络工具。比如大家很熟悉使用telnet测试tcp端口,而nc可以支持测试linux的tcp和udp端口,而且也经常被用于端口扫描,甚至把nc作为server以TCP或UDP方式侦听指定端口做简单的模拟测试。
2020年10月07日 - 初稿
阅读原文 -
ncat 或者说 nc 是一款功能类似 cat 的工具,但是是用于网络的。它是一款拥有多种功能的 CLI 工具,可以用来在网络上读、写以及重定向数据。 它被设计成可以被脚本或其他程序调用的可靠的后端工具。同时由于它能创建任意所需的连接,因此也是一个很好的网络调试工具。
ncat / nc 既是一个端口扫描工具,也是一款安全工具,还能是一款监测工具,甚至可以做为一个简单的 TCP 代理。 由于有这么多的功能,它被誉为是网络界的瑞士军刀。 这是每个系统管理员都应该知道并且掌握它。
在大多数 Debian 发行版中, nc 是默认可用的,它会在安装系统的过程中自动被安装。 但是在 CentOS 7 / RHEL 7 的最小化安装中, nc 并不会默认被安装。 你需要用下列命令手工安装。
nc的作用:
nc的控制参数不少,常用的几个参数如下所列:
用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接。
暂未用到(老版本的nc可能需要在端口号前加-p参数)
指定发送数据的源IP地址,适用于多网卡机
指定nc使用UDP协议,默认为TCP
输出交互或出错信息,新手调试时尤为有用
6)-w
超时秒数,后面跟数字
7)-z
表示zero,表示扫描时不发送任何数据
作用:批量端口扫描,可根据扫描主机的配置调整后台扫描进程数量(手动执行后根据统计的执行时间调整脚本中关于进程数量的参数),通过定时任务作为简单的服务监控(可修改脚本添加其他报警功能,例如邮件等)
实现:使用nc指令扫描端口,使用管道特性控制后台扫描进程数量
不足:仅仅对扫描端口状态为down的信息做记录,并没有其他报警操作
使用:
10 useful ncat (nc) Command Examples for Linux Systems
nc命令用法举例
我们在检测远程服务是否正常时,经常会用一些工具(命令)来检测端口是否开启,来确定服务是否正常。通常可用于检测的工具有nc、socat、nmap等,基本思想是向远端指定端口发送数据,看其状态。
远端:192.168.0.15
本端:192.168.0.10
单向检测(适用于无法登录远端服务查看的情况)
如果返回succeeded,则说明相应的UDP端口访问正常。
如果无任何返回信息,则说明相应的UDP端口访问失败。
nc -uvz $IP $Port. //UDP
nc -vz $IP $Port //TCP
远端不监听1777端口情况
# nc -uvz 192.168.0.15 1777
#
远端监听1777端口
# nc -ul 1777
XXXXX
# nc -uvz 192.168.0.15 1777
Connection to 192.168.0.15 1777 port [udp/powerguardian] succeeded!
如果succeeded,则无任何返回,如果failed则返回Connection refused。
echo "This socat udp test." | socat - udp-connect:$IP:$Port
远端不监听1777端口,本端发送udp数据至远端指定端口。
# echo "This socat udp test." | socat - udp-connect:192.168.0.15:1777
2017/06/18 14:26:39 socat[22195] E read(3, 0xb48a20, 8192): Connection refused
远端开启监听,本端再次发送。
# nc -ul 1777
This socat udp test.
# echo "This socat udp test." | socat - udp-connect:192.168.0.15:1777
#
用指定协议扫描远端指定端口
nmap -sU -p $Port $IP
# nmap -sU -p 1777 192.168.0.15
Starting Nmap 5.51 ( ) at 2017-06-18 14:35 CST
Nmap scan report for host-192-168-0-15 (192.168.0.15)
Host is up (0.00098s latency).
PORT STATE SERVICE
1777/udp closed unknown
MAC Address: FA:16:3E:1A:54:30 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
可以通过传输文本及文件来测试UDP端口是否正常(先开监听,再发送)
远端:nc -ul $Port
本端: nc -u $IP $Port
在本端键入任意字符,看远端是否可以收到。
远端:nc -l $Port $Filename
本端:nc $IP $Port $Filename
可以执行md5sum看两端的文件md5是否相同
注:如果是检测tcp协议端口,上述nc命令中,去掉参数-u即可。另外,也可以使用telnet $IP $Port来完成
$ nc -vzw 2 180.76.148.122 22-81 //显示详细信息,包含失败的
$ nc -zw 2 180.76.148.122 22-81 //不显示详细信息,只包含成功的,如果检测udp端口,可用"vzw"参数,"z"参数表示连接成功后立即关闭连接
Connection to 180.76.148.122 port 22 [tcp/ssh] succeeded!
Connection to 180.76.148.122 port 80 [tcp/http] succeeded!
附全面的ncat使用方法: