【问题标题】:Loading data in Hadoop with spring xd使用 spring xd 在 Hadoop 中加载数据
【发布时间】:2014-07-14 13:41:37
【问题描述】:

我正在尝试在 HTTP 源和 HDFS 接收器之间创建一个流。我的 springXD 和 HDFS 安装在不同的机器上**,但我能够成功触发 hadoop fs ls / 命令。

创建和部署流后,当我使用以下方式发布数据时:

http post --target http://{ipaddressofhdfsmachine:8020} -- data"hello"

它正在抛出错误:

向http端点http://{ipaddressofhdfsmachine:8020}发送数据失败

当我使用localhost with port 9000 时,它成功完成,但 hdfs 中没有显示任何内容。

是否需要在同一台机器上安装 hdfs 和 spring 才能创建流?

【问题讨论】:

    标签: java spring hadoop hdfs spring-xd


    【解决方案1】:

    知道哪里出了问题有点困难,但我会尝试做出有根据的猜测。我不知道您是在运行 XD 单节点还是分布式模式,您是否更改了默认配置以及您是如何创建流的。参考文档可以从Spring XD找到

    我是我的设置,我在我的主操作系统(localhost)上运行 XD,在我的 vm(node1)上运行 HDFS。

    因为默认 hdfs 名称节点地址假定为 hdfs://localhost:8020 它需要更改。为此使用servers.yml文件并更改fsUri(注意此yaml文件格式中的空格)。

    config/servers.yml:

    # Hadoop properties
    spring:
      hadoop:
        fsUri: hdfs://node1:8020
    

    我启动 XD 单节点:

    ./xd-singlenode
    

    然后运行流命令,写一些东西并检查写了什么:

    xd:>hadoop config fs --namenode hdfs://node1:8020
    
    xd:>hadoop fs ls --recursive true --dir /xd
    lsr: `/xd': No such file or directory
    
    xd:>stream create --name test --definition "http|hdfs" --deploy
    Created and deployed new stream 'test'
    
    xd:>http post --data "hello" http://localhost:9000
    > POST (text/plain;Charset=UTF-8) http://localhost:9000 hello
    > 200 OK
    
    xd:>hadoop fs ls --recursive true --dir /xd
    drwxr-xr-x   - jvalkealahti supergroup          0 2014-07-14 21:33 /xd/test
    -rw-r--r--   3 jvalkealahti supergroup          0 2014-07-14 21:33 /xd/test/test-0.txt.tmp
    
    xd:>stream destroy --name test 
    Destroyed stream 'test'
    
    xd:>hadoop fs ls --recursive true --dir /xd
    drwxr-xr-x   - jvalkealahti supergroup          0 2014-07-14 21:33 /xd/test
    -rw-r--r--   3 jvalkealahti supergroup          6 2014-07-14 21:33 /xd/test/test-0.txt
    
    xd:>hadoop fs cat --path /xd/test/test-0.txt
    hello
    

    【讨论】:

    • 感谢 Janne 的回答。我按照您的建议做了,但得到了相同的结果。我使用 http post 成功发布了数据,但是当我执行 hadoop fs -ls recursive true --dir /xd 时,它给出了:lsr:DEPRECATED : Please use 'ls-R' instead.& lsr: '/ xd' 没有这样的文件或目录。
    • 那么我很确定 XD 单节点的日志应该会显示一些错误。如果您使用单节点运行它,那么 XD admin/container 会在同一个 jvm 中执行,因此您会看到 admin/container 的日志记录是同一个 shell。
    • 我会仔细检查 servers.yml 中的 spring.hadoop.fsUri 设置。 Yaml 格式对于正确缩进和使用空格而不是制表符非常敏感。无论如何,如果您在那里犯了错误或出现其他问题,日志应显示 hdfs sink 是否无法写入 hdfs。
    • 我看到的另一个问题是在默认的 hdfs 接收器上尝试写入 /xd/。如果 sink 没有创建这个目录的权限,那么你可以使用 --directory 配置选项来改变它。
    • 嘿 Janne,我检查了日志并遇到错误 MessageDeliveryException 说 Dispatcher 没有订阅者。对此有任何建议。我正在努力解决它。
    【解决方案2】:

    您必须发布到您的 XD 机器,而不是您的 Hadoop HDFS 机器。

    XD HTTP 接收器将获取 POST 并将其路由到 HDFS。

    确保您的节点已为您的 Hadoop 设置,并且您的 shell 也是如此。

    如果您使用的是 Pivotal PHD 2.0,例如:

    xd-singlenode --hadoopDistro phd20
    
    xd-shell --hadoopDistro phd20
    
    xd:> had config fs --namenode hdfs://MyPivotalHDServer:8020
    

    查看 Spring-XD 的 Github 文档以获取最新信息并获取最新的 Spring XD,它会不断变得更好。 https://github.com/spring-projects/spring-xd/wiki/Sources#http

    使用 XD shell 在服务器中创建流定义

    xd:> stream create --name httptest --definition "http | hdfs" --deploy
    

    在默认端口 9000 上将一些数据发布到 http 服务器

    xd:> http post --target http://localhost:9000 --data "hello world to hadoop from springxd"
    

    这个 youtube 视频将向您展示一个示例:http://youtu.be/41sIhawjHE0?t=37m6s

    您必须发布几次,这取决于您的文件何时足够满以滚动到新块,或者您需要停止流以检查文件。

    首先将内容发送到日志,以便您可以在 XD 输出日志中看到它。适合调试。

    【讨论】:

    • 确保创建主 /xd 目录并为其提供适当的权限,通常为 777 以进行测试,以确保一切正常,并从常规 HDFS 和从 XD 命令到 HDFS 进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多