java.io.IOException: Không thể định vị null \ bin \ winutils.exe có thể thực thi trong tệp nhị phân Hadoop. spark Eclipse trên windows 7


91

Tôi không thể chạy một sparkcông việc đơn giản trong Scala IDE(Maven spark project) được cài đặt trênWindows 7

Phụ thuộc lõi Spark đã được thêm vào.

val conf = new SparkConf().setAppName("DemoDF").setMaster("local")
val sc = new SparkContext(conf)
val logData = sc.textFile("File.txt")
logData.count()

Lỗi:

16/02/26 18:29:33 INFO SparkContext: Created broadcast 0 from textFile at FrameDemo.scala:13
16/02/26 18:29:34 ERROR Shell: Failed to locate the winutils binary in the hadoop binary path
java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
    at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:278)
    at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:300)
    at org.apache.hadoop.util.Shell.<clinit>(Shell.java:293)
    at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:76)
    at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:362)
    at <br>org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$33.apply(SparkContext.scala:1015)
    at org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$33.apply(SparkContext.scala:1015)
    at <br>org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:176)
    at <br>org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:176)<br>
    at scala.Option.map(Option.scala:145)<br>
    at org.apache.spark.rdd.HadoopRDD.getJobConf(HadoopRDD.scala:176)<br>
    at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:195)<br>
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)<br>
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)<br>
    at scala.Option.getOrElse(Option.scala:120)<br>
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:237)<br>
    at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)<br>
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)<br>
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)<br>
    at scala.Option.getOrElse(Option.scala:120)<br>
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:237)<br>
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:1929)<br>
    at org.apache.spark.rdd.RDD.count(RDD.scala:1143)<br>
    at com.org.SparkDF.FrameDemo$.main(FrameDemo.scala:14)<br>
    at com.org.SparkDF.FrameDemo.main(FrameDemo.scala)<br>

Câu trả lời:


137

Đây là một lời giải thích tốt về vấn đề của bạn với giải pháp.

  1. Tải xuống winutils.exe từ http://public-repo-1.hortonworks.com/hdp-win-alpha/winutils.exe .
  2. Đặt biến môi trường HADOOP_HOME của bạn ở cấp hệ điều hành hoặc theo chương trình:

    System.setProperty ("hadoop.home.dir", "đường dẫn đầy đủ đến thư mục có winutils");

  3. Thưởng thức


14
Tôi phải đặt HADOOP_HOME thành thư mục hadoop thay vì thư mục bin.
Stanley,

4
Ngoài ra, hãy nhớ tải xuống đúng winutils.exe dựa trên phiên bản hadoop mà spark được biên dịch (vì vậy, không nhất thiết phải liên kết ở trên). Nếu không, đang chờ đợi đau :)
NP3

System.setProperty ("hadoop.home.dir", "C: \\ hadoop-2.7.1 \\")
Shyam Gupta

1
có chính xác như @Stanley nói. đã làm việc với việc thiết lập HADOOP_HOME thành thư mục hadoop thay vì thư mục bin.
Jazz

@ NP3 và làm thế nào bạn biết phiên bản đó? Tôi đang sử dụng pyspark mới nhất. Cảm ơn,
JDPeckham

64
  1. Tải xuống winutils.exe
  2. Tạo thư mục, nói C:\winutils\bin
  3. Sao chép winutils.exebên trongC:\winutils\bin
  4. Đặt biến môi trường HADOOP_HOMEthànhC:\winutils

Ngoài ra, nếu bạn có một dòng cmd đang mở, hãy khởi động lại nó để các biến có hiệu lực.
eych

25

Làm theo điều này:

  1. Tạo một binthư mục trong bất kỳ thư mục nào (sẽ được sử dụng trong bước 3).

  2. Tải xuống winutils.exe và đặt nó vào thư mục bin.

  3. Bây giờ hãy thêm System.setProperty("hadoop.home.dir", "PATH/TO/THE/DIR");mã của bạn.


2
Cảm ơn rất nhiều, chỉ là những gì tôi đang tìm kiếm
user373201

3
Cần lưu ý rằng đường dẫn được trỏ không được bao gồm thư mục 'bin'. Ví dụ: Nếu đường dẫn mà winutils.exe là "D: //Hadoop//bin//winutils.exe", thì đường dẫn cho hadoop.home.dir phải là "D: // Hadoop"
Keshav Pradeep Ramanath

4

nếu chúng tôi thấy vấn đề dưới đây

LỖI Shell: Không xác định được tệp nhị phân winutils trong đường dẫn nhị phân hadoop

java.io.IOException: Không thể định vị null \ bin \ winutils.exe có thể thực thi trong tệp nhị phân Hadoop.

sau đó làm các bước sau

  1. tải xuống winutils.exe từ http://public-repo-1.hortonworks.com/hdp- win-alpha / winutils.exe.
  2. và giữ nó trong thư mục bin của bất kỳ thư mục nào bạn đã tạo. ví dụ C: \ Hadoop \ bin
  3. và trong chương trình thêm dòng sau trước khi tạo SparkContext hoặc SparkConf System.setProperty ("hadoop.home.dir", "C: \ Hadoop");

4
1) Download winutils.exe from https://github.com/steveloughran/winutils 
2) Create a directory In windows "C:\winutils\bin
3) Copy the winutils.exe inside the above bib folder .
4) Set the environmental property in the code 
  System.setProperty("hadoop.home.dir", "file:///C:/winutils/");
5) Create a folder "file:///C:/temp" and give 777 permissions.
6) Add config property in spark Session ".config("spark.sql.warehouse.dir", "file:///C:/temp")"

3

Trên Windows 10 - bạn nên thêm hai đối số khác nhau.

(1) Thêm biến và giá trị mới dưới dạng - HADOOP_HOME và đường dẫn (tức là c: \ Hadoop) trong Biến hệ thống.

(2) Thêm / nối mục nhập mới vào biến "Đường dẫn" là "C: \ Hadoop \ bin".

Ở trên làm việc cho tôi.


2

Tôi gặp vấn đề tương tự khi chạy thử nghiệm đơn vị. Tôi đã tìm thấy giải pháp thay thế này:

Cách giải quyết sau cho phép loại bỏ thông báo này:

    File workaround = new File(".");
    System.getProperties().put("hadoop.home.dir", workaround.getAbsolutePath());
    new File("./bin").mkdirs();
    new File("./bin/winutils.exe").createNewFile();

từ: https://issues.cloudera.org/browse/DISTRO-544


2

Ngoài ra, bạn có thể tải xuống winutils.exetừ GITHub:

https://github.com/steveloughran/winutils/tree/master/hadoop-2.7.1/bin

thay thế hadoop-2.7.1bằng phiên bản bạn muốn và đặt tệp vàoD:\hadoop\bin

Nếu bạn không có quyền truy cập vào cài đặt biến môi trường trên máy của mình, chỉ cần thêm dòng dưới đây vào mã của bạn:

System.setProperty("hadoop.home.dir", "D:\\hadoop");

1

Việc đặt biến môi trường Hadoop_Home trong thuộc tính hệ thống không phù hợp với tôi. Nhưng điều này đã làm:

  • Đặt Hadoop_Home trong tab môi trường Eclipse Run Configurations.
  • Thực hiện theo 'Thiết lập Môi trường Windows' từ đây

0

Ngoài việc đề cập đến biến môi trường của bạn cho HADOOP_HOMEtrong windows as C:\winutils, bạn cũng cần đảm bảo rằng bạn là quản trị viên của máy. Nếu không và việc thêm các biến môi trường sẽ nhắc bạn nhập thông tin đăng nhập quản trị viên (ngay cả dưới USERcác biến) thì các biến này sẽ có thể áp dụng khi bạn bắt đầu dấu nhắc lệnh của mình với tư cách là quản trị viên.


0

Tôi cũng gặp phải vấn đề tương tự với các chi tiết sau Java 1.8.0_121, Spark spark-1.6.1-bin-hadoop2.6, Windows 10 và Eclipse Oxygen. Khi tôi chạy WordCount.java của mình trong Eclipse bằng cách sử dụng HADOOP_HOME làm biến hệ thống như đã đề cập trong bài trước, nó không hoạt động, những gì hiệu quả với tôi là -

System.setProperty ("hadoop.home.dir", "PATH / TO / THE / DIR");

PATH / TO / THE / DIR / bin = winutils.exe cho dù bạn chạy trong Eclipse như một ứng dụng Java hay bằng cách sử dụng spark-submit từ cmd

spark-submit --class groupid.artifactid.classname --master local [2] / đường dẫn đến tệp jar được tạo bằng maven / đường dẫn đến tệp thử nghiệm demo / đường dẫn đến lệnh thư mục đầu ra

Ví dụ: Đi tới vị trí thùng rác của Spark / home / location / bin và thực hiện spark-submit như đã đề cập,

D: \ BigData \ spark-2.3.0-bin-hadoop2.7 \ bin> spark-submit --class com.bigdata.abdus.sparkdemo.WordCount --master local [1] D: \ BigData \ spark-quickstart \ target \ spark-quickstart-0.0.1-SNAPSHOT.jar D: \ BigData \ spark-quickstart \ wordcount.txt


0

Đó là một điều khó khăn ... Thư lưu trữ của bạn phải có chú thích. Ví dụ " C : \ ..."

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.